PDA

View Full Version : حرفه ای: ساخت یک orm در PHP



Mr.Moghadam
چهارشنبه 18 خرداد 1390, 12:11 عصر
سلام دوستان

توی اینترنت در مورد ساخت یک ORM خیلی سرچ کردم اما همش آموزش orm های doctrine , phpactiverecord , propel و . . . بود و کسی نحوه ساختش رو توی پی اچ پی آموزش نداده بود.

ممنون میشم منبعی یا آموزشی در این زمینه ارائه بدین .

masato
شنبه 21 مرداد 1391, 23:49 عصر
با سلام به تمامی دوستان
کسی از دوستان اگه اطلاعاتی درباره تاپیک بالا داره خواهشا یه راهنمایی کنه
پیشایش تشکر

farhadfery
یک شنبه 22 مرداد 1391, 12:44 عصر
راستش من هم هنوز کار نکردم. تو برنامه ام هست. اما doctrine2 . اینرا کار کنید.

shahriyar3
یک شنبه 22 مرداد 1391, 18:56 عصر
کار ساده ای نسیت نه توضیحش نه نوشتنش http://techportal.inviqa.com/2010/01/11/learning-php-5-3-by-writing-your-own-orm/

pejman_view
یک شنبه 22 مرداد 1391, 21:45 عصر
سلام

بعضی اوقات بهتر است خودمان را از دنیای اصطلاحات برنامه نویسی بکشیم بیرون و ببینیم واقعاً در واقعیت چه کارهایی داریم انجام می دهیم.
تا حالا شده شما تابعی بنویسید فرضاً getNewsByCategory ($category, $count); که مثلاً دسته بندی و تعداد ستون را دریافت کند و به شما تعداد معلومی را که خود معلوم می کنید بر می گرداند.
خوب واقعیت این تابع یک برنامه نویسی و نوشتن لایه ORM است چون این تابع لایه ای را طراحی کرده که دیتابیس و برنامه نویسی را به شیوه ایی مطمئن بهم مرتبط کرده است.

امیدوارم منظورم را رسانده باشم.
با آرزوی موفقیت

masato
یک شنبه 22 مرداد 1391, 22:09 عصر
خیلی ممنون که توجه کردید:قلب:
میشه یه مثال عملی بزنید؟یا یه نمونه کد قرار بدید؟
بازم تشکر

pejman_view
یک شنبه 22 مرداد 1391, 23:01 عصر
سلام

نگاه کنید مثلاً من برای لایه دیتابیس خودم همیشه از کد زیر استفاده می کنم که فقط دسترسی مرا به تابع های مورد نیازم در mysql راحت تر می کند این مثال را خواندید در پایین یکم بسطش خواهم داد.

<?php

class mysqlDb{
private $dbc;
private $magic_quotes_active;
private $real_escape_string;
public $last_query;

function __construct() {
$this->open_connection();
$this->magic_quotes_active = get_magic_quotes_gpc();
$this->real_escape_string = function_exists('mysqli_real_escape_string');
}

private function open_connection(){
$this->dbc = mysqli_connect(DB_HOST,DB_USERNAME,DB_PASSWORD,DB_ NAME) or die('You have an error in database'.mysqli_error());
//mysqli_select_db(DB_NAME);
}

public function close_connection(){
if (isset($this->dbc)){
mysqli_close($this->dbc);
mysqli_free_result($this->dbc);
}
}

public function query($q){
$this->last_query = $q;
$r = mysqli_query($this->dbc,$q);
$this->confirm_query($r);
return $r;
}

public function confirm_query($r){
if (!$r){
$output = "Your Last query is ".$this->last_query."<br />";
$output .= "mysqli faced error :" .mysqli_error($this->dbc);
die($output);
}
}

function mysqli_escape_string($value){
if ($this->real_escape_string){
if($this->magic_quotes_active){$value= stripslashes($value);}
$value = mysqli_real_escape_string($this->dbc,$value);
}else{
if(!$this->magic_quotes_active){$value= addslashes($value);}
}
return $value;
}
//**unneccessary function for mysqli to improve class**//
function fetch_array($r){
return mysqli_fetch_array($r);
}
function fetch_assoc($r){
return mysqli_fetch_assoc($r);
}
function fetch_row($r){
return mysqli_fetch_row($r);
}

function num_rows($r){
return mysqli_num_rows($r);
}

function affected_rows(){
return mysqli_affected_rows($this->dbc);
}

function insert_id(){
return mysqli_insert_id($this->dbc);
}


}

$database = new mysqlDb();
$db =& $database;
?>

حالا فرضاً برای اینکه برای پروژه خودم که یک cms خبری می خواهم گسترشش بدهم.

بنابراین متدهای زیر را هم به کد اضافه می کنم همان چیزی که در پست های قبلی خودم مثال زدم را اینجا خواهم نوشت:

function getNewsTitleByCategory ($category, $count){
$r = $this->query("SELECT * FROM news WHERE category='$category' LIMIT $count");
$data = array();
while ($row = $this->fetch_assoc($r)){
$data[] = $row['title'];
}
return $data;
حالا کارهای دیتابیس همه انجام شده و فقط برنامه نویس با فراخوانی تابع تمام کارهای مورد نیاز خود را انجام دهد بدون اینکه حتی یک کوئری هم بنویسد.

$row = $db->getNewsTitleByCategory ('financial', 50);
foreach ($row as $title){
echo $title;
}
در مثال بالا دیدید که من در برنامه نویسی خودم حتی یک خط اتصال به دیتابیس یا کوئری ننوشتم و فقط با فراخوانی یک تابع تمامی کارها انجام می شود و در عوض آرایه ایی با مقادیر مورد نیاز دریافت می کنید.
(البته توجه داشته باشید تابع بالا را برای مثال نوشتم ممکن است در واقعیت بیشتر گسترش یابد و این کد نهایی نباشد اما چیزی با کد واقعی تفاوت ندارد.)

با آرزوی موفقیت

masato
یک شنبه 22 مرداد 1391, 23:14 عصر
دیدم فقط زدن تشکر یه خورده کم لطفیه
خیلی ممنون .دوست دارم بعدا بیشتر درباره این موضوع بحث کنیم(اگه موافق باشید)چون الان یه خورده :گیج:، اگه بقیه دوستانم همراهی کنند که عالی میشه
بازم تشکر

farhadfery
دوشنبه 23 مرداد 1391, 00:06 صبح
نگاه کنید مثلاً من برای لایه دیتابیس خودم همیشه از کد زیر استفاده می کنم که فقط دسترسی مرا به تابع های مورد نیازم در mysql راحت تر می کند این مثال را خواندید در پایین یکم بسطش خواهم داد.
می شه بگید ارتباط این کلاس با orm چی بود؟