آژانس هواپیماییexchanging

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

شروع موضوع توسط Parsa_361 ‏26 آگوست 2005 در انجمن آموزش PHP به زبان فارسی

  1. Parsa_361

    Parsa_361 کاربر فعال صفحات داینامیک کاربر فعال

    تاریخ عضویت:
    ‏5 آگوست 2005
    نوشته ها:
    889
    تشکر شده:
    10
    محل سکونت:
    Isfahan, php.ini
    -
    دوستان عزیز توجه داشته باشید که این مقاله در سال 2005 نوشته شده. لطفاً از مقالات جدیدتر استفاده کنید.

    من با توجه به اينكه منبع های آموزش 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:
    class ClassName [extends  ParentclassName]
    {
            var 
    $member1
            var 
    $member2;
            
            

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

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


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

    هر جای این متن رو نفهمیدید بگید تا براتون توضیح بدم.
     
    Last edited: ‏17 اکتبر 2012
    nilord, n0o0b_sina, BryanAdams و 1 کاربر دیگر از این نوشته تشکر کرده اند.
  2. mamalionline

    mamalionline Registered User

    تاریخ عضویت:
    ‏5 ژانویه 2005
    نوشته ها:
    1,235
    تشکر شده:
    0
    محل سکونت:
    wp-config
    موفق باشي كارت قشنگ بود !
     
  3. Parsa_361

    Parsa_361 کاربر فعال صفحات داینامیک کاربر فعال

    تاریخ عضویت:
    ‏5 آگوست 2005
    نوشته ها:
    889
    تشکر شده:
    10
    محل سکونت:
    Isfahan, php.ini
    خواهش می کنم.
     
  4. Parsa_361

    Parsa_361 کاربر فعال صفحات داینامیک کاربر فعال

    تاریخ عضویت:
    ‏5 آگوست 2005
    نوشته ها:
    889
    تشکر شده:
    10
    محل سکونت:
    Isfahan, php.ini
    عزیزان حرفه ای فقط نگاه به این درس نکنن !
    در جلسات بعدی خیلی پیشرفته می شه !!
    مثلاً چند تا از چیز هایی که درس می دم اینا هستن :

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

    miladmovie مدیر بازنشسته کاربر فعال

    تاریخ عضویت:
    ‏25 دسامبر 2002
    نوشته ها:
    1,936
    تشکر شده:
    2
    می گم یک کاری کن ! هر چیزی می خواهی اضافه کنی به همون تاپیکت اولت اضافه کن که کسی که می خواد بخوندش پشت سر هم باشه !
    من هم میارمش بالای صفحه
     
  6. Parsa_361

    Parsa_361 کاربر فعال صفحات داینامیک کاربر فعال

    تاریخ عضویت:
    ‏5 آگوست 2005
    نوشته ها:
    889
    تشکر شده:
    10
    محل سکونت:
    Isfahan, php.ini
    خوب اگه این کارو بکنیم
    بقیه که می خوان نظر بدن وسط این آموزشا نظر می دن و بعد صفحاتش زیاد می شه وپیدا کردن آموزش ها سخت می شه !
    :questionm
    حالا چی کار کنم ؟
     
  7. appbannerkhuniresbanner
  8. Parsa_361

    Parsa_361 کاربر فعال صفحات داینامیک کاربر فعال

    تاریخ عضویت:
    ‏5 آگوست 2005
    نوشته ها:
    889
    تشکر شده:
    10
    محل سکونت:
    Isfahan, php.ini
  9. PersianPC

    PersianPC کاربر فعال صفحات داینامیک کاربر فعال

    تاریخ عضویت:
    ‏9 فوریه 2005
    نوشته ها:
    582
    تشکر شده:
    1
    محل سکونت:
    Tehran
    بشین خسته نشی ! میلاد به این زودیا پیداش نمیشه !
     
  10. babakweb

    babakweb Registered User

    تاریخ عضویت:
    ‏29 اکتبر 2003
    نوشته ها:
    1,757
    تشکر شده:
    36
    محل سکونت:
    Tehran
    چرا؟
    چرا پیداش نمی‌شه؟؟؟
    :)
     
  11. carp3

    carp3 کاربر تازه وارد

    تاریخ عضویت:
    ‏15 آپریل 2005
    نوشته ها:
    1,321
    تشکر شده:
    1
    آخه اینترنت گرونه
    راستی باحال بود امید وارم ادامه بدی
     
  12. Parsa_361

    Parsa_361 کاربر فعال صفحات داینامیک کاربر فعال

    تاریخ عضویت:
    ‏5 آگوست 2005
    نوشته ها:
    889
    تشکر شده:
    10
    محل سکونت:
    Isfahan, php.ini
    ممنون
    ببینم حالا نظر شما ها چیه ؟
     
  13. miladmovie

    miladmovie مدیر بازنشسته کاربر فعال

    تاریخ عضویت:
    ‏25 دسامبر 2002
    نوشته ها:
    1,936
    تشکر شده:
    2
    هر کاری دلت می خواد بکنی و می دونی درسته نظر من هم ولش کن !
     
  14. avajang.com .leftavajang.com.right
  15. Parsa_361

    Parsa_361 کاربر فعال صفحات داینامیک کاربر فعال

    تاریخ عضویت:
    ‏5 آگوست 2005
    نوشته ها:
    889
    تشکر شده:
    10
    محل سکونت:
    Isfahan, php.ini
    آقا میلاد می تونی نام تاپیک رو عوض کنی ؟
    مثلاً بذاری :
    آموزش برنامه نویسی شیء گرا با PHP - قسمت اول و دوم
    ؟
    یا تمام پستهای یک تاپیک رو منتقل کنی تو یه تاپیک دیگه ؟
    امکان پذیره ؟
     
  16. Parsa_361

    Parsa_361 کاربر فعال صفحات داینامیک کاربر فعال

    تاریخ عضویت:
    ‏5 آگوست 2005
    نوشته ها:
    889
    تشکر شده:
    10
    محل سکونت:
    Isfahan, php.ini
    :D
    آموزش برنامه نویسی شیء گرا با PHP - قسمت دوم آماده شد.
    :D

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

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

    Parsa_361 کاربر فعال صفحات داینامیک کاربر فعال

    تاریخ عضویت:
    ‏5 آگوست 2005
    نوشته ها:
    889
    تشکر شده:
    10
    محل سکونت:
    Isfahan, php.ini
    خوب، قرار شد تو همین تاپیک بزارم.
    اینم قسمته دوم.
    در این قسمت به ساخت یک کلاس بسیار ساده می پردازیم
    همچنین بیشتر در مورد شیء ها صحبت خواهیم کرد.


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

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


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


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

    آبجكت‌ها (Objects)

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


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


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


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


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


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

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

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

    samin.faraz کاربر تازه وارد

    تاریخ عضویت:
    ‏15 اکتبر 2005
    نوشته ها:
    1
    تشکر شده:
    0
    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
     
  19. Parsa_361

    Parsa_361 کاربر فعال صفحات داینامیک کاربر فعال

    تاریخ عضویت:
    ‏5 آگوست 2005
    نوشته ها:
    889
    تشکر شده:
    10
    محل سکونت:
    Isfahan, php.ini
    eeeeeeeeeee

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

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

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

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

    راستی فارسی بنویسید تا بتر به جواب برسین
     
    nilord از این نوشته تشکر کرده است.
  20. Parsa_361

    Parsa_361 کاربر فعال صفحات داینامیک کاربر فعال

    تاریخ عضویت:
    ‏5 آگوست 2005
    نوشته ها:
    889
    تشکر شده:
    10
    محل سکونت:
    Isfahan, php.ini
    :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:
    <?php
    include_once(./Text Field.php”);
    include_once(
    ./SubmitButton.php”);
    هنگام توسعه كلاسهاي كارخانه ، تمرين خوبي خواهد بود اگر كلمه “Factory” را به انتهاي نام كلاس اضافه كنيد كلمه “Factory”تبديل به يك قرارداد مشترك در دنياي شيء گرايي شده است و به برنامه‌نويسان ديگر كمك خواهد كرد تا از اين واژه شناسي مشترك تشخيص دهند كه كلاس چه كاري را انجام مي‌دهد :
    PHP:
    // FormControl Factory.php
    class FormControlFactory 
    {
    اين اولين متد كارخانه ما ، يعني createTextField() مي‌باشد و به سادگي يك نمونه جديد از كلاس TextField را با انتقال $name و $value تأمين شده توسط سرويس گيرنده ، ايجاد مي‌كند :
    PHP:
    function createTextField($name,$value)
    {
    return new 
    TextField($name,$value) ;
    }
    متد createSubmitButton() به همان روش تعريف شده است . همچنين يك قرارداد مشترك براي اتصال كلمه “create” به ابتداي متد كارخانه براي مشخص كردن شيء جديدي است كه بر مي‌گرداند . اين يك واژه سازي مشترك را در برنامه كاربردي شما ايجاد خواهد كرد و فهم كد شما و سطح قابل رديابي شدن (traceability) آن را افزايش خواهد داد :
    PHP:
    function createSubmitButton($name,$value)
    {
    return new 
    SubmitButton ($name,$value) ;
    }
    }
    حال بتجاي اين كه آبجكت‌هاي TextField و SubmitButton را با استفاده از اپراتور جديد براي اولين مرتبه معرفي كنيم ، مي‌توانيم از Form Control Factory براي انجام اين كار استفاده كنيم :
    PHP:
    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 (سازنده) ماكليد و موتور را براي روشن كردن اتومبيل شناسايي نمي‌كند :
    $
    PHP:
    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 مورد توجه قرار دهيد.) اتومبيل از روشن شدن باز مي‌ايستاد ، زيرا موتور نيز شناسايي نمي‌شد . حتماً خواهيد توانست اين اشكالات را به آساني برطرف كنيد ، اما آنها نبايد در اولين وهله رخ دهند . سپس سعي مي‌كنيم اتومبيل را روشن كنيم :
    PHP:
    $car->speed=400;//should have been $car ->setSpeed(400); to cause // a failure 
    $car->start($myKey);
    هنگامي كه اتومبيل روشن مي‌شود به جلو رانده مي‌شود و سرعتش به 400km/h خواهد رسيد . اين مي‌تواند باعث تصادف و كشته شدن مردم در جاده (يا خارج از آن) شود . اين يقيناً آن چيزي نخواهد بود كه ما مي‌خواهيم .
    اتومبيل از كجا مي‌داند كه به چه كليدي براي روشن كردن اتومبيل نياز دارد ؟ بايد كليد ساخته شده را با متغيري كه حتي وجود ندارد مقايسه كند (و نتيجه‌اي برابر 0 در برداشته باشد) و در نهايت در روشن كردن اتومبيل با شكست مواجه خواهد شد . مقايسه‌اي نظير اين مستقيماً به چك كردن مفسر مربوط مي‌شود ، چرا كه $key ورودي است كه برابري را چك مي‌كند و نه عضو را . براي مالك اتومبيل خجالت‌آور خواهد بود اگر كه يك وسيله نقليه جديد بخرد و تازه بفهمد كه كليد ارائه شده توسط فروشنده هرگز كار نكرده است . بياييد ببينيم كه چه اتفاقي خواهد افتاد اگر بخواهيم هنگامي كه engine را روي 0 تنظيم كرده‌ايم ، اتومبيل را خاموش كنيم :
    PHP:
    $car->engine=0
    $car
    ->stop();
    هنگامي كه متد stop() فراخوانده مي‌شود . با يك خطاي زمان اجرا مواجه خواهيم شد ، چرا كه آبجكت Engine با اينكه حتي وجود ندارد ، آن را وادار به پذيرفتن مقدار integer كرده‌ايم . چنانكه مي‌بينيد ، تنظيم اعضا از خارج كلاس احتمالاً مي‌توانست مشكلات فراواني را به بار بياورد . در دنيايي كه چندين برنامه‌نويس را در حال كاركردن بر روي يك پروژه داريد ، بايد انتظار داشته باشيد كه بقيه بتوانند كد شما را بخوانند و احتمالاً از آن استفاده كنند .
    چه درسهايي از اين مثال آموختيم ؟ استفاده از اعضا در خارج از آبجكت (object violations) مي‌تواند :
    • عدم اطمينان از اينكه سرويس‌هايي كه به وسيله آبجكت فراهم شده‌اند ، به گونه‌اي كه از آنها انتظار داريم رفتار نمايند .
    • عدم جامعيت (integrity) اعضاي داده آبجكت (يا وضعيت آبجكت) در يكي از دو روش زير :
    • تخطي از تعيين وضعيت ابتدايي اعضاء
    • ايجاد واسطهايي پيچيده‌تري نسبت به آن چه كه شما واقعاً نياز داريد .
    • مسئوليت سنگين‌تري روي دوش برنامه‌نويسان بگذارد تا بيشت درباره آبجكت و روشي كه داده با سرويس‌ها كار مي‌كند ، فكر كنند .
    • هنگامي كه زمان استفاده مجدد از آبجكت فرا مي‌رسد ، ممكن است مجبور باشيد اعضا را مجدداً تغيير دهيد . گاهي به غير از فراموشكاري ، خطاهاي جديدي در پروژه بعدي ايجاد خواهيد كرد . اين دقيقاً چيزي است كه مي‌خواهيم از آن دوري گزينيم .


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



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

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

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

    daftarekhaterat Registered User

    تاریخ عضویت:
    ‏2 جولای 2003
    نوشته ها:
    4,974
    تشکر شده:
    39
    محل سکونت:
    در قلب پاك او
    من خيلي استعدادم زياد نيست. سعي ميكنم كم كم بخونم... [​IMG]
    خسته نباشين. :)
     
  22. Parsa_361

    Parsa_361 کاربر فعال صفحات داینامیک کاربر فعال

    تاریخ عضویت:
    ‏5 آگوست 2005
    نوشته ها:
    889
    تشکر شده:
    10
    محل سکونت:
    Isfahan, php.ini
    mer30 :D

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