آشنایی با زبان PHP

 

PHP و برنامه نویسی شی گرا

PHP تا چه حد شی گراست؟! آیا تمام امکاناتی که در زبانهای برنامه نویسی شی گرای کاملی همچون Java وجود داره، در PHP هم پشتیبانی میشه؟! پاسخ به این سوال تا حدی بر میگرده به معیارها و شرایطی که شما برای شی گرا بودن یک زبان مدنظر دارید. در این پست من سعی میکنم امکاناتی که نوعا در یک زبان برنامه نویسی شی گرا وجود داره رو بررسی کنم و حرفایی که PHP در هر مورد برای گفتن داره رو تا حدی توضیح بدم. (این راهنما بیشتر برای کسانی هست که از زبانهای OO دیگری میخوان به PHP روی بیارن

وراثت یگانه(Single Inheritance):

PHP به شما اجازه میده که با استفاده از عبارت extends یک کلاس فرزند تعریف کنید که تمام مشخصه ها و رفتارهای کلاس والد رو دارا هست.(تعریف یک کلاس، از کلاس دیگه به ارث می رسه.

وراثت چندگانه(Multiple Inheritance):

PHP از وراثت چندگانه پشتیبانی به عمل نمی یاره و هیچ نشانی از وراثت واسطه که در جاوا وجود داره دیده نمیشه. هر کلاس حداکثر یک کلاس والد خواهد داشت.

سازنده ها(Constructors):

هر کلاس می تونه یک تابع سازنده داشته باشه که در نسخه فعلی PHP که از Zend Engine 1 بهره می بره، باید همنام کلاس باشه. در نسخه بعدی PHP که مجهز به ZE2 می باشد، تابع سازنده هر کلاس ()construct__ نام خواهد گرفت. تابع سازنده کلاسهای والد به طور اتوماتیک فراخوانی نمی شن مگر اینکه صریحا احضار بشن!

تخریب کننده ها(Destractors):

نسخه فعلی PHP (با ZE 1) تابع تخریب کننده نداره، بیشتر به این خاطر هست که آزاد سازی حافظه و برگرداندن حافظه تخصیص یافته دست برنامه نویس نیست. اما نسخه های بعدی تابع تخریب کننده را دارا می باشد.

کپسوله سازی و کنترل دسترسی(Encapsulation):

هیچ پشتیبانی از کپسوله سازی در نسخه جاری PHP به عمل نیومده و تمام مشخصه ها و رفتارها Public هستند، اما تو نسخه بعدی دو نوع Private و Protected افزوده شده است.

چند شکلی(Polymorphism):

PHP چند شکلی رو به این صورت پشتیبانی میکنه که اجازه میده نمونه کلاس های فرزند به جای نمونه کلاسهای والد استفاده بشه.

اتصال دیر یا زود(Early vs. late binding)

دو پاسخ مناسب به این موضوع به قرار ذیل هست:


۱) از اونجایی که PHP یک زبان Loosely Type هست، این سوال پیش نمی یاد.

۲) تمام اتصالات Late هستند. در PHP مقادیر دارای نوع هستند ولی متغیرها بی نوع هستند، بنابراین این سوال که اگه نوع متغیر و مقدار متفات باشه کدوم متد فراخوانی بشه، به وجود نمی یاد.

توابع ایستا(Static Functions)

پشتیبانی صریحی از Class Functionها وجود نداره اما میشه که با استفاده از سینتکس ()Classname::function میشود تابع یک کلاس رو فراخوانی کرد. این تابع تا وقتیکه به یک متغیر داخلی ارجاع نکنه ، به عنوان یک Class Function در نظر گرفته میشه.

درون نگری(Introspection):

در این مورد PHP با دست پر ظاهر شده و توابع متنوعی برای کسب اطلاعات در مورد یک کلاس وجود داره، مثلا بازیابی نام کلاس، نام یک تابع، نام متغیرهای(مشخصه های) یک نمونه کلاس و ...

 اغلب از مفهوم شئ گرایی در زبان مورد علاقه ما چشم پوشی می شود یا به غلط تفسیر می شود ولی اگر به طور صحیح بکار گرفته می شود خیلی هم قوی به نظر می رسد. آینده PHP درباره شئ گرایی بسیار روشن است این از خصوصیات جدیدی که در PHP5 گنجانده شده کاملأ مشخص است. با ابزار مناسب تنها چیزی که لازم داریم دانش است. در این مقاله سعی شده که مفهوم واقعی شئ را بررسی کنیم و اینکه چه جوری اونها را شناسایی کنیم همچنین سعی شده ما را با سه رکن اصلی OOP یعنی کپسوله کردن، ارث بری و پلی مورفیسم بیشتر آشنا کند.
 
برنامه نویسی شئ گرا همانطور که از اسمش هم پیداست برنامه نویسی با اشیاء است. ولی خوب معنی دقیق شئ چیه؟

بذارید اول بگم شئ چی نیست! شئ فقط یه کلاس نیست که یه مشت تابع داخلش ریخته باشن. شاید به نظر بدیهی بیاد ولی واقعیت اینه که وقتی آدم مقوله OOP رو در یه زبان رویه ای مثل PHP کشف می کنه هیجان زده میشه که زودتر استفادش کنه بدون اینکه از تئوری اولیه اون خبر داشته باشه!

 حالا شئ چیه؟

شئ موجودیتی است که خصوصیات(properties) و رفتارهایی را (behavior) در خودش کپسوله می کند که مخصوص همان موجودیت است.

 شاید به نظر عجیب بیاد ولی اشیاء دور و ور ما هستند. بعضی خودشون از اشیاء دیگری تشکیل شدن. روزنامه دستتون، پنجره اتاق خود اتاق در دیوار...

 ولی درباره OOP بعنوان یک مفهوم چیزای زیادی هست که باید بدونیم. در طول این سالها (کدوم سالها؟!) متدلوژیهای مختلفی برای نزدیک شدن به شئ گرایی توسعه یافتند، حتی می شه به سه مرحله تقسیمش کرد: تحلیل شئ گرا(OOA)، طراحی شئ گرا(OOD) و برنامه نویسی شئ گرا(OOP) که برای تبحر در هر کدومشون وقت زیادی لازم است مثلا مدلهای طراحی هنوز بدجوری رویه ای هستند. می دونید فقط syntax نیست که مهم هست در واقع قسمت سخت ماجرا شئ گرایانه فکر کردن و تمرین کردن و در نهایت بکارگیری هست. نگذارید این واقعیات شما رو دلسرد کنه چون یادگیری مفاهیم قسمت اعظم موضوعه (که لابد تو این مقاله قراره یاد بگیریم)
 
شئ گرایی مزایای زیادی داره از جمله: استفاده دوباره، توسعه پذیری و نگهداشت پذیری که مهمترین اونها هستن.

استفاده دوباره: اشیاء می توانند رو پای خوشون بایستند یعنی مجردند؛ و نشاندهنده یک چیز هستند. به این معنی که می توانند به گونه های مختلف ترکیب شوند، که این همون خاصیت استفاده دوباره را ایجاد میکند. استفاده دوباره از اشیاء کلی توی وقت ما صرفه جویی میکنه چون مجبور نیستیم همه چیز و از اول بسازیمتوسعه پذیری: بجای نوشتن یک شئ از اول ما می تونیم یک شئ را گسترش بدیم. یه شئ می تواند از یک شئ دیگر مشتق شود و فقط کارایی هایی را که لازم است به شئ جدید بیفزاییم.

نگهداشت پذیری: طبیعتأ اشیاء چون خوانایی بالایی دارند، خیلی راحتتر تحلیل میشوند و خیلی بهتر میتوان از برنامه های موجود توسعه اشون داد و اینکه طبیعت "pluggable" دارند کد کمتری برای ویرایش اونها لازم است.

تصور غلط درباره بکارگیری OOP در PHP

قبل از ادامه بحث دوست دارم یه مقدار درباره این موضوع که PHP 4 شئ گرایی را پشتیبانی نمی کند صحبت کنم. بریم سر اصل مطلب:

فقدان وجود کنترلهای دستیابی: گرچه این در php5 تغییر میکنه (private, public و protected اضافه خواهند شد) به عقیده بنده این پارامتری نیست که جلوی ما را در بکارگیری OOP بگیره، کنترلهای دستیابی به هیچ وجه به منظور ایجاد امنیت بوجود نیامدند، بلکه برای کمک کردن به برنامه نویس درست شدند که برنامه نویس لازم نباشه نگران باشه که تصادفی به اعضایی دسترسی پیدا شود که نباید دست بخورند. فقط باید حواسمون رو بیشتر جمع کنیم. اینکه مفسر برنامه این اجازه را از شما نمی گیره به این معنا نیست که شما تئوری oop رو نمی تونید بکار بگیرید.

فقدان کلاسهای مجرد: بازهم این نمی تونه شما رو از کدنویسی شئ گرا باز نگه داره حتی در تئوری! اساسأ یک کلاس مجرد به این معناست که شما باید در هنگام ایجاد زیرکلاسها متدهای مجرد پیاده سازی کنید، و قادر نباشید از آن instance بسازید(خدا وکیلی اینو خودم هم نفهمیدم چی گفت). بعضی از زبانها مثل جاوا بصورت built-in این موضوع را پشتیبانی می کنند که خیلی خوبه ولی بدون اون هم زندگی غیر ممکن نیست! بسادگی میشه یک متد خالی در superclass رو در زیر کلاسها override کنید.(که در قسمت پلی مورفیسم نشان خواهم داد چگونه.(

 عدم پشتیبانی از ارث بری چندگانه: گرچه بعضی اعتقاد دارند که ارث بری چندگانه مفید هست ولی به عقیده من فقط ایجاد ابهام میکند. شما چندتا مثال سراغ دارین که در آن یک شئ از دو یا چند superclass ارث ببره و هنوز بتونه رابطه is-a را حفظ کنه (اگر معنی این رابطه را نمی دانید من پایینتر توضیح دادم).گرچه عقاید متفاوتند ولی من فکر نمی کنم این محدودیتها کاملا قابل چشم پوشی هستند و اصلأ دلیل خوبی برای ترک شئ گرایی درphp نیستند.

 
 
درک اشیاء وقتی داریم تکنیک های جدید برنامه نویسی را یاد می گیریم، معمولأ خوبه که از نمونه های دنیای واقعی کمک بگیریم. اینجا می تونیم یک ماشین را در نظر بگیریم. فکر کنید یک ماشین چه چیزهایی دارد(properties) و چه کارهایی می تواند انجام دهد(behaviour) .چیزهایی که ماشین دارد: properties)) پنجره  در  چرخ موتور در اینجا لازم به ذکر است که که properties خودشون می توانند شئ باشند با properties و behaviour خودشان. در شئ گرایی این ترکیب نام دارد. شما می توانید

بگویید که ماشین تشکیل شده از... و حتی پا را فراتر بگذارید و بگویید که هر شئ هم از اشیاء دیگر تشکیل شده و .... ولی در موقع برنامه نویسی سعی کنید فقط چیزهایی را تعریف کنید که بدرد میخورند و بیخودی وارد جزئیات نشوید.

 خوب بریم ببینیم یک ماشین چه کار می تواند بکند:

 شتاب بگیرد

 ترمز کند

 درها باز شوند

 این رفتارها مخصوص خود ماشین هستند. شما باید قادر به تشخیص اشیاء در واقعیت باشید تا بتوانید خوب از معماری شئ گرا استفاده کنید واقعأ احمقانه نیست که در زندگی عادی شئ گرا فکر کنیم. کل عالم از اشیاء تشکیل شده، سعی کنید اشیاء را شناسایی کنید!

 رکن اول: کپسوله کردن

از اینجا به بعد باید از یک زاویه دیگه به قضیه نگاه کنیم. آیا یک ماشین می تواند خودش براند؟ البته که نه، وقتی شئ گرا نگاه کنیم خود راننده یک موجودیت جداست.

خیلی مهم است که این تفاوت را حس کنیم: اشیاء باید مسوولیت های خودشان را داشته باشند. اونها فقط باید قادر باشند کارهای خودشان را انجام بدهند و نه چیزی بیشتردر واقع property های یک شئ فقط باید تحت تأثیر رفتارهای همان شئ تغییر کنند. اینکه یک شئ مستقیمأ بتواند روی property های شئ دیگر تأثیر بگذارد بکلی غلط است. یک شئ باید جزئیاتش را برای خودش حفظ کند و آنچه که بروز می دهد فقط interface اش باشد و یک شئ دیگر فقط به جزئیات آن شئ از طریق این  interfaceمی تواند دسترسی داشته باشد. وقتشه که این تئوری را ازطریق یک کد بازگو کنیم: یک کارخانه اتومبیل می خواهد اتومبیل بسازد ولی فقط در سه رنگ:

قرمز، آبی و سبز. برای اینکه بدونید مسوولیت یعنی چی من اعتراف می کنم مثال اولم مثال خوبی نبود! در ضمن syntaxبرنامه ربطی به من نداره می تونید php manual را تحت عنوان Class/object functions مطالعه کنید.

<?php
        class Car
        {
        var $color;
        }

        $specificCar = new Car();
        $specificCar->color = "yellow";
        ?>

 

ادامه در یادداشت زیر...