http://www.iranphp.net
1php
عنوان مقاله : الگوی یکتا و بکارگیری آن در 5نگارنده
: آرش میکائیلیarash@iranphp.net
تاریخ نگارش
: آدرس پست الکترونیک: ............http://www.iranphp.net
2licensed under the Creative Commons
تمام مطالب این نوشته تحت مجوز (disclaimer) : گواهی رد ادعامنتشر می شود، برای دریافت نسخه ای از این مجوز می توانید به آدرس زیر مراجعه کنید
: Attribution Licensehttp://creativecommons.org/licenses/by/2.0/
و همچنین بعضی از نکات و روشهای نوشتن یه کد خوب
اشاره خواهد شد
آشنا باشند
تست شده است
PHP و نحوه بکار گیری آن در 5 (Singleton Pattern) در این مقاله به شرح الگوی یکتا.مخاطبین این مقاله برنامه نویسانی هستند که مایلند از تکنیکهای برنامه نویسی شی گرا در کارهاشون استفاده کنند و البته نیاز دارن که با. PHP در 5 OOP مبانی. FC و سیستم عامل 4 PHP 5.5-MySQL 4.1.14-Apache تمام کدهای این مقاله بر روی 2.0.54الگوی یکتا چیست ؟
می دم تا با ایده اصلی کمی آشنا بشین
روشی برای برنامه نویساست تا از دوباره کاری ها اجتناب بشه و از دانش و مهارت افراد دیگه توی مسائلی که به صورت معمول پیش
Design Patterns پیش از اینکه به توضیح در مورد این الگوی خاص بپردازم ،توضیح مختصری راجع بهDesign Patternsمی آد و یا شبیه به هم هستند استفاده کنن و همچنین دانش و مهارت خودشون را با بقیه سهیم بشن
.هر الگو دستورالعمل انجام کار خاصیه بصورتی که موثر بودن آن به اثبات رسیده
.الگوی یکتا
:از یک کلاس در کل اسکریپت داشته باشیم و این معمولا وقتی پیش می آد که شی مورد نظر یه
را بین اجزا مختلف برنامه به اشتراک بذارن
instance در خیلی از موارد بهتره که ما فقط یک.مثلا (instance) منحصر به فرد را در سیستم مشخص می کنن و یا اینکه بخوان یک نمونه componentباشه که تو جاهای مختلف برنامه ازش
استفاده می کنیم
ساختن شی جدید می شه صرفه جویی می کنیم
DB از کلاس (instance) وقتی که ما از دیتابیس تو برناممون استفاده می کنیم دیتابیس می تونه یه نمونه. به عبارت دیگه با استفاده از این الگو می تونیم از تولید اشیاء تکراری جلوگیری کنیم و در نتیجه در استفاده از حافظه و زمانی که برای.کلاسهایی که می خوایم در قالب این الگو باشند با ید شرایط زیر را داشته باشن
:هیچ راهی برای تولید نمونه دیگری از شئ مورد نظر نباید وجود داشته باشد
.تا زمانی که نیاز نیست نباید ساخته شود
.پیدا کردنش نیز باید راحت باشه
.توضیح مفصل این موارد خیلی طول می کشه و خسته کننده می شه در نتیجه فقط به
برسونم
ذکر عناوین بسنده می کنم و پیاده سازی یه مثال سعی می کنم منظورم را.PHP
پیاده سازی الگوی یکتا در: 5خوب با توجه به سه موردی که در بالا به اونا اشاره کردم ما باید مطم
کنیم اینجوری فقط یکی از متدهای خود کلاس می تونه نمونه جدید
ئن بشیم که راهی برای تولید شئ خارج از مداری که ما می خوایم وجود نداره پس ساختنprivate گرفتن)را ممنوع می کنم ؟! فقط کافیه که تابع سازنده را instance)بسازه
.private
function __construct($dbHost,$dbUser,$dbPass,$dbName) {//do something
}
و با دسترسی
بهتریت راه حله
static پس به یه متد نیاز داریم که بدون اینکه نیاز باشه نمونه ای از کلاس ساخته بشه اون را اجرا کنیم؟! برای این کار استفاده از یه متود. publichttp://www.iranphp.net
3static function
getInstance(){//create new instance in first call
if
(self::$instance==null) {new class
}
();return
}
self::$instance;حالا فقط مونده که بتونیم جلوی تولید چند شی با استفاده از این متود را بگیریم به عبارت دیگه هروقت که این متود صدا می شه باید بتونه تشخیص بده که آیا
قبلا صدا شده یا نه
استفاده می کنیم تا بتونیم همیشه مقدارش را چک کنیم و در عین حال امکان ت
مقدار هم خار
! اگه دفعه اول بود یه شی جدید بسازه و اگه قبلا ساخته بود بجای اینکه دوباره یه نمونه بسازه همون قبلی را برگردونه .برای این کار هم از یهغییر این private با دسترسی (property) static ویژگیج از کلاس وجود نداشته باشه.static
private $instance=null;حله
. private با دسترسی __clone() شدن شی را هم بگیریم که اونم از طریق تعریف متود clone حالا فقط می مونه که جلویprivate
{
}
function __clone()یک مثال واقعی از الگوی یکتا
:نشان داده می شود
: MySQLi در این مثال نحوه ایجاد یک شی از کلاس<?
PHP/**
* PHP version 5
*
* This source file is subject to version 2.1 of the GNU Lesser General Public
* License, that is bundled with this package in the file COPYING, available
* through the world wide web at the following URI:
* http://www.gnu.org/copyleft/lesser.html.
*
* <i>smysqli class </i> Singelton Improved Mysql<br />
* this is a very simple wrapper class that uses singleton pattern to avoid creating multiple links
* in a single application to mysql database<br />
*
* an example of how to use this class :
* <code>
* //creating DB object
* $dbObject=smysqli::getInstance('localhost','arash','arash','usersdb');
* //sending query to DB
* $dbObject->query('select * from tblUsers');
* //using object property
* echo $dbObject->affected_rows;
* </code>
* @package DataBase
* @author Arash Mikaeili <arash@iranphp.net>
* @copyright 2005 iranphp.net
* @license LGPL License 2.1 <http://www.gnu.org/copyleft/lesser.html>
* @version SVN $Id$
* @link http://www.iranphp.net
*/
class
smysqli {/**
* Private constructor to avoid <i>smysqli</i> object creation.
*
http://www.iranphp.net
4* @access private
* @param string $dbHost the mysql hostname or ip
* @param string $dbUser
* @param string $dbPass
* @param string $dbName the DataBase we want to use
* @return void
* @version SVN $Id$
*/
private
function __construct($dbHost,$dbUser,$dbPass,$dbName) {self
::$instance=new mysqli($dbHost,$dbUser,$dbPass,$dbName) ;if
(mysqli_connect_errno()) {throw
new Exception('connect failed: '.mysqli_connect_error());exit
}
}
();/**
* Private clonator to avoid <i>smysqli</i> object clonation.
*
* @access private
*/
private
{
}
function __clone()/**
* Create new mysqli object or just return the already existed one
*
* @static
* @access public
* @param string $dbHost the mysql hostname or ip
* @param string $dbUser
* @param string $dbPass
* @param string $dbName the DataBase we want to use
* @return object mysqli
* @version SVN $Id$
*/
static function
getInstance($dbHost,$dbUser,$dbPass,$dbName){//create new smysqli object in first call
if
(self::$instance==null) {new
}
smysqli($dbHost,$dbUser,$dbPass,$dbName);return
}
self::$instance;/**
* @var object mysqli
* @access private
* @static
*/
static
}
?>
private $instance=null;با توجه به توضیحاتی که در بالا دادم و حاشیه نویسی که در خود کد وجود داره دیگه نیاز
بر می گردنه
در انتها دوست دارم که چند نکته را یاد آوری کنم که شاید خیلی هم به بح
ی به شرح خط به خط کد نیست تنها کاری که این کلاس انجام می ده. mysqli اینه که یه شی یکتا از کلاسث این مقاله مربوط نباشه:استفاده کنید
اگه یه روزی خواستین این کد را بصورت بازمتن منتشر کنید محبوبیت بیشتری پیدا کنه
.این کار باعث می شه که هم خودتون بعدا راحتتر از کدی که نوشتین سر در بیارین و هم اینکه Comment تا جایی که می تونید تو کدتون از.http://www.iranphp.net
5را فراموش نکیند بطور کلی هر وقت که مش
غول برنامه نویسی هستین یا باید کد جدید بنویسید یا اینکه کدهای قبلیتون را بازسازی و بهینه Refactoringرا بصورت پارامتر بگیره اونا بصورت ثابت تو خود کلاس باشن بهتره هم باع
هم استفاده کنین، دیگه لازم
نیست کدتون را در تمام برنامه ت
ث می شه که استفاده از DB کنید .مثلا همین مثال بالا اگه بجای اینکه مشخصاتinit تنها از connect کلاس راحتتر بشه و هم اینکه اگه یه روزی خواستین تعداد این پارامترها را تغییر بدین مثلا بجایغییر بدین فقط کافیه تغییرات را در همین کلاس انجام بدین خود به خود همه جا اعمال می شه.استفاده کنید
استفاده نکنین اهمیتش را متوجه نمی شین
.حتی اگه می خواین یه کلاس کوچیک یا یه تابع بنویسید و تنها برنامه نویس هم خود شما هستین. تا SUBVERSION یا CVS حتما از.پ
.ن. در صورتی که هر گونه سوال یا بحثی در مورد مطالب با دارید می تونید اون را در قسمت انجمن سایت مطرح کنید.