من با توجه به اینكه منبع های آموزش PHP به صورت پیشرفته، البته فارسی کم است، تصمیم گرفتم که یکی پیشرفته ترین مباحث PHP یعنی شیء گرایی را آمورش دهم. از شما و مدیر فاروم هم انتظار همکاری دارم. این جلسه فقط تئوری است و در جلسه ی بعد به کار عملی می پردازیم. كلاسها (Classes) یك كلاس تعریف یا نمای یك نوع خاص داده است و كلاسها به عنوان روشی برای حالت دادن به تمام انواع متفاوت اشیاء و سیستم شما عمل میكنند . هنگامی كه میخواهیم یك شیء جدید را تعریف كنیم ، ابتدا از كلمه كلیدی class برای تعریف آن ، پیش از استفاده از آن در اسكریپتهای PHP خود استفاده میكنیم . تفاوت واضح یك كلاس و یك شیء این است كه كلاسها اشیایی را تعریف میكنند كه در برنامههایمان به كار میبریم . پیش از آن كه درباره روش ساخت یك كلاس صحبت كنیم ، میخواهیم شروع به تأمل كنید كه یك كلاس نمایشی از یك ایده است . مهم است كه هنگامی كه كلاسهای خودتان را طراحی میكنید . آنها یك هدف را دنبال كنند و تمامی رفتاری را كه از آن ایده انتظار میرفت را فراهم كنند . یك كلاس در PHP حاوی سه كامپوننت اصلی است : members (اعضاء) كه به آنها به عنوان داده یا صفت اشاره میشود) متدها ، و Consructor یك عضو members تكهای از داده است كه شیء در بر دارد . اشیاء میتوانند هر تعداد عضو داشته باشند . برای مثال ، اگر قرار باشد اتومبیل را با استفاده از یك كلاس طراحی كنیم ، یك چرخ در حال دوران یا گیربكس باید به عنوان یك عضو از ماشین تعریف شوند . متدها سرویسهایی هستند كه شیء برای سرویس گیرندههایش فراهم میكند كه از اعضا داخلی آن استفاده میكنند و آنها را دستكاری میكنند . برای مثال ، اگر قرار باشد اتومبیل را با استفاده از یك كلاس طراحی كنیم ، یك چرخ در حال دوران یا گیربكس باید به عنوان یك عضو از ماشین تعریف شوند . متدها سرویسهایی هستند كه شیء برای سرویس گیرندههایش فراهم میكند كه از اعضا داخلی آن استفاده میكنند و آنها را دستكاری میكنند . برای مثال ، یك كلاس car میتواند یك متد را برای روشن كردن وسیله نقله و استفاده از چرخ در حال دوران در داخل آن فراهم كند . یك Constructor متد خاصی است كه شیء را درون وضعیت آماده آن معرفی می:ند . تنها یك Constructor برای یك شیء در PHP میتواند موجود باشد . در یك كلاس car ، افزودن بدنه ، موتور ، لاستیكها ، گیربكس ، صندلی و غیره بر روی car با هم متفاوتند . هنگامی كه سرویس گیرندهها میخواهند از متدهای روی یك شیء استفاده كنند ، Constructor اطمینان میدهد كه هر متد عملیات را با موفقیت به انجام خواهد رساند و نتیجه مورد انتظار را برخواهد گرداند . برای مثال ، برای روشن كردن رادیو درون اتومبیل شما ، باید یك رادیو نصب شده باشد . در این نمونه ، Constructor مسئول اطمینان بخشیدن از این موضوع است كه رادیو پیش از استفاده نصب شده است. به غیر از مقدار دهی شیء به یك وضعیت آماده معتبر ، تفاوت اساسی دیگر این است كه یك Constructor هیچ مقدار برگشتی صریحی ندارد . تمامی Constructor ها یك متغیر جدیداً اختصاص یافته را برای استفاده در برنامه شما بر میگردانند . در نتیجه ، برگرداندن یك مقدار در Constructor كلاس ، غیرقانونی است . درباره استفاده از اشیاء در برنامههای شما ، در بخش بعدی بیشتر صحبت خواهیم كرد . اطمینان یافتن از طراحی مناسب اشیاء و Constructor های آنها ، مسئلهای است كه توسعه دهندگان زیادی اغلب با آن روبرو میشوند . هنگامی كه كلاس برنامهنویسان را وادار میكند كه اعضای شیء را پیش از استفاده از متدهای خود تنظیم كنند یا هنگامی كه كلاس برنامهنویس را وادار میكند تا از ترتیب خاصی ، هنگام فراخوانی متدهای شیء پیروی كند ، كد گیج كننده و مبهمی را ایجاد میكند . از OPP به این منظور استفاده میكنیم كه به طور كلی از بروز چنین مسئلهای جلوگیری كنیم . اگر كلاس مهندسی شده است تا از Constructor های خود برای معرفی بخشهای كلیدی كلاس استفاده نكند ، اشكال از طراحی ضعیف ناشی میگردد . دوباره در همان تله گرفتار نشوید . كلاسی كه خوب طراحی شده باشد برنامهنویسی ، اشكالزدایی و نگهداری زیادی را حذف میكند . بیایید نگاهی به دستور زبان كلی برای Class در PHP بیندازیم ، كه استفاده از این سه نوع كامپوننت را نشان میدهد : PHP Code: class ,ClassName ,[extends , ,ParentclassName] { , , , , , , , ,var ,$member1; , , , , , , , , ,var ,$member2; , , , , , , , , , , , , , , , ,… , , , , , , , ,var ,$memberN; , , , , , , , ,// , ,Constructor , , , , , , , ,function , ,Class ,Name() , , , , , , , ,{ , , , , , , , ,} , , , , , , , ,function , ,method1() , , , , , , , ,{ , , , , , , , ,} … , , , , , , , ,function , ,method2() , , , , , , , ,{ , , , , , , , ,} , , , , , , , ,function , ,methodN() , , , , , , , ,{ , , , , , , , ,} , } , همانگونه كه میبینید ، یك كلاس چیزی نیست جز یك مجموعه از اعضای تعریف شده (متغیرها) و متدها (توابع) . اعضا میتوانند یا انواع داده اولیه نظیر integer ها و رشتهها یا انواع پیچیدهتری نظیر آرایهها یا اشیاء دیگر باشند . از آنجایی كه PHP از شما انتظار ندارد كه انواع را تعریف كنید ، فقط میتوانید متغیرهایتان را در بالای كلاس ، به صورتی كه در بالا نشان داده شد ، نام ببرید . با PHP میتوانید متغیرهایی را در تابع خود ایجاد كنید ؛ آنها به همان خوبی كه مورد انتظارتان است كا رخواهند كرد . اگرچه ، تمرین خوبی نخواهد بود اگر این كار را انجام دهید . این به آن خاطر است كه وقتی برنامهنویسان دیگر به كلاس شما نگاه میكنند ، فوراً تمامی اعضای آن را پیش از نگاه كردن به پیادهسازی توابع بشناسند . متدها به سادگی تمام سرویسهایی هستند كه این كلاس تضمین میكند تا برای سرویس گیرندههایش فراهم كند . سرویس گیرندهها میتوانند برنامههای دیگر ، پروژههای دیگر و غیره باشند.
آموزش برنامه نويسي شيء گرا با PHP - قسمت اول و دوم و سوم قسمته دوم. در این قسمت به ساخت یک کلاس بسیار ساده می پردازیم همچنین بیشتر در مورد شیء ها صحبت خواهیم کرد. بیایید كد یك كلاس Car را ایجاد كنیم . در این مثال شروع به تعریف كلاس خود میكنیم . این كار را با استفاده از كلمه كلیدی Class در خط دوم میكنیم . تمرین مهندسی نرمافزار خوبی است تا حرف اول تمامی نامهای كلاسها را برای تشخیص آنها از متغیرها یا توابع با حروف بزرگ بنویسیم . برنامهنویسان این كار را برای سالها در زبانهای گوناگون دیگر انجام دادهاند . شناسایی Constructor در میان متدهای متنوع دیگر در كلاس ساده است . همچنین عادت خوبی است كه نام فایلهایتان را با نام كلاس نامگذاری كنید . نظیر Car.php یك فایل تنها باید شامل یك كلاس باشد . اگر چند كلاس دارید كه به یكدیگر مرتبط هستند ، نظیر مجموعه كلاسهای انواع داده اصلی ، باید آنها را درون یك زیرادایركتوری تحت برنامه كاربردی اصلی خود قرار دهید . اگر روی یك پروژه عظیم كار میكنید ، این تمرین ضروری است . با بزرگتر شدن سیستمها ، ضروری خواهد بود كه از یك ساختار دایركتوری درخت مانند ، برای نگهداری تمامی كلاسهایی كه در برنامه كاربردی وب شما بكار میروند ، استفاده كنید . شما باید از include_once() یا require_once() برای اضافه كردن كلاسها به فایلهای سورس خود در هنگام نیاز به آنها استفاده كنید . PHP Code: <? ,Php // ,Car.php class ,Car , { در یك مدل بینهایت ساده از یك اتومبیل ، كلاس شامل موتور و نمایش كلیدی برای روشن كردن اتومبیل است . یك اتومبیل واقعی باید یك بدنه ، یك پدال گاز و یك ترمز و یك چرخ ، گیربكس و غیره داشته باشد ، اما این تنها برای نمایش است : PHP Code: var ,$engine ,; var ,$requiredkey; , اتومبیل ما همچنین یك constructor دارد كه موتور آن را تنظیم میكند و كلیدی دارد كه اتومبیل را روشن میكند . اگر این عناصر اتومبیل را شناسایی نمیكردیم ، هر فراخوانی start() و stop() از كار میایستاد و خطاهایی را بر میگرداند . چنانكه قبلاً ذكر كردیم ، وظیفه constructor شناسایی تمامی عناصر شیء ، جهت كسب اطمینان از امكان استفاده از تمامی سرویسها در هنگام نیاز است . توجه داشتهباشید كه اگر میخواهید به یك عضو كلاس رجوع كنید ، باید یك كلمه كلیدی $this-> را در ابتدای نام عضو قرار دهید . این ارتباط از جاوا یا C++ متفاوت است كه در آنها اختیاری است . این بدلیل كارایی ضعیف PHP ، سه سطح namespace وجود دارند كه متغیرها در آن مرتب میشوند . (یك namespace اصولاً مجموعهای از نام متغیرها است). پایینترین سط ح namespace برای متغیرهای محلی درون توابع یا متدها بكار میرود . هر متغیر ایجاد شده در این سطح به namespace محلی اضافه شده است . namespace بعدی حاوی تمامی اعضای یك شیء است . بالاترین سطح namespace برای متغیرهای عمومی بكار میرود . كلمهه كلیدی $this به PHP میگوید كه متغیر را از namespace شیء میخواهید (سطح وسط) . اگر فراموش كنید كه كلمه كلیدی $this را لحاظ كنید ، یك متغیر كاملاً جدید را در namespace محلی ایجاد خواهید كرد . از آنجایی كه این به یك متغیر كاملاً متفاوت از آنچه كه قرار بود رجوع میكند ، چند خطای منطقی كه اشكال زدایی آنها دشوار است را خواهید داشت . اطمینان پیدا نماید كه گزارش خطا را فعال میكنید ، كه در فصل بعدی مورد بحث قرار گرفته است ، و چند assertion را برای محافظت از این خطای رایج در هنگام توسعه كلاسهایتان اضافه كنید . متد start() اتومبیل را با استفاده از key برای كاربر روشن خواهد كرد . اگر key صحیح باشد ، آبجكت اتومبیل به موتور خواهد گفت تا شروع به كار كند : PHP Code: // ,Constructor function ,Car() { $this-> ,requiredkey(); $this->engine= ,new ,Engine() ,; } function ,start ,($Key) { if ,($key->equals($this->requiredKey)) ,{ $this->engine->start(); return ,true ,; } return ,false ,; } , متد stop() ساختاری مشابه متد start() دارد . این متد بررسی میكند تا ببیند آیا موتور روشن است یا خیر ، و اگر روشن باشد ، اتومبیل را متوقف خواهد كرد . توجه كنید كه چك كردن موتور برای اطمینان از روشن بودن آن میتوانست در تابع stop() آبجكت engine صورت گیرد ، تا ما راحتی از فكر كردن درباره آن باز دارد . از خودتان سؤال خواهید كرد كه منطق(logic) در كجا بكار خواهد رفت . این ، پایههای توسعه معماری خوب و موفق است : PHP Code: function ,stop ,() { if ,($this->engine->isRunning()) ,{ $this->engine->stop() ,; } } // ,… ,Several ,other ,methods ,such ,as ,moving ,and ,turning ,, ,and ,so ,on ,. } ?> , حال اجازه دهید ببینیم كه چگونه میتوانیم از این آبجكت در برنامههایمان استفاده كنیم . آبجكتها (Objects) یك شیء در برنامهها نمونهای از یك كلاس است . دلیل این كه یك نمونه خوانده میشود این است كه میتوانیم چندین شیء را ایجاد كنیم (یا نمونههایی) كه از یك كلاس باشند . همانطور كه اتومبیلهای متعددی از یك كلاس میتوانند در جادهها باشند برای ایجاد دو اتومبیل جدید ، تمام آن چیزی كه نیاز خواهیم داشت ، اجرای این خطوط كد در برنامه ما است : PHP Code: <? ,Php $car1=new ,Car(); $car2=new ,Car(); از كلمه كلیدی new برای ساخت نمونه جدیدی از كلاس استفاده میكنیم ، كه ایجاد یك شیء جدید است . هنگامی كه شیء یا یك نمونه كلاس را ایجاد میكنیم ، میگوییم كه شیء برای اولین بار نمونهسازی (instantiate) شده است . مرجع شیء تازه نمونهسازی شده به ترتیب درون متغیرهای $car1 و $car2 قرار میگیرد . حال دو شیء داریم كه برای استفاده در دسترس هستند . اگر میخواستیم ده اتومبیل ایجاد كنیم ، از آرایهای از اشیاء مانند این استفاده میكردیم : PHP Code: $cars ,= ,array() ,; for($I=0;$I<10;$I++) ,{ $cars[$I]=new ,Car ,(); } , اگر بخواهیم یك اتومبیل را روشن كنیم ، متد start() آن را به صورت زیر فراخوانی مینماییم : PHP Code: $carHasStarted ,= ,$car1->start($myKey); if ,($carHasStarted) ,echo(“Car ,has ,started.”); , و اگر خواستیم اتومبیل را متوقف كنیم ، به صورت زیر عمل مینماییم : PHP Code: $car1->stop(); ?> , متوجه شدید كه این شیء دارای یك واسط ساده برای استفاده است . شما مجبور نیستید بدانید كه واسط چگونه توسعه یافته است . به عنوان یك برنامهنویس ، تنها چیزی كه باید بدانید ، سرویسهایی هستند كه توسط یك شیء فراهم میگردند . این برنامه میتوانست به خوبی یك اتومبیل فیزیكی را برای روشن شدن و متوقف شدن بسازد ، اما پیچیدگی این متدها و جزئیات اعضای آن به كلی ناشناخته هستند . این ایده ایجاد اشیاء قابل استفاده به آسانی ، ما را به بخش بعدی هدایت می :ند كه Encapsulation (كپسوله سازی) نام دارد . امیدوارم فهمیده باشید. تازه کارها اگه نفهمیدن یکم زور بزنند تا بفهمند یا به من بگن تا براشون توضیح بدم. در قسمت بعد درباره متدهای کارخانه (factory methods) و شاید هم کپسوله سازی (Encapsulation) صحبت می کنیم
آموزش برنامه نويسي شيء گرا با PHP - قسمت اول و دوم و سوم قسمته دوم. در این قسمت به ساخت یک کلاس بسیار ساده می پردازیم همچنین بیشتر در مورد شیء ها صحبت خواهیم کرد. بیایید كد یك كلاس Car را ایجاد كنیم . در این مثال شروع به تعریف كلاس خود میكنیم . این كار را با استفاده از كلمه كلیدی Class در خط دوم میكنیم . تمرین مهندسی نرمافزار خوبی است تا حرف اول تمامی نامهای كلاسها را برای تشخیص آنها از متغیرها یا توابع با حروف بزرگ بنویسیم . برنامهنویسان این كار را برای سالها در زبانهای گوناگون دیگر انجام دادهاند . شناسایی Constructor در میان متدهای متنوع دیگر در كلاس ساده است . همچنین عادت خوبی است كه نام فایلهایتان را با نام كلاس نامگذاری كنید . نظیر Car.php یك فایل تنها باید شامل یك كلاس باشد . اگر چند كلاس دارید كه به یكدیگر مرتبط هستند ، نظیر مجموعه كلاسهای انواع داده اصلی ، باید آنها را درون یك زیرادایركتوری تحت برنامه كاربردی اصلی خود قرار دهید . اگر روی یك پروژه عظیم كار میكنید ، این تمرین ضروری است . با بزرگتر شدن سیستمها ، ضروری خواهد بود كه از یك ساختار دایركتوری درخت مانند ، برای نگهداری تمامی كلاسهایی كه در برنامه كاربردی وب شما بكار میروند ، استفاده كنید . شما باید از include_once() یا require_once() برای اضافه كردن كلاسها به فایلهای سورس خود در هنگام نیاز به آنها استفاده كنید . PHP Code: <? ,Php // ,Car.php class ,Car , { در یك مدل بینهایت ساده از یك اتومبیل ، كلاس شامل موتور و نمایش كلیدی برای روشن كردن اتومبیل است . یك اتومبیل واقعی باید یك بدنه ، یك پدال گاز و یك ترمز و یك چرخ ، گیربكس و غیره داشته باشد ، اما این تنها برای نمایش است : PHP Code: var ,$engine ,; var ,$requiredkey; , اتومبیل ما همچنین یك constructor دارد كه موتور آن را تنظیم میكند و كلیدی دارد كه اتومبیل را روشن میكند . اگر این عناصر اتومبیل را شناسایی نمیكردیم ، هر فراخوانی start() و stop() از كار میایستاد و خطاهایی را بر میگرداند . چنانكه قبلاً ذكر كردیم ، وظیفه constructor شناسایی تمامی عناصر شیء ، جهت كسب اطمینان از امكان استفاده از تمامی سرویسها در هنگام نیاز است . توجه داشتهباشید كه اگر میخواهید به یك عضو كلاس رجوع كنید ، باید یك كلمه كلیدی $this-> را در ابتدای نام عضو قرار دهید . این ارتباط از جاوا یا C++ متفاوت است كه در آنها اختیاری است . این بدلیل كارایی ضعیف PHP ، سه سطح namespace وجود دارند كه متغیرها در آن مرتب میشوند . (یك namespace اصولاً مجموعهای از نام متغیرها است). پایینترین سط ح namespace برای متغیرهای محلی درون توابع یا متدها بكار میرود . هر متغیر ایجاد شده در این سطح به namespace محلی اضافه شده است . namespace بعدی حاوی تمامی اعضای یك شیء است . بالاترین سطح namespace برای متغیرهای عمومی بكار میرود . كلمهه كلیدی $this به PHP میگوید كه متغیر را از namespace شیء میخواهید (سطح وسط) . اگر فراموش كنید كه كلمه كلیدی $this را لحاظ كنید ، یك متغیر كاملاً جدید را در namespace محلی ایجاد خواهید كرد . از آنجایی كه این به یك متغیر كاملاً متفاوت از آنچه كه قرار بود رجوع میكند ، چند خطای منطقی كه اشكال زدایی آنها دشوار است را خواهید داشت . اطمینان پیدا نماید كه گزارش خطا را فعال میكنید ، كه در فصل بعدی مورد بحث قرار گرفته است ، و چند assertion را برای محافظت از این خطای رایج در هنگام توسعه كلاسهایتان اضافه كنید . متد start() اتومبیل را با استفاده از key برای كاربر روشن خواهد كرد . اگر key صحیح باشد ، آبجكت اتومبیل به موتور خواهد گفت تا شروع به كار كند : PHP Code: // ,Constructor function ,Car() { $this-> ,requiredkey(); $this->engine= ,new ,Engine() ,; } function ,start ,($Key) { if ,($key->equals($this->requiredKey)) ,{ $this->engine->start(); return ,true ,; } return ,false ,; } , متد stop() ساختاری مشابه متد start() دارد . این متد بررسی میكند تا ببیند آیا موتور روشن است یا خیر ، و اگر روشن باشد ، اتومبیل را متوقف خواهد كرد . توجه كنید كه چك كردن موتور برای اطمینان از روشن بودن آن میتوانست در تابع stop() آبجكت engine صورت گیرد ، تا ما راحتی از فكر كردن درباره آن باز دارد . از خودتان سؤال خواهید كرد كه منطق(logic) در كجا بكار خواهد رفت . این ، پایههای توسعه معماری خوب و موفق است : PHP Code: function ,stop ,() { if ,($this->engine->isRunning()) ,{ $this->engine->stop() ,; } } // ,… ,Several ,other ,methods ,such ,as ,moving ,and ,turning ,, ,and ,so ,on ,. } ?> , حال اجازه دهید ببینیم كه چگونه میتوانیم از این آبجكت در برنامههایمان استفاده كنیم . آبجكتها (Objects) یك شیء در برنامهها نمونهای از یك كلاس است . دلیل این كه یك نمونه خوانده میشود این است كه میتوانیم چندین شیء را ایجاد كنیم (یا نمونههایی) كه از یك كلاس باشند . همانطور كه اتومبیلهای متعددی از یك كلاس میتوانند در جادهها باشند برای ایجاد دو اتومبیل جدید ، تمام آن چیزی كه نیاز خواهیم داشت ، اجرای این خطوط كد در برنامه ما است : PHP Code: <? ,Php $car1=new ,Car(); $car2=new ,Car(); از كلمه كلیدی new برای ساخت نمونه جدیدی از كلاس استفاده میكنیم ، كه ایجاد یك شیء جدید است . هنگامی كه شیء یا یك نمونه كلاس را ایجاد میكنیم ، میگوییم كه شیء برای اولین بار نمونهسازی (instantiate) شده است . مرجع شیء تازه نمونهسازی شده به ترتیب درون متغیرهای $car1 و $car2 قرار میگیرد . حال دو شیء داریم كه برای استفاده در دسترس هستند . اگر میخواستیم ده اتومبیل ایجاد كنیم ، از آرایهای از اشیاء مانند این استفاده میكردیم : PHP Code: $cars ,= ,array() ,; for($I=0;$I<10;$I++) ,{ $cars[$I]=new ,Car ,(); } , اگر بخواهیم یك اتومبیل را روشن كنیم ، متد start() آن را به صورت زیر فراخوانی مینماییم : PHP Code: $carHasStarted ,= ,$car1->start($myKey); if ,($carHasStarted) ,echo(“Car ,has ,started.”); , و اگر خواستیم اتومبیل را متوقف كنیم ، به صورت زیر عمل مینماییم : PHP Code: $car1->stop(); ?> , متوجه شدید كه این شیء دارای یك واسط ساده برای استفاده است . شما مجبور نیستید بدانید كه واسط چگونه توسعه یافته است . به عنوان یك برنامهنویس ، تنها چیزی كه باید بدانید ، سرویسهایی هستند كه توسط یك شیء فراهم میگردند . این برنامه میتوانست به خوبی یك اتومبیل فیزیكی را برای روشن شدن و متوقف شدن بسازد ، اما پیچیدگی این متدها و جزئیات اعضای آن به كلی ناشناخته هستند . این ایده ایجاد اشیاء قابل استفاده به آسانی ، ما را به بخش بعدی هدایت می :ند كه Encapsulation (كپسوله سازی) نام دارد . امیدوارم فهمیده باشید. تازه کارها اگه نفهمیدن یکم زور بزنند تا بفهمند یا به من بگن تا براشون توضیح بدم. در قسمت بعد درباره متدهای کارخانه (factory methods) و شاید هم کپسوله سازی (Encapsulation) صحبت می کنیم در امضای EBRAHIM KHANI نوشته شده است : عشق یعنی پایمردی و دوام عشق یعنی عشق زینب والسلام آیا حسینیه و زینبیه زنجان را میشناسید؟! ۱۰-۷-۱۳۸۹ ۱۲:۵۹ صبح تشکر شده توسط : مشخصات كاربر: EBRAHIM KHANI ناظم کل ایران فروم ارسال ها:13,316 گروه: ناظم کل ایران فروم تاريخ ثبت نام: ۲۰ مرداد ۱۳۸۸ محل سکونت : -- انتخاب نشده -- مدل گوشی موبایل: عضو شماره:9935 اعتبار: 58 تشکر: 1580 7681 بار تشکر شده در 4169 پست شماره ارسال: #3 RE:آموزش برنامه نويسي شيء گرا با PHP - قسمت اول و دوم و سوم قسمت سومش در این قسمت درمورد Factory Methods (متد های کارخانه) و Encapsulation (کپسوله سازی) صحبت می کنیم امید وارم تا تهشو بخونید متدهای كارخانه گاهی بهتر است از یك شیء بخواهید تا یك شیء جدید را برای شما ایجاد كند تا این كه خودتان اپراتور جدیدی را صدا بزنید . این كلاسها ، كارخانه (factory) نام میگیرند و متدهایی كه این اشیاء را ایجاد میكنند ، متدهای كارخانه نام دارند . كلمه كارخانه ، ریشه در استعارهای از سهولت تولید دارد . برای مثال ، یك كارخانه موتورسازی كه مالك آن جنرال موتور است و تولیدكننده موتورهای اتومبیل است ، بسیار شبیه به یك كارخانه شیء است كه اشیایی از نوع خاص را تولید میكند . بدون تعمیق در جزئیات مدلهای آبجكتی پیچیده ، بیایید ببینیم چگونه میتوانیم از كارخانههای شیء در برخی قسمتهای توسعه برنامه كاربردی وب استفاده كنیم . در اینجا چند مثال داریم : • ممكن است بخواهید یك Form Control Factory را ایجاد كنید كه عناصر فرمی متنوعی را ایجاد میكند (نظیر فیلدهای متنی ، گروههای رادیویی ، دكمههای submit و غیره) تا روی یك فرم HTML نظیر آن چه كه در كتابخانه eXtreme PHP پیادهسازی شده است (یك كتابخانه open source كه در آدرس http://www.extremephp.org/ قراردارد ) قرار دهید . • ممكن است بخواهید یك كارخانه را برای واردن كردن سطرهای جدید به داخل جدول پایگاه داده و بازگرداندن آبجكت دسترسی داده مناسب برای آن سطر خاص ، ایجاد كنید . حال باید ببینیم چگونه میتوان یك كلاس كارخانه و متدهای مربوط به آن را با ایجاد TextField و آبجكتهایSubmitButton )از (Extreme PHP درون كلاس Form Control Factory ایجاد كرد . در اینجا دو فایل را وارد میكنیم كه در نظر میگیریم از پیش ساخته شدهاند . فایل TextField.php حاوی كد مربوط به كلاس TextField و SubmitButton.php حاوی كد مربوط به كلاس SubmitButton است . چنانكه خواهید دید ، این دو فایل نیازمند یك نام و یك مقدار برای انتقال به Constructor های خود ، هنگام ایجاد نمونههای جدید هستند : PHP Code: <?php include_once(“./Text ,Field.php”); include_once(“./SubmitButton.php”); هنگام توسعه كلاسهای كارخانه ، تمرین خوبی خواهد بود اگر كلمه “Factory” را به انتهای نام كلاس اضافه كنید كلمه “Factory”تبدیل به یك قرارداد مشترك در دنیای شیء گرایی شده است و به برنامهنویسان دیگر كمك خواهد كرد تا از این واژه شناسی مشترك تشخیص دهند كه كلاس چه كاری را انجام میدهد : PHP Code: // ,FormControl ,Factory.php class ,FormControlFactory , { , این اولین متد كارخانه ما ، یعنی createTextField() میباشد و به سادگی یك نمونه جدید از كلاس TextField را با انتقال $name و $value تأمین شده توسط سرویس گیرنده ، ایجاد میكند : PHP Code: function ,createTextField($name,$value) { return ,new ,TextField($name,$value) ,; } , متد createSubmitButton() به همان روش تعریف شده است . همچنین یك قرارداد مشترك برای اتصال كلمه “create” به ابتدای متد كارخانه برای مشخص كردن شیء جدیدی است كه بر میگرداند . این یك واژه سازی مشترك را در برنامه كاربردی شما ایجاد خواهد كرد و فهم كد شما و سطح قابل ردیابی شدن (traceability) آن را افزایش خواهد داد : PHP Code: function ,createSubmitButton($name,$value) { return ,new ,SubmitButton ,($name,$value) ,; } } , حال بتجای این كه آبجكتهای TextField و SubmitButton را با استفاده از اپراتور جدید برای اولین مرتبه معرفی كنیم ، میتوانیم از Form Control Factory برای انجام این كار استفاده كنیم : PHP Code: $ ,Form ,Control ,Factory ,=new ,Form ,Control ,Factory(); $firstNameFild= $ ,Form ,Control ,Factory ,-> ,createTextField(‘firstname’, ,‘Ken’); $lastNameFild= $ ,Form ,Control ,Factory ,-> ,createTextField(‘lastname’, ,‘Egervai’); $ ,SubmitButton= $ ,Form ,Control ,Factory ,-> ,create ,SubmitButton(‘submit’, ,‘Submit ,Name’); ?> , در اینجا نمونه جدیدی از Form Control Factory را ایجاد میكنیم و سه كلاس جدید را با استفاده از متدهای كارخانه آن ایجاد میكنیم . دو فراخوانی اول () createTextField ، فیلدهای متنی را ایجاد میكند كه یك نام و نامخانوادگی را ذخیره میكنند . فراخوانی بعدی یك دكمه submit با عنوان “Submit Name" را ایجاد میكند در این نقطه ، برنامه كاربردی ما میتواند هركاری كه نیاز دارد با این آبجكتهای جدید انجام دهد . اهمیت در معنی برنامه كاربردی نیست ، بلكه در ساختار و مفهوم آن چه كه متدهای كارخانه هستند و چگونگی استفاده از آنها در برنامههای وب نهفته است . كلاسهای كارخانه تنها محدود به ایجاد متدها نیستند . شما میتوانید متدهای دیگری را اضافه كنید كه با مدل كارخانه نزدیك میباشند نظیر متدهای find كه به دنبال آبجكتهای كارخانه میگردند و آنها را باز میگردانند و متدهایی را حذف میكنند كه میتوانند آبجكتهایی را در كارخانه اوراق كنند. این پیادهسازیها به پروژه مربوط میشوند و برعهده شما به عنوان طراح برنامه كاربردی هستند. حال بیایید توجه خود را به اصول encapsulation و پنهانسازی اطلاعات معطوف كنیم .