سلام به همه دوستان. من خیلی وقت بود این طرفا نیومده بودم، چون این تالار اون موقع فعال نبود. ولی الان می بینم که بحث و جدل شروع شده. :wink:
:idea: خوب PHP چقدر تونسته مفاهیم OO رو تو خودش پیاده کنه؟
من در اینجا اجمالا به بررسی ویژگیهایی که نوعا در زبانهای OOP وجود داره می پردازم و بعد در مورد اینکه سهم PHP این وسط چیه توضیح می دم.
فقط این نکاتی که من در اینجا ذکر میکنم بیشتر به درد کسانی میخوره که از یک زبان OO به PHP سوئیچ کردند.
Single Inheritance(وراثت یگانه)
خوب در این زمینه PHP اجازه میده که با استفاده از عبارت extends، تعریف یک کلاس از کلاس دیگه به ارث برسه. که کلاس فرزند(Child Class) هم مشخصه ها و هم رفتارهای کلاس مادر(Parent Class) رو به ارث می برد.
Multiple Inheritance(وراثت چندگانه)
در این زمینه در نسخه فعلی PHP تمهیداتی در نظر گرفته نشده و مفهمومی از وراثت واسطه که در جاوا وجود دارد، دیده نمی شود. هر کلاس حداکثر وارث یک کلاس مادر است.
Constructors(سازنده ها)
هر کلاس میتونه یه تابع سازنده داشته باشه.(تابع سازنده تابعی هست که با نمونه سازی از کلاس به صورت خودکار اجرا میشه و معمولا برای مقداردهی اولیه به Property های کلاس به کار میره.) در Zend Engine 1 یا نسخه فعلی PHP این تابع سازنده مشابه نام کلاس هست. در نسخه های آینده PHP که قراره ZE2 رو در بربگیره، تابع سازنده هر کلاس __construct()
نامیده می شود. سازنده های کلاسهای مادر بصورت اتوماتیک فراخوانی نمی شوند اما باید صریحا احضار بشوند.
Destructors(تخریب کننده ها)
در ZE1 تابع تخریب کننده نداریم، بیشتر به این خاطر که آزاد سازی حافظه در PHP در اختیار برنامه نویس نیست. اما این امکان در نسخه های آینده حتما لحاظ میشه. 8)
Encapsulation (کپسوله سازی / کنترل دسترسی)
در ZE1 این امکان رو نداریم. :( تمام مشخصه ها و رفتارها بصورت Public هستند. ولی نگران نباشید چون در ZE2 مشخصه های Private لحاظ خواهد شد. :wink:
Polymorphism/Overloading(چند ریختی/ بارگذاری اضافه)
PHP از پلی مرفیسم تا در این مفهوم که نمونه زیر کلاسها بجای نمونه های والد استفاده بشوند، پشتیبانی میکند. متد صحیح در زمان اجرا فرستاده میشود. پشتیبانی از Method Overloading که dispatch بر اساس امضای متد صورت میگیرد، وجود نداره. اگرچه PHP به دلیل weak type بودن و پشتیبانی از تعداد مختفی از آرگومانها باعث شبیه سازی این حال میشود.
Early vs. late binding
1) اصلا این سوال پیش نمی یاد، چون PHP به قولی Loosley Type هست. 2) تمام بایندینگ ها Late هستند. :shock: در PHP مقادیر نوع دار هستند اما متغیرها چنین نیستند. بنابراین هیچ سوالی در این زمینه که چه متدی بر حسب نوع متغیر صدا بشه وجود نداره.
Static Functions (توابع ایستا)
پشتیبانی صریحی از توابع ایستا یا Class functions وجود نداره. اما میشه با Syntax زیر یک متد رو بدون رجوع به نمونه فراخوانی کرد.
Classname::function()
با چنین تابعی می شه بعنوان یک تابع کلاس رفتار کرد تا جایی که به مشخصه ها رجوع نکنه.
Introspection(درون نگری)
به به. PHP در این زمینه دست پر داره. گستره ای از توابع برای اینکار وجود داره که میشه نام کلاسها، نام متدها و مشخصه ها را از یک نمونه(Instance) بازیابی کرد.
فعلا همین. ولی PHP 5.0 در زمینه OOP حرفای زیادی برای گفتن داره. باید منتظر شد و دید که تا چه حد مفاهیم جاوا قراره پیاده سازی بشه.
فکر کنم با اومدن PHP 5.0، دات نت همچین جفت کنه! :)
در ضمن این رو هم بگم که اگه دوستی این مطالب رو کامل نمی دونه زحمت ارسال پاسخ رو بکشه شاید گفته های من کامل نباشه و یا اصلا غلط باشه.