مقاله : شیی گرایی در پی اچ پی

Iauksh
با سلام
یکی از اشکاتلاتی که من دیدم خیلی ها می گویند این است که پی اچ پی شیی گرای کامل نیست؟
دفاعی دارید؟
با تشکر

Iauksh
مگه اینجا دادگاهه که دفاع کنیم؟

امکانات موجود شیءگرایی در PHP برای مقاصد Web Development کافی هستند.

Iauksh
منظورم از اون دفاعا نبود بلکه فقط واسه اطلاعات خودم می خواستم :P
در ضمن شما مثل اینکه خودتان هم قبول دارید که شیی گرایی آن ضعیف است پس در هر حال این یک ضعف است نه؟ :lol:
در هر حال متشکرم :lol:

Iauksh
پس در هر حال این یک ضعف است نه؟
خیر.
کمبودهای امکانات شیءگرایی در نسخه 5 php برطرف شده اند (گرچه این ضعف در ویژوال استودیو نیز در نسخه 8 ببعد یعنی نسخه 2002 برطرف شده است).

Iauksh
آیا کامل برطرف شده اند؟
در ضمن آیا می شود یه مقاله ی خوب در مورد پی اچ پی 5 معرفی کنید

Iauksh

Iauksh
سلام به همه دوستان. من خیلی وقت بود این طرفا نیومده بودم، چون این تالار اون موقع فعال نبود. ولی الان می بینم که بحث و جدل شروع شده. :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، دات نت همچین جفت کنه! :)

در ضمن این رو هم بگم که اگه دوستی این مطالب رو کامل نمی دونه زحمت ارسال پاسخ رو بکشه شاید گفته های من کامل نباشه و یا اصلا غلط باشه.

Iauksh
با عرض ادب:
بابا کارت درسته...
یکی دو نفر از این آدم های پایه هر بخشی داشته باشه وضعش رله ست.
امیدوارم حوصله ات به این زودی ها سر نره و به نوشتن این مقالات ادامه بدهی.

در مورد oop در یک web application حقیقت من هنوز زیاد فکر نکرده ام( مطلبی هم نخوانده ام) ولی نمی توانم تصوری از develop یک web application آن هم 100٪ بر پایه objective داشته باشم. به عنوان نمونه کاربردی از encapsulation در آبجکت های ساخته شده در php به ذهنم نمی رسد . تا آنجایی که من دیده ام در NET. هم بیشتر از کلاس های آماده استفاده می کنیم. اما دوستانی که کار حرفه ای شیء گرا در برنامه نویسی desktop کرده اند(به خصوص کسانی که کل برنامه خود را ابتدا به زبان UML طراحی می کند) مفهوم واقعی oop را می دانند و قبول دارند که فراتر از این حرف هاست. با توجه با ساختار اجرایی script های server side برای من کمی درک پیاده سازی objective یک application در آن ها ثقیل است.(شاید به این خاطر هم باشد که تا به حال سراغ پیاده سازی 100٪ oop در script هایی مانند php نبوده اند)
اگر بحث یا مثال نقضی به نظرتان می رسد لطفا مطرح کنید.

یه عشق برنامه نویسی خفن

Iauksh
اینم شاید خونده باشین (از ایران پی اچ پی)
منم خوشحالم که بخش پی اچ پی داره جـــــــــون میگیره :mrgreen:
http://www.iranphp.net/modules/news/article.php?storyid=54

مایکروسافت چه سرمایه گزاری داره میکنه برای که کاربرها رو راضی کنه که رو به ASP.NET بیارن، چند وقت پیش که یه راهنما نوشته بود واسه این که از PHP برنامه ها رو تبدیل کنن به ASP.NET ، حال هم که اومده اصلا یه برنامه نوشته که این کار رو بکنه ، حق هم داره ، یک سال یا شاید ۲ سال دیگه که parrot بیاد باید کاسه کوزه .NET رو جمع کنه بره پرهلو بفروشه . تو کنفرانس PHPغرب هم ظاهرا خبرایی بوده در مورد parrot و اینجور که پیداست قراره پایه PHP6 همین parrot باشه اونوقته که دیگه توی php میشه کتابخانه های Perl و یا Python رو هم صدا زد و همینطور برعکس

Iauksh
با عرض ادب:
آقا من به یک مشکل اساسی برخورد کرده ام که نیازمند کمک و نظر شما هستم.:roll:
خیلی جاها (به خصوص توی این فروم) شده که من یک چیزی نوشتم اصلا هیچ کی جوابی بهش نداده مثل همین پست دوتا بالاتر. بعضی وقت ها هم بالکل در اون تاپیک گل گرفته شده و دیگه کسی توش چیزی ننوشته. :cry:
می خواستم ببینم مورد از طرز نوشتن منه (یعنی باخودتون می گین این شر و ور ها چیه دیگه این نوشته) یا اینکه واقعا نظری ندارید؟ :?:

یه عشق برنامه نویسی خفن