تبلیغات در پرشین تولز

PDA

View Full Version : آموزش برنامه نويسي شيء گرا با PHP - قسمت اول و دوم و سوم


Parsa_361
08-26-2005, 10:38 AM
من با توجه به اينكه منبع های آموزش 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 بيندازيم ، كه استفاده از اين سه نوع كامپوننت را نشان مي‌دهد :

class ClassName [extends ParentclassName]
{
var $member1;
var $member2;


var $memberN;
// Constructor
function Class Name()
{
}
function method1()
{
}

function method2()
{
}
function methodN()
{
}
}

همان‌گونه كه مي‌بينيد ، يك كلاس چيزي نيست جز يك مجموعه از اعضاي تعريف شده (متغيرها) و متدها (توابع) . اعضا مي‌توانند يا انواع داده اوليه نظير integer ها و رشته‌ها يا انواع پيچيده‌تري نظير آرايه‌ها يا اشياء ديگر باشند . از آنجايي كه PHP از شما انتظار ندارد كه انواع را تعريف كنيد ، فقط مي‌توانيد متغيرهايتان را در بالاي كلاس ، به صورتي كه در بالا نشان داده شد ، نام ببريد .
با PHP مي‌توانيد متغيرهايي را در تابع خود ايجاد كنيد ؛ آنها به همان خوبي كه مورد انتظارتان است كا رخواهند كرد . اگرچه ، تمرين خوبي نخواهد بود اگر اين كار را انجام دهيد . اين به آن خاطر است كه وقتي برنامه‌نويسان ديگر به كلاس شما نگاه مي‌كنند ، فوراً تمامي اعضاي آن را پيش از نگاه كردن به پياده‌سازي توابع بشناسند .
متدها به سادگي تمام سرويس‌هايي هستند كه اين كلاس تضمين مي‌كند تا براي سرويس گيرنده‌هايش فراهم كند . سرويس گيرنده‌ها مي‌توانند برنامه‌هاي ديگر ، پروژه‌هاي ديگر و غيره باشند‌.


در جلسه بعد به ساخت یک کلاس ساده می پردازیم.

هر جای این متن رو نفهمیدید بگید تا براتون توضیح بدم.

mamalionline
08-26-2005, 02:36 PM
موفق باشي كارت قشنگ بود !

Parsa_361
08-26-2005, 05:02 PM
موفق باشي كارت قشنگ بود !
خواهش می کنم.

Parsa_361
08-26-2005, 05:46 PM
عزیزان حرفه ای فقط نگاه به این درس نکنن !
در جلسات بعدی خیلی پیشرفته می شه !!
مثلاً چند تا از چیز هایی که درس می دم اینا هستن :

1. آبجکتها (Objects)
2. متد های کار خانه ای
3. Encapsulation (کپسوله سازی)
4. وراثت
5. اوپراتور فراخوانی Class-Function و...
6. Polymorphism (پولیمورفیسم)
7. متدهی Abstract (مجرد)
8. همبستگی و وابستگی
9. مدل سازی آبجکت در UML
10. توابه کلاس PHP
11. محدودیت های PHP و راه چاره
12. یک کلاس کامل برای MySQL

miladmovie
08-27-2005, 04:43 PM
می گم یک کاری کن ! هر چیزی می خواهی اضافه کنی به همون تاپیکت اولت اضافه کن که کسی که می خواد بخوندش پشت سر هم باشه !
من هم میارمش بالای صفحه

Parsa_361
08-27-2005, 09:10 PM
می گم یک کاری کن ! هر چیزی می خواهی اضافه کنی به همون تاپیکت اولت اضافه کن که کسی که می خواد بخوندش پشت سر هم باشه !
من هم میارمش بالای صفحه
خوب اگه این کارو بکنیم
بقیه که می خوان نظر بدن وسط این آموزشا نظر می دن و بعد صفحاتش زیاد می شه وپیدا کردن آموزش ها سخت می شه !
:questionm
حالا چی کار کنم ؟

Parsa_361
08-30-2005, 01:40 PM
من منتظر جوابم.

PersianPC
08-30-2005, 01:55 PM
بشین خسته نشی ! میلاد به این زودیا پیداش نمیشه !

babakweb
08-30-2005, 04:10 PM
بشین خسته نشی ! میلاد به این زودیا پیداش نمیشه !
چرا؟
چرا پیداش نمی‌شه؟؟؟
:)

carp3
08-30-2005, 07:11 PM
آخه اینترنت گرونه
راستی باحال بود امید وارم ادامه بدی

Parsa_361
08-30-2005, 07:14 PM
ممنون
ببینم حالا نظر شما ها چیه ؟

miladmovie
09-04-2005, 09:45 PM
هر کاری دلت می خواد بکنی و می دونی درسته نظر من هم ولش کن !

Parsa_361
09-04-2005, 09:51 PM
آقا میلاد می تونی نام تاپیک رو عوض کنی ؟
مثلاً بذاری :
آموزش برنامه نویسی شیء گرا با PHP - قسمت اول و دوم
؟
یا تمام پستهای یک تاپیک رو منتقل کنی تو یه تاپیک دیگه ؟
امکان پذیره ؟

Parsa_361
09-06-2005, 09:54 PM
:D
آموزش برنامه نویسی شیء گرا با PHP - قسمت دوم آماده شد.
:D

تکلیف رو معلوم کنید.
چی کار کنم ؟

آقا میلاد هنوز سؤالم رو جواب ندادین !

Parsa_361
09-06-2005, 10:17 PM
خوب، قرار شد تو همین تاپیک بزارم.
اینم قسمته دوم.
در این قسمت به ساخت یک کلاس بسیار ساده می پردازیم
همچنین بیشتر در مورد شیء ها صحبت خواهیم کرد.


بياييد كد يك كلاس Car را ايجاد كنيم . در اين مثال شروع به تعريف كلاس خود مي‌كنيم . اين كار را با استفاده از كلمه كليدي Class در خط دوم مي‌كنيم . تمرين مهندسي نرم‌افزار خوبي است تا حرف اول تمامي نامهاي كلاسها را براي تشخيص آنها از متغيرها يا توابع با حروف بزرگ بنويسيم .
برنامه‌نويسان اين كار را براي سالها در زبانهاي گوناگون ديگر انجام داده‌اند . شناسايي Constructor در ميان متدهاي متنوع ديگر در كلاس ساده است . همچنين عادت خوبي است كه نام فايل‌هايتان را با نام كلاس نامگذاري كنيد . نظير Car.php يك فايل تنها بايد شامل يك كلاس باشد . اگر چند كلاس داريد كه به يكديگر مرتبط هستند ، نظير مجموعه كلاسهاي انواع داده اصلي ، بايد آنها را درون يك زيرادايركتوري تحت برنامه كاربردي اصلي خود قرار دهيد . اگر روي يك پروژه عظيم كار مي‌كنيد ، اين تمرين ضروري است .

با بزرگتر شدن سيستم‌ها ، ضروري خواهد بود كه از يك ساختار دايركتوري درخت مانند ، براي نگهداري تمامي كلاسهايي كه در برنامه كاربردي وب شما بكار مي‌روند ، استفاده كنيد . شما بايد از include_once() يا require_once() براي اضافه كردن كلاسها به فايل‌هاي سورس خود در هنگام نياز به آنها استفاده كنيد .


<? Php
// Car.php
class Car
{
در يك مدل بي‌نهايت ساده از يك اتومبيل ، كلاس شامل موتور و نمايش كليدي براي روشن كردن اتومبيل است . يك اتومبيل واقعي بايد يك بدنه ، يك پدال گاز و يك ترمز و يك چرخ ، گيربكس و غيره داشته باشد ، اما اين تنها براي نمايش است :


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 صحيح باشد ، آبجكت اتومبيل به موتور خواهد گفت تا شروع به كار كند :


// 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) در كجا بكار خواهد رفت . اين ، پايه‌هاي توسعه معماري خوب و موفق است :


function stop ()
{
if ($this->engine->isRunning()) {
$this->engine->stop() ;
}
}
// … Several other methods such as moving and turning , and so on .
}
?>
حال اجازه دهيد ببينيم كه چگونه مي‌توانيم از اين آبجكت در برنامه‌هايمان استفاده كنيم .

آبجكت‌ها (Objects)

يك شيء در برنامه‌ها نمونه‌اي از يك كلاس است . دليل اين كه يك نمونه خوانده مي‌شود اين است كه مي‌توانيم چندين شيء را ايجاد كنيم (يا نمونه‌هايي) كه از يك كلاس باشند . همان‌طور كه اتومبيل‌هاي متعددي از يك كلاس مي‌توانند در جاده‌ها باشند براي ايجاد دو اتومبيل جديد ، تمام آن چيزي كه نياز خواهيم داشت ، اجراي اين خطوط كد در برنامه ما است :


<? Php
$car1=new Car();
$car2=new Car();
از كلمه كليدي new براي ساخت نمونه جديدي از كلاس استفاده مي‌كنيم ، كه ايجاد يك شيء جديد است . هنگامي كه شيء يا يك نمونه كلاس را ايجاد مي‌كنيم ، مي‌گوييم كه شيء براي اولين بار نمونه‌سازي (instantiate) شده است . مرجع شيء تازه نمونه‌سازي شده به ترتيب درون متغيرهاي $car1 و $car2 قرار مي‌گيرد . حال دو شيء داريم كه براي استفاده در دسترس هستند . اگر مي‌خواستيم ده اتومبيل ايجاد كنيم ، از آرايه‌اي از اشياء مانند اين استفاده مي‌كرديم :


$cars = array() ;
for($I=0;$I<10;$I++) {
$cars[$I]=new Car ();
}
اگر بخواهيم يك اتومبيل را روشن كنيم ، متد start() آن را به صورت زير فراخواني مي‌نماييم :


$carHasStarted = $car1->start($myKey);
if ($carHasStarted) echo(“Car has started.”);
و اگر خواستيم اتومبيل را متوقف كنيم ، به صورت زير عمل مي‌نماييم :


$car1->stop();
?>
متوجه شديد كه اين شيء داراي يك واسط ساده براي استفاده است . شما مجبور نيستيد بدانيد كه واسط چگونه توسعه يافته است . به عنوان يك برنامه‌نويس ، تنها چيزي كه بايد بدانيد ، سرويس‌هايي هستند كه توسط يك شيء فراهم مي‌گردند . اين برنامه مي‌توانست به خوبي يك اتومبيل فيزيكي را براي روشن شدن و متوقف شدن بسازد ، اما پيچيدگي اين متدها و جزئيات اعضاي آن به كلي ناشناخته هستند . اين ايده ايجاد اشياء قابل استفاده به آساني ، ما را به بخش بعدي هدايت مي :ند كه Encapsulation (كپسوله سازي) نام دارد .


امیدوارم فهمیده باشید.
تازه کارها اگه نفهمیدن یکم زور بزنند تا بفهمند
یا به من بگن تا براشون توضیح بدم.

در قسمت بعد درباره متدهای کارخانه (factory methods) و شاید هم کپسوله سازی (Encapsulation) صحبت می کنیم

بازم می گم اگه جایش رو نفهمیدید بگید تا براتون توضیح بدم.

samin.faraz
10-15-2005, 02:23 PM
salam
man ba php va html 1 proje neveshtam
vali aslan nemidonam cms .php nuke-php chi hast lotfan tozih bedid
va shoma kodomesho amozesh midid
va baraye shoro chi bayad akiard
che manbe va software pishnahad mikonid

mamnoon

Parsa_361
10-15-2005, 05:33 PM
salam
man ba php va html 1 proje neveshtam
vali aslan nemidonam cms .php nuke-php chi hast lotfan tozih bedid
va shoma kodomesho amozesh midid
va baraye shoro chi bayad akiard
che manbe va software pishnahad mikonid

mamnoon
eeeeeeeeeee

آقا اسفند دود کنین !
بالا خره یه نفر تو این تاپیک چیز نوشت
واقعاً نا امید شده بودم
از این همه استقبال

به عرض شما خدمت کنم که هدف از ایجاد این تاپیک آموزش حرفه ای PHP در مبحث شیء گرایی بود
که ما هم از استقبال بسیار بسیار بسیار همه فیض بردیم و روحیه مون رفت بالا !

اگر شما از برنامه نویسی به هر زبانی آشنایی دارین می تونید به اینجا مراجعه کنید (یه کتاب خوب رو معرفی کرده) :
http://forum.persiantools.com/showthread.php?t=27061

و اگر هم تازه شروع به برنامه نویسی کردین بهتره کتاب PHP انتشارات ناقوس رو بگیرین
خواهشمندم این بحث رو در همون لینک بالا ادامه بدین

راستی فارسی بنویسید تا بتر به جواب برسین

Parsa_361
10-22-2005, 05:29 PM
:D به سلامتی قسمت سومش هم آماده شد :D
بفرمایید :
در این قسمت درمورد Factory Methods (متد های کارخانه) و Encapsulation (کپسوله سازی) صحبت می کنیم
امید وارم تا تهشو بخونید :D


متدهاي كارخانه
گاهي بهتر است از يك شيء بخواهيد تا يك شيء جديد را براي شما ايجاد كند تا اين كه خودتان اپراتور جديدي را صدا بزنيد . اين كلاسها ، كارخانه (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
include_once(“./Text Field.php”);
include_once(“./SubmitButton.php”);
هنگام توسعه كلاسهاي كارخانه ، تمرين خوبي خواهد بود اگر كلمه “Factory” را به انتهاي نام كلاس اضافه كنيد كلمه “Factory”تبديل به يك قرارداد مشترك در دنياي شيء گرايي شده است و به برنامه‌نويسان ديگر كمك خواهد كرد تا از اين واژه شناسي مشترك تشخيص دهند كه كلاس چه كاري را انجام مي‌دهد :
// FormControl Factory.php
class FormControlFactory
{
اين اولين متد كارخانه ما ، يعني createTextField() مي‌باشد و به سادگي يك نمونه جديد از كلاس TextField را با انتقال $name و $value تأمين شده توسط سرويس گيرنده ، ايجاد مي‌كند :
function createTextField($name,$value)
{
return new TextField($name,$value) ;
}
متد createSubmitButton() به همان روش تعريف شده است . همچنين يك قرارداد مشترك براي اتصال كلمه “create” به ابتداي متد كارخانه براي مشخص كردن شيء جديدي است كه بر مي‌گرداند . اين يك واژه سازي مشترك را در برنامه كاربردي شما ايجاد خواهد كرد و فهم كد شما و سطح قابل رديابي شدن (traceability) آن را افزايش خواهد داد :
function createSubmitButton($name,$value)
{
return new SubmitButton ($name,$value) ;
}
}
حال بتجاي اين كه آبجكت‌هاي TextField و SubmitButton را با استفاده از اپراتور جديد براي اولين مرتبه معرفي كنيم ، مي‌توانيم از Form Control Factory براي انجام اين كار استفاده كنيم :
$ 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 و پنهان‌سازي اطلاعات معطوف كنيم .


Encapsulation (كپسوله‌سازي)
هنگامي كه مسكن سردرد خود را مصرف مي‌كنيد ، احتمالاً از محتويات آن آگاه نيستيد . تمام آنچه كه مد نظر شماست ، توانايي آن در برطرف كردن سردرد شماست . اين مسئله زماني صادق است كه برنامه‌نويسان از آبجكت‌هاي ارائه شده براي آنها استفاده مي‌كنند . هنگامي كه به استفاده از آبجكت Car خود پرداختيم ، چيزي درباره گيربكس ، سيستم اگزوز يا موتور وسيله نقليه نمي‌دانستيم . تمام آن چه كه لازم داشتيم ، پيچاندن كليد و روشن كردن اتومبيل بود . هنگام طراحي آبجكت‌ها هدف همين خواهد بود .
تمامي داده‌هاي مركب و منطق را درون آبجكت جمع كنيد و براي كاربران تنها سرويس‌هاي معني‌داري را كه آنها انتظار دارند با آبجكت به تعامل بپردازند را فراهم نماييد . در اينجا كپسوله نمودن داده مركب و جزئيات منطقي درون آبجكت را مي‌بينيم . اگر اين كار به صورت مناسب انجام گيرد ، فايده مخفي كردن اطلاعات را خواهيم ديد ، كه بعداً مورد بررسي قرار خواهد گرفت .
چنانكه پيشتر ذكر كرديم ، براي كاربران كلاس اهميت دارد تا از اعضاي داده‌اي درون كلاس كاملاً بي‌اطلاع باشند .

اگرچه اين مسئله در PHP كاملاً معتبر است ، كه اعضاي آبجكتي كه براي اولين بار نمونه‌سازي شده است را در هر زماني تغيير دهيم ، اما انجام اين كار به عنوان يك عادت بد در نظر گرفته مي‌شود .

در اينجا مثالي داريم كه چند رويداد ناگوار را نشان مي‌دهد كه در صورتي كه اعضاي آبجكت را بدون رفتن به واسط آبجكت تغيير دهيم ، اتفاق خواهند افتاد . در اين مثال در نظر مي‌گيريم كه متدي براي تنظيم سرعت اتومبيل وجود دارد كه نام آن setSpeed است است ($speed) ، كه در صورتي كه آن را روي بيش از 200km/h تنظيم كنيد و يا وقتي سرعت كمتر از 0km/h باشد با شكست مواجه خواهد شد . همچنيني بايد تصور كنيم كهconstructor (سازنده) ماكليد و موتور را براي روشن كردن اتومبيل شناسايي نمي‌كند :
$myKey =new Key(‘Key of my Porsche’);
$car = new Car();
$car->engine = new Engine();

$car->speed=400;
$car->start($myKey);

$car->engine =0;
$car->stop();
خطاهاي زيادي در اين كد وجود دارند كه يا در تفسير دچار مشكل خواهند شد و يا حتي بدتر ، كارخواهند كرد ، اما در رفتار مناسب با شكست مواجه خواهند شد . در سه خط اول ، در تنظيم عضو $requiredkey آبجكت $car خود شكست خورديم ، چرا كه اين كار توسط constructorما انجام نشده بود .
كليد لازم نخواهد بود ، مگر اين كه بخواهيم واقعاً اتومبيل را روشن كنيم ، پس هيچ خطايي از اين جا نتيجه نمي‌شود . پس همه چيز پس از چند خط اول خوب به نظر مي‌رسد . به طور جداگانه نگاهي به خطي مي‌اندازيم كه آبجكت Engine را ساختيم . اگر به جاي آن مي‌نوشتيم :
$car->Engine=new Engine() چه مي‌شد ؟
(“E” بزرگ را در كلمه Engine مورد توجه قرار دهيد.) اتومبيل از روشن شدن باز مي‌ايستاد ، زيرا موتور نيز شناسايي نمي‌شد . حتماً خواهيد توانست اين اشكالات را به آساني برطرف كنيد ، اما آنها نبايد در اولين وهله رخ دهند . سپس سعي مي‌كنيم اتومبيل را روشن كنيم :
$car->speed=400;//should have been $car ->setSpeed(400); to cause // a failure
$car->start($myKey);
هنگامي كه اتومبيل روشن مي‌شود به جلو رانده مي‌شود و سرعتش به 400km/h خواهد رسيد . اين مي‌تواند باعث تصادف و كشته شدن مردم در جاده (يا خارج از آن) شود . اين يقيناً آن چيزي نخواهد بود كه ما مي‌خواهيم .
اتومبيل از كجا مي‌داند كه به چه كليدي براي روشن كردن اتومبيل نياز دارد ؟ بايد كليد ساخته شده را با متغيري كه حتي وجود ندارد مقايسه كند (و نتيجه‌اي برابر 0 در برداشته باشد) و در نهايت در روشن كردن اتومبيل با شكست مواجه خواهد شد . مقايسه‌اي نظير اين مستقيماً به چك كردن مفسر مربوط مي‌شود ، چرا كه $key ورودي است كه برابري را چك مي‌كند و نه عضو را . براي مالك اتومبيل خجالت‌آور خواهد بود اگر كه يك وسيله نقليه جديد بخرد و تازه بفهمد كه كليد ارائه شده توسط فروشنده هرگز كار نكرده است . بياييد ببينيم كه چه اتفاقي خواهد افتاد اگر بخواهيم هنگامي كه engine را روي 0 تنظيم كرده‌ايم ، اتومبيل را خاموش كنيم :
$car->engine=0
$car->stop();
هنگامي كه متد stop() فراخوانده مي‌شود . با يك خطاي زمان اجرا مواجه خواهيم شد ، چرا كه آبجكت Engine با اينكه حتي وجود ندارد ، آن را وادار به پذيرفتن مقدار integer كرده‌ايم . چنانكه مي‌بينيد ، تنظيم اعضا از خارج كلاس احتمالاً مي‌توانست مشكلات فراواني را به بار بياورد . در دنيايي كه چندين برنامه‌نويس را در حال كاركردن بر روي يك پروژه داريد ، بايد انتظار داشته باشيد كه بقيه بتوانند كد شما را بخوانند و احتمالاً از آن استفاده كنند .
چه درسهايي از اين مثال آموختيم ؟ استفاده از اعضا در خارج از آبجكت (object violations) مي‌تواند :
• عدم اطمينان از اينكه سرويس‌هايي كه به وسيله آبجكت فراهم شده‌اند ، به گونه‌اي كه از آنها انتظار داريم رفتار نمايند .
• عدم جامعيت (integrity) اعضاي داده آبجكت (يا وضعيت آبجكت) در يكي از دو روش زير :
• تخطي از تعيين وضعيت ابتدايي اعضاء
• ايجاد واسطهايي پيچيده‌تري نسبت به آن چه كه شما واقعاً نياز داريد .
• مسئوليت سنگين‌تري روي دوش برنامه‌نويسان بگذارد تا بيشت درباره آبجكت و روشي كه داده با سرويس‌ها كار مي‌كند ، فكر كنند .
• هنگامي كه زمان استفاده مجدد از آبجكت فرا مي‌رسد ، ممكن است مجبور باشيد اعضا را مجدداً تغيير دهيد . گاهي به غير از فراموشكاري ، خطاهاي جديدي در پروژه بعدي ايجاد خواهيد كرد . اين دقيقاً چيزي است كه مي‌خواهيم از آن دوري گزينيم .


طراحي كلاس بگونه‌اي كه براي انجام هر آن چه كه مي‌خواهيد با آبجكت‌ انجام دهيد مناسب باشد ، راه عملي خوبي خواهد بود . هرگز به اعضاي خارج از كلاس دستيابي پيدا نكنيد و هميشه كلاس‌هاي خود را به طور مناسب در كپسول قرار دهيد ، تا فوائد مخفي كردن اطلاعات را حاصل كنيد . برخي زبانها قابليت غير مجاز ساختن دسترسي به اعضا را به طور كلي و بوسيله خصوصي ساختن (يا محافظت كردن) آنها تنها براي كلاس ارائه مي‌دهند . در حال حاضر PHP از اين امكان بهره‌مند نيست ، اما پيروي از عادتهاي خوب كدنويسي ، بدون شك مفيد خواهد بود .



هر جاشو بد توضیح دادم یا نفهمیدید من در خدمتم

در قسمت بعد در باره یکی از جذاب ترین و بهترین موضوعات شیء گرایی یعنی وراثت صحبت خواهیم کرد !

خواهشن با نظراتتون و Post هاتون به من روحیه ادامه کار بدین

daftarekhaterat
10-22-2005, 06:05 PM
من خيلي استعدادم زياد نيست. سعي ميكنم كم كم بخونم... http://asefsoft.com/qsimages/26.gif
خسته نباشين. :)

Parsa_361
10-22-2005, 07:45 PM
من خيلي استعدادم زياد نيست. سعي ميكنم كم كم بخونم... http://asefsoft.com/qsimages/26.gif
خسته نباشين. :)
mer30 :D

این رو هم بگم که تمام مطالب این تاپیک پشت سر هم هست و نمی شه از وسط کار شروع کرد به خوندن ها !

barbary629
10-28-2005, 07:30 AM
اين از كتاباي تست كنكور كانون هم سختره

setareh2
10-28-2005, 08:46 AM
بخدا اين از كتاباي تست كنكور كانون هم سختره
عزیز من خدا رو قسم نخور! هر جاشو نفهمیدی سوال کن;) :D :cool:

Parsa_361
10-28-2005, 12:08 PM
عزیز من خدا رو قسم نخور! هر جاشو نفهمیدی سوال کن;) :D :cool:
تأید میشه !

هر وقت خواستید بگید تا قسمت وراثت رو هم بزارم در اون قسمت یه کار عملی یا یک مثال خوب آماده کردم تا دیگه قشنگ یاد بگیرید ولی :
دوباره هم می گم !
هیچ وقت یک قسمت رو ول نکنید و برید قسمت بعدی رو بخونید چون در قسمتهای بعدی به مشکل بر می خورید !

;)

setareh2
11-01-2005, 07:12 PM
عمو پارسا ادامه چی شد؟؟؟؟

PersianPC
11-01-2005, 07:21 PM
اشتباه کردی ! عمو پارسا نیست ! عمو مرتضاست !

بعدش هم مرتضی جان ، این مقالاتی که مینویسی ، بقدر کافی تو کتاب php 4 professional ( روزنه ) بد توضیح داده شده ! خواهشا یکم تغیرش بده که مغز ادم گیر نکنه !

Parsa_361
11-01-2005, 09:58 PM
اشتباه کردی ! عمو پارسا نیست ! عمو مرتضاست !

بعدش هم مرتضی جان ، این مقالاتی که مینویسی ، بقدر کافی تو کتاب php 4 professional ( روزنه ) بد توضیح داده شده ! خواهشا یکم تغیرش بده که مغز ادم گیر نکنه !
:D
اتفاقاً خودم هم تو همین فکر بودم
قسمت چهارم این تاپیک یه دوره از قسمتهای قبلی می باشد
که از خودم دروَکنمش :D

دونه دونه قسمتهای قبلی رو با زبان ساده و حجم کم توضیح میدم
فقط صبر کنید ، من این چند روزه خیلی خیلی سرم شلوغه

Asef
11-06-2005, 05:51 AM
اي بابا اينا رو كه همه رو بلد بودم http://asefsoft.com/qsimages/18.gif يه چيز جديد ياد بديد http://asefsoft.com/qsimages/30.gif (http://www.weblog.raheayandeh.com/)
شوخي كردم كارت عاليه ادامه بده http://asefsoft.com/qsimages/15.gif

Parsa_361
11-06-2005, 04:47 PM
اي بابا اينا رو كه همه رو بلد بودم http://asefsoft.com/qsimages/18.gif يه چيز جديد ياد بديد http://asefsoft.com/qsimages/30.gif (http://www.weblog.raheayandeh.com/)
شوخي كردم كارت عاليه ادامه بده http://asefsoft.com/qsimages/15.gif
لطف دارین ! :D

Mehdi
01-23-2006, 10:21 PM
ممنون منم منتظر هستم
درمورد كلاس ها اگه مشكلي بود يه اموزش من گزاشتم:D

Romain_Gary
01-24-2006, 11:56 AM
خیلی ممنون از آموزش خوبت

mbf
01-24-2006, 04:40 PM
پارسا جان خسته نباشی و ممنون
من تازه php رو شروع کردم و مقالتونو ذخیره کردم که بعدها بخونم
فقط گفتم خسته نباشید بگم و تشکر کنم فعلا !

Parsa_361
01-24-2006, 08:08 PM
ممنون منم منتظر هستم
درمورد كلاس ها اگه مشكلي بود يه اموزش من گزاشتم:D
خیلی ممنون از آموزش خوبت
پارسا جان خسته نباشی و ممنون
من تازه php رو شروع کردم و مقالتونو ذخیره کردم که بعدها بخونم
فقط گفتم خسته نباشید بگم و تشکر کنم فعلا !
از همتون ممنونم ! :heart: :heart: :heart:
خیلی لطف میکنید

Mehdi
01-24-2006, 09:46 PM
اين همه تشويق ميكنيم ادامه بدي ها:D

mbf
01-24-2006, 10:04 PM
داره از بچه های php این فروم خوشم میاد خداوکیلی دیگه همه جا اونایی که از این کارا می کردن جمع کردن رفتن دنبال کار خودشون و اگر پول ندی هیچ کاری نمی کنن و انجمن هاشون مرده شده
ولی تو این قسمت php کلی بحث و آموزشهای عالی آدم می بینه که روحیه می گیره
برای اثبات حرفم هم مثلا شما فقط یه سر به انجمن فلش و ام تی این فروم بزنید متوجه می شید

Parsa_361
02-02-2006, 07:47 PM
اين همه تشويق ميكنيم ادامه بدي ها:D
به روی چشمم ;)
فعلاً که شدیدا درگیر این پرژه سازمانم
سرم که خلوت شد قسمت چهارمم میزارم
نصفشم نوشتم ! :D

راستی آنلاین شو کارت دارم :D

Parsa_361
02-02-2006, 07:52 PM
داره از بچه های php این فروم خوشم میاد خداوکیلی دیگه همه جا اونایی که از این کارا می کردن جمع کردن رفتن دنبال کار خودشون و اگر پول ندی هیچ کاری نمی کنن و انجمن هاشون مرده شده
ولی تو این قسمت php کلی بحث و آموزشهای عالی آدم می بینه که روحیه می گیره
برای اثبات حرفم هم مثلا شما فقط یه سر به انجمن فلش و ام تی این فروم بزنید متوجه می شید
100% همینطوره !
این حرف لازم به اثبات نداره
چون همه میدونن ! :D

mbf
02-02-2006, 09:51 PM
بهرحال پارسا جان ما چند وقت یک بار میایم اینجا سرک می کشیم ببینیم خبر و مقاله جدید چی داری؟

Parsa_361
02-03-2006, 07:36 PM
بهرحال پارسا جان ما چند وقت یک بار میایم اینجا سرک می کشیم ببینیم خبر و مقاله جدید چی داری؟
بابا اینقد به من نگید پارسا
اسم من مرتضی هست !
:D
به محض اینکه سرم خلوت شه قسمت چهارم رو میزارم ;)

Mehdi
02-19-2006, 03:50 PM
در ضمن اگه ميشه مثال هارو هم از خودت بگوhttp://www.opera.5gigs.com/smiles/yahoo/65.gif
و از ماشين و موتور و دوچرخه مثال نزني فكر كنم دركش ساده تر باشهhttp://www.opera.5gigs.com/smiles/yahoo/107.gif

mbf
02-19-2006, 04:28 PM
در ضمن اگه ميشه مثال هارو هم از خودت بگوhttp://www.opera.5gigs.com/smiles/yahoo/65.gif
و از ماشين و موتور و دوچرخه مثال نزني فكر كنم دركش ساده تر باشهhttp://www.opera.5gigs.com/smiles/yahoo/107.gif

آره پارسا جان:rolleyes: :lol:
ای ببخشید اقا مرتضی

Parsa_361
02-24-2006, 06:31 PM
در ضمن اگه ميشه مثال هارو هم از خودت بگوhttp://www.opera.5gigs.com/smiles/yahoo/65.gif
و از ماشين و موتور و دوچرخه مثال نزني فكر كنم دركش ساده تر باشهhttp://www.opera.5gigs.com/smiles/yahoo/107.gif
آره پارسا جان:rolleyes: :lol:
ای ببخشید اقا مرتضی
:lol:
چشم دفه بدی با آدم مثال میزنم ! :lol:

adnan
06-14-2006, 05:18 PM
آقا می تونی مطالب آموزشیت را اینجا هم بگذاری که سرجمع باشه ؟
www.irschool.com

ERR0R
07-24-2006, 10:56 PM
من کتاب دیباگران php رو گرفتم به درد میخوره؟

Parsa_361
07-25-2006, 08:37 PM
یه کتاب در سطح متوسط هست
ولی حرفه ای نیست !

ERR0R
07-26-2006, 11:14 PM
واسه کسی که تازه میخواد شروع کن چی خوبه خب

Parsa_361
07-27-2006, 03:08 PM
همین خوبه بخون ;)

paaghi
12-06-2006, 01:26 PM
دستتون درد نكنه
خيلي جالب بودن

HADEE16
04-16-2007, 03:27 AM
من تازه قسمت اول رو خوندم
ولی این قدر خوب بود که چرتم گرفت:p
شوخی کردم
قسمت اول رو خوندم گفتم تشکر کنم
بقیش باشه فردا شب:cool:
ممنون میشم ادامه بدی

vaheb
12-04-2007, 11:31 PM
همین خوبه بخون ;)
من ارادت خاصی نسبت به مرتضی دارم دستت درد نکنه !

alirezazzz
01-10-2008, 06:44 PM
سلام .جان من یه کمک کوچولو به من بکنید:
يك كدي داريم تو PHP كه سورس رو ميدي ، نام فايل ميدي ، كپي مي‌كنه،از هاست به هاست! من اون کد رو شدیدا لازم دارم اگه یه توضیح کوچیک هم بدید واقعا ممنونتون میشم.

damavandieh
04-22-2009, 12:11 PM
از دوستانی که بدون توقعی ، وقت می گذارند و یاد می دهند ، سپاسگزاری می کنم



چند مقاله جالب و مفید (و البته خنده دار و جذاب !! :D ) در مورد برنامه نویس شی گرا :

- مفاهیم پایه شی گرایی
(http://amir87.persiangig.com/document/JAVA%20OOP%20object%20class.pdf)
شامل : آشنایی با مفهوم شی ، کلاس ،سازنده ،کپسوله بندی و... به زبان بسیار ساده


- Polymorphism در PHP
(http://amir87.persiangig.com/document/Polymorphism.pdf)


نحوه استفاده از Interface ، ارث بری و... برای پپاده سازی Polymorphism

- مقاله ایجاد یک CMS با استفاده از PHP شی گرا
ساخت CMS با برنامه نویسی OOP


http://estakhrian.blogfa.com (http://amir87.persiangig.com/document/1LAST%20EDITON%20PHPOOP%20_CMS.pdf)

Parsa_361
04-23-2009, 01:11 PM
با سلام به دوستان خوبم
مقالاتی که تو این تاپبک گذاشتم مال سال 2005 هست
الآن شیء گرایی تو PHP خیلی دگرگون شده
سراغ مقالات جدید برید

1eng.ir
04-23-2009, 02:17 PM
با سلام به دوستان خوبم
مقالاتی که تو این تاپبک گذاشتم مال سال 2005 هست
الآن شیء گرایی تو PHP خیلی دگرگون شده
سراغ مقالات جدید برید
پارسا جون اگه مقاله جدید و توپ داری بذار دیگه ;)

hastia
12-08-2009, 05:26 PM
سلام برنامه date و اگه داری تا امشب یا فردا .... خلاصه دستت درد نکنه ....

نبودم اشکالی نداره برم خونه آموزش هایت را می خونم !

می خوام زمان و تاریخ و به صورت شمسی نمی دونم میلادی نشون بده ...

hastia
12-09-2009, 12:42 AM
اي بابا ...
اي بابا ...
آقايون خانوما ... هلپ !

positron x2
12-20-2009, 02:43 AM
آیا این آموزش از کتاب مرجع php4 نیست؟
باید خدمتتان بگویم که این کتاب برای php4 نوشته شده و برخی از امکانات php5 در این کتاب نیامده است.
من نمی دونم نسخه جدیدتر این کتاب اومده یا نه. اگر اومده دوستان نام سایت فروشنده رو بگند تا خریداری نماییم!!

OurPars
12-20-2009, 07:05 AM
پارسا جان مقاله تازها ندارید؟
:blush: