You are on page 1of 11

‫الفصل الخامس عشر ‪ :‬النمط المفرد ‪Singleton Pattern‬‬ ‫‪250‬‬

‫ملحظة ‪ :‬إستخدام ‪ mysql‬عفا عليه الزمن والفضل إستخدام ‪ mysqli‬لمعالجتها‬


‫كثير من مشاكل ‪ mysql‬وأهمها الناحية المنية ‪.‬‬

‫‪<?php‬‬

‫{ ‪class mySQL‬‬

‫مصفوفة لتخزين قيم التصال بقاعد ة البيانات بها ‪//‬‬


‫;)(‪private $DB = array‬‬
‫متغير لحفظ الكائن المشأ من هذه الفئة ‪//‬‬
‫;‪private static $classObj = NULL‬‬

‫{)(‪final protected function __construct‬‬


‫اضبط قيم التصال بقاعد ة البيانات عند إستدعاء الفئة ‪//‬‬
‫اسم السرفر لقاعد ة البيانات ‪//‬‬
‫;"‪$this->DB['Host'] = "localhost‬‬
‫اسم المستخدم لقاعد ة البيانات ‪//‬‬
‫;"‪$this->DB['UserName'] = "root‬‬
‫الرقم السرى لمستخدم قاعد ة البيانات ‪//‬‬
‫;"" = ]'‪$this->DB['UserPass‬‬
‫اسم قاعد ة البيانات ‪//‬‬
‫;"‪$this->DB['Name'] = "db‬‬
‫}‬

‫جعل الدالة نهائية حتى ل يتم إستنساخ كائن جديد من الفئة ‪//‬‬
‫}{ )(‪final private function __clone‬‬

‫‪//‬‬ ‫دالة إنشاء كائن من نفس الفئة الحالية‬


251 Singleton Pattern ‫ النمط المفرد‬: ‫الفصل الخامس عشر‬

public static function getObj(){


if(!self::$classObj)
self::$classObj = new self();
return self::$classObj;
}

// ‫دالة إنشاء كائن من فئة التصال بقاعد ة البيانات‬


public function getConObj(){
echo "make mysqli object<br>";
return new mysqli($this->DB['Host'],$this->DB['UserName'],
$this->DB['UserPass'],$this->DB['Name']);
}

$obj = mySQL::getObj();
$obj2 = $obj->getConObj();
$obj3 = $obj->getConObj();
$obj4 = $obj->getConObj();
$obj5 = $obj->getConObj();
$obj6 = $obj->getConObj();
$obj7 = $obj->getConObj();
$obj8 = $obj->getConObj();
$obj9 = $obj->getConObj();
$obj10 = $obj->getConObj();
?>

‫ يجب واضع قيم التصال بقاعد ة البيانات فى بانى الفئة حتى يعمل معك الكود بشكل سليم‬-
‫الفصل الخامس عشر ‪ :‬النمط المفرد ‪Singleton Pattern‬‬ ‫‪252‬‬

‫بدون أخطاء التصال بقاعد ة البيانات ‪ ,‬فى الكود أاضع القيم الفترااضية للسرفر المحلى "ربما‬
‫تختلف من سرفر محلى لخر" ‪.‬‬
‫‪ -‬تم إنشاء الدالة )(‪ getConObj‬والتى تعود بكائن فئة التصال بقاعد ة البيانات ‪.‬‬
‫‪ -‬تم إنشاء كائن من الفئة ‪ mySQL‬من خلل الدالة )(‪getObj‬كما تقدم شرحه ‪.‬‬
‫‪ -‬تم إنشاء عده كائنات من فئة التصال بقاعد ة البيانات من خلل الدالة )(‪ , getConObj‬وتعمدت‬
‫واضع عدد كبير من الكائنات المنشأه لتلحظ الوقت الذى يمر حتى يتم إنشاء تلك الكائنات ‪.‬‬

‫سنقوم الن بتعديل الكود السابق وتطبيق مبدأ مشاركة التصال بقاعد ة البيانات وذلك من خلل‬
‫تعريف متغير لحفظ كائن التصال المنشأ كالتالى ‪:‬‬

‫‪<?php‬‬

‫{ ‪class mySQL‬‬

‫مصفوفة لتخزين قيم التصال بقاعد ة البيانات بها ‪//‬‬


‫;)(‪private $DB = array‬‬
‫متغير لحفظ الكائن المشأ من هذه الفئة ‪//‬‬
‫;‪private static $classObj = NULL‬‬
‫متغير لحفظ الكائن المنشأ من فئة التصال بقاعد ة البيانات ‪//‬‬
‫;‪private $objCon = NULL‬‬

‫{)(‪final protected function __construct‬‬


‫اضبط قيم التصال بقاعد ة البيانات عند إستدعاء الفئة ‪//‬‬
‫اسم السرفر لقاعد ة البيانات ‪//‬‬
‫;"‪$this->DB['Host'] = "localhost‬‬
‫اسم المستخدم لقاعد ة البيانات ‪//‬‬
‫;"‪$this->DB['UserName'] = "root‬‬
‫الرقم السرى لمستخدم قاعد ة البيانات ‪//‬‬
‫;"" = ]'‪$this->DB['UserPass‬‬
253 Singleton Pattern ‫ النمط المفرد‬: ‫الفصل الخامس عشر‬

// ‫اسم قاعد ة البيانات‬


$this->DB['Name'] = "db";
}

// ‫جعل الدالة نهائية حتى ل يتم إستنساخ كائن جديد من الفئة‬


final private function __clone() {}

// ‫دالة إنشاء كائن من نفس الفئة الحالية‬


public static function getObj(){
if(!self::$classObj)
self::$classObj = new self();
return self::$classObj;
}

// ‫دالة إنشاء كائن من فئة التصال بقاعد ة البيانات‬


public function getConObj(){
if(!$this->objCon){
echo "make mysqli object<br>";
$this->objCon = new mysqli($this->DB['Host'],
$this->DB['UserName'],$this->DB['UserPass'],$this->DB['Name']);
}
return $this->objCon;
}

$obj = mySQL::getObj();
$obj2 = $obj->getConObj();
Singleton Pattern ‫ النمط المفرد‬: ‫الفصل الخامس عشر‬ 254

$obj3 = $obj->getConObj();
$obj4 = $obj->getConObj();
$obj5 = $obj->getConObj();
$obj6 = $obj->getConObj();
$obj7 = $obj->getConObj();
$obj8 = $obj->getConObj();
$obj9 = $obj->getConObj();
$obj10 = $obj->getConObj();
?>

‫والن هل لحظت فرق الوقت بين هذا الكود والكود السابق‬

‫ويمكن تعديل دالة إنشاء كائن من فئة التصال بحيث يتم إنهاء الفئة وعرض أخطاء التصال‬
: ‫بقاعد ة البيانات كالتالى‬

public function getConObj(){


if(!$this->objCon){
$this->objCon = new mysqli($this->DB['Host'],
$this->DB['UserName'],$this->DB['UserPass'],$this->DB['Name']);
if($this->objCon->connect_error)
die($this->objCon->connect_error);
}
return $this->objCon;
}

‫ سنضع الن دالة لعمل إستعلم على قاعد ة البيانات وإظهار الخطاء إن وجدت فى الستعلم‬-
: ‫كالتالى‬

public function makeQuery($qu){


$temp = $this->getConObj()->query($qu);
‫‪255‬‬ ‫الفصل الخامس عشر ‪ :‬النمط المفرد ‪Singleton Pattern‬‬

‫)‪if(!$temp‬‬
‫;)‪die($this->getConObj()->error‬‬
‫;‪return $temp‬‬
‫}‬

‫‪ -‬لتصبح الفئة على الشكل التالى‪:‬‬

‫‪<?php‬‬

‫{ ‪class mySQL‬‬

‫مصفوفة لتخزين قيم التصال بقاعد ة البيانات بها ‪//‬‬


‫;)(‪private $DB = array‬‬
‫متغير لحفظ الكائن المشأ من هذه الفئة ‪//‬‬
‫;‪private static $classObj = NULL‬‬
‫متغير لحفظ الكائن المنشأ من فئة التصال بقاعد ة البيانات ‪//‬‬
‫;‪private $objCon = NULL‬‬

‫{)(‪final protected function __construct‬‬


‫اضبط قيم التصال بقاعد ة البيانات عند إستدعاء الفئة ‪//‬‬
‫اسم السرفر لقاعد ة البيانات ‪//‬‬
‫;"‪$this->DB['Host'] = "localhost‬‬
‫اسم المستخدم لقاعد ة البيانات ‪//‬‬
‫;"‪$this->DB['UserName'] = "root‬‬
‫الرقم السرى لمستخدم قاعد ة البيانات ‪//‬‬
‫;"" = ]'‪$this->DB['UserPass‬‬
‫اسم قاعد ة البيانات ‪//‬‬
‫;"‪$this->DB['Name'] = "db‬‬
‫}‬
Singleton Pattern ‫ النمط المفرد‬: ‫الفصل الخامس عشر‬ 256

// ‫جعل الدالة نهائية حتى ل يتم إستنساخ كائن جديد من الفئة‬


final private function __clone() {}

// ‫دالة إنشاء كائن من نفس الفئة الحالية‬


public static function getObj(){
if(!self::$classObj)
self::$classObj = new self();
return self::$classObj;
}

// ‫دالة إنشاء كائن من فئة التصال بقاعد ة البيانات‬


public function getConObj(){
if(!$this->objCon){
$this->objCon = new mysqli($this->DB['Host'],
$this->DB['UserName'],$this->DB['UserPass'],$this->DB['Name']);
if($this->objCon->connect_error)
die($this->objCon->connect_error);
}
return $this->objCon;
}

// ‫دالة إنشاء إستعلم على قاعد ة البيانات‬


public function makeQuery($qu){
$temp = $this->getConObj()->query($qu);
if(!$temp)
die($this->getConObj()->error);
return $temp;
}
‫‪257‬‬ ‫الفصل الخامس عشر ‪ :‬النمط المفرد ‪Singleton Pattern‬‬

‫}‬

‫‪// test‬‬
‫;)(‪$obj = mySQL::getObj‬‬
‫)‪if($obj->makeQuery("SELECT * FROM users")->num_rows > 1‬‬
‫;"‪echo "yes‬‬
‫‪else‬‬
‫;"‪echo "no‬‬

‫>?‬

‫سنتابع لعمل دالة لتسجيل الدخول تعتمد على الفئة السابقة ولشرح مبدأ والوارثة بشئ من‬
‫التطبيق سنقوم بوراثة الفئة ‪. mySQL‬‬
‫‪ -‬ولكن تعريف الدالة)(‪ __construct‬على أنها نهائية يجعلنا ل نستطيع إستخدام بانى الفئة عند‬
‫الوراثة فلهذا سنجعل الدالة __)(‪ construct‬فى الفئة ‪ mySQL‬محمية فقط ‪ ,‬لننا سنحتاج‬
‫إستخدام بانى الفئة فيما بعد ‪.‬‬
‫‪ -‬عند وراثة الفئة ‪ mySQL‬وإنشاء كائن منها وإنشاء كائن أخر من الفئة الوارثة للفئة ‪ mySQL‬فإذا‬
‫تم مناداه دالة التصال بقاعد ة البيانات من الكائنين سيتم عمل إتصالين ولهذا نقوم بتعريف‬
‫المتغير‪ $objCon‬على أنه ساكن لفتح إتصال واحد لى كائن منشأ من الفئة ‪ mySQL‬أو أحد‬
‫الفئات التى ترثها ‪ ,‬ويمكنكم ملحظة هذا بواضع جملة طباعة فى دالة التصال بقاعد ة البيانات‬
‫لمعرفة عدد التصال التى يتم فتحها كما فعلنا فى الكواد السابقة ‪.‬‬

‫‪ -‬الن تصبح الفئة ‪ mySQL‬كالتالى ‪:‬‬

‫‪<?php‬‬

‫{ ‪class mySQL‬‬
‫الفصل الخامس عشر ‪ :‬النمط المفرد ‪Singleton Pattern‬‬ ‫‪258‬‬

‫مصفوفة لتخزين قيم التصال بقاعد ة البيانات بها ‪//‬‬


‫;)(‪private $DB = array‬‬
‫متغير لحفظ الكائن المشأ من هذه الفئة ‪//‬‬
‫;‪private static $classObj = NULL‬‬
‫متغير لحفظ الكائن المنشأ من فئة التصال بقاعد ة البيانات ‪//‬‬
‫;‪private static $objCon = NULL‬‬

‫{)(‪protected function __construct‬‬


‫اضبط قيم التصال بقاعد ة البيانات عند إستدعاء الفئة ‪//‬‬
‫اسم السرفر لقاعد ة البيانات ‪//‬‬
‫;"‪$this->DB['Host'] = "localhost‬‬
‫اسم المستخدم لقاعد ة البيانات ‪//‬‬
‫;"‪$this->DB['UserName'] = "root‬‬
‫الرقم السرى لمستخدم قاعد ة البيانات ‪//‬‬
‫;"" = ]'‪$this->DB['UserPass‬‬
‫اسم قاعد ة البيانات ‪//‬‬
‫;"‪$this->DB['Name'] = "db‬‬
‫}‬

‫جعل الدالة نهائية حتى ل يتم إستنساخ كائن جديد من الفئة ‪//‬‬
‫}{ )(‪final private function __clone‬‬

‫دالة إنشاء كائن من نفس الفئة الحالية ‪//‬‬


‫{)(‪public static function getObj‬‬
‫)‪if(!self::$classObj‬‬
‫;)(‪self::$classObj = new self‬‬
‫;‪return self::$classObj‬‬
‫}‬
259 Singleton Pattern ‫ النمط المفرد‬: ‫الفصل الخامس عشر‬

// ‫دالة إنشاء كائن من فئة التصال بقاعد ة البيانات‬


public function getConObj(){
if(!self::$objCon){
self::$objCon = new mysqli($this->DB['Host'],
$this->DB['UserName'],$this->DB['UserPass'],$this->DB['Name']);
if(self::$objCon->connect_error)
die(self::$objCon->connect_error);
}
return self::$objCon;
}

// ‫دالة إنشاء إستعلم على قاعد ة البيانات‬


public function makeQuery($qu){
$temp = $this->getConObj()->query($qu);
if(!$temp)
die($this->getConObj()->error);
return $temp;
}

?>

: mySQL ‫ ترث الفئة‬myLogin ‫والن سنقوم بعمل فئة جديد باسم‬

<?php
include_once(__DIR__ .'\mySQL.php');
class myLogin extends mySQL{
‫الفصل الخامس عشر ‪ :‬النمط المفرد ‪Singleton Pattern‬‬ ‫‪260‬‬

‫{)(‪protected function __construct‬‬


‫;)(‪parent::__construct‬‬
‫}‬
‫}‬
‫>?‬

‫تم تضمين الفئة ‪ mySQL‬فى بداية الملف ‪ ,‬وإن أردت أن تعرف ما هو الثابت __‪ __DIR‬وأخواته‬
‫أدخل على هذا الرابط ‪.‬‬
‫الفئة ‪ myLogin‬قامت بوراثة الفئة ‪. mySQL‬‬
‫قمنا بإنشاء بانى الفئة وإستدعينا بداخلة بانى الفئة للفئة الب ‪. mySQL‬‬

‫والن نريد عمل نمط مفرد لنشاء كائن من الفئة ‪ myLogin‬ولكن ل يعقل عند كل وراثة عمل دالة‬
‫مختلفة لعمل ذلك ولهذا وجد ما يعرف بالتحميل الزائد للدول أى سيتم تعريف الدالة بنفس‬
‫التعريف و نفس السم ونفس الوسائط ‪ ,‬وأيضًا بما أن المتغير‪ $classObj‬خاص داخل الفئة‬
‫‪ mySQL‬سنقوم بتعريفة أيضًا بنفس السم مره أخرى فى الفئة ‪. myLogin‬و تصبح الفئة على‬
‫النحو التالى ‪:‬‬

‫‪<?php‬‬
‫;)'‪include_once(__DIR__ .'\mySQL.php‬‬

‫{‪class myLogin extends mySQL‬‬

‫;‪private static $classObj = NULL‬‬

‫{)(‪protected function __construct‬‬


‫;)(‪parent::__construct‬‬
‫}‬

‫{)(‪public static function getObj‬‬

You might also like