اولین قسمت آموزش شی گرایی در PHP را با مقدمات و همچنین کلاس و آبجکت ها شروع می کنیم.
برنامه نویسی شی گرا یا همان Object-Oriented یک سبک یا الگو نوشتن کدهاست که به توسعه دهنده ها اجازه می دهد تا بخش های مشابه به هم را در مفهومی به اسم کلاس (Class)، گروه بندی نمایند.
در واقع این گروه بندی به برنامه نویسان کمک خواهد کرد که به مفهوم DRY یا همان Don’t Repeat Yourself بیشتر نزدیک گردند، مضاف بر اینکه کدهای آن ها بسیار برای نگهداری و تغییر راحت تر خواهد بود. (Easy-to-Maintain).
یکی از مهم ترین مزیت های این سبک از کدنویسی، این می باشد که اگر قرار باشد تکه ای از داده های برنامه شما تغییر یابد، عموما لازم است فقط یک بخش در کدهای شما بروز رسانی گردد.
مهم ترین مزیت برنامه نویسی شی گرا که باعث شده است اکثر توسعه دهنده ها از آن استفاده کنند، شبیه سازی برنامه نویسی با مفاهیم دنیای واقعی است.
در واقع شما مفاهیم بسیار پیچیده برنامه نویسی را می توانید با مفاهیم شی گرایی به مفاهیم جاری و قابل فهم در دنیا واقعی تبدیل کنید.
همین طور که می دانید، اطراف ما از اشیا (Object
) مختلف تشکیل یافته است. هر کدام از آن ها خواصی (Property
) دارند که آن را از شی مشابه خود، متفاوت می کنید. ضمن اینکه ارتباط بین اشیا با فرستادن پیام بین همدیگر برقرار می گردد.
هر شی می تواند رفتاری از خود بروز دهد که مختص همان شی می باشد. این مفاهیم باعث شد تا همه این ها در مفاهیم برنامه نویسی شی گرا استفاده شود.
در پروژه هایی با ابعاد بزرگ و پیچیده، مسلما باید از الگوهای شی گرا در برنامه نویسی استفاده کرد چرا که هم باعث کاهش پیچیدگی کدها در آینده خواهد شد و هم توسعه و عیب یابی آن به مراتب ساده تر از روش های برنامه نویسی رویه ای می باشد.
حالا که بصورت تئوری متوجه شدیم که شی گرایی چی هست و چرا باید به سمت شی گرایی در PHP بریم, شروع کنیم بصورت کاربردی نحوه کد زدن با آن را یاد بگیریم.
چطور یک کلاس (Class) بسازیم؟
برای ساخت یک کلاس، ما تمام کدهای مربوط به یک بخش را در یک جا قرار میدیم.
بطور مثال می توانیم تمام کدهای بخش کاربران یک وبلاگ در یک Class
قرار بدیم، همه کدهای مربوط به انتشار پست های جدید در کلاس دیگر و همه کدهای مرتبط با بخش کامنت ها هم در کلاس سوم.
برای نامگذاری کلاس، از یک اسم لاتین با حرف اول بزرگ استفاده می کنیم. برای مثال، می توانیم تمام کدهای هندل بخش کاربران را در کلاس User
قرار بدیم، بخش پست ها در کلاس Post
و کامنت ها هم در کلاس Comment
در مثال زیر ما یک کلاس Car
ایجاد کردیم که همه کدهای مربوط به ماشین ها رو داخلش قرار دادیم.
1 2 3 |
class Car { // The code } |
کلاس ها را با کلمه کلیدی class تعریف می کنیم و بنابر استاندارد موجود، حرف اول نام کلاس را بصورت حروف بزرگ قرار میدیم.
اگر نام کلاس بیشتر از یک کلمه بود از استاندارد upper camel case بهره می بریم. مثلا JapaneseCars
, NetParadis
, AmericanTour
من کلاس را که شامل کدهای ما هست داخل آکولاد {}
میزاریم.
چطور خواص (properties) یک کلاس را تعریف کنیم؟
به متغییرهای تعریف شده در کلاس property میگیم. پراپرتی ها می توانند مقادیر رشته (string
)، عددی(integer
)، بولین(true
/false
) و دگیر مقادیر متغییرها رو بگیرید.
حالا چندتا خاصیت رو به کلاس Car اضافه می کنیم.
1 2 3 4 5 |
class Car { public $comp; public $color = 'red'; public $hasSunRoof = true; } |
از کلمه کلیدی public
برای تعریف property
ها استفاده می کنیم.
استاندارد نامگذاری متغییرها با حروف کوچک شروع می شود.
اگر نام بیشتر از یک کلمه بود، همه کلمات بجز کلمه اول با حروف اول بزرگ هستند. مثلا $color
, $hasSunRoof
هر خاصیت می تواند مقداری پیش فرض بگیرد مثلا $color = “red”
یا اینکه مثل $comp
در مثال بالا هیچ مقدار پیش فرضی نداشته باشند.
چطور از کلاس یک آبجکت بسازیم؟
می توانیم از یک کلاس یکسان چندین آبجکت بسازیم که مقادیر property خاص خود را داشته باشد.
برای کار با کلاس ها ما نیاز به ساخت object از آن هستیم و برای اینکار ما از کلمه کلیدی new
استفاده می کنیم.
1 |
$bmw = new Car(); |
آبجکت $bmw را با کلمه کلیدی new از کلاس Car ساختیم.
به روند ساخت شی (object) از کلاس را نمونه سازی (instantiation) می گیم.
همچنین می توانیم از یک کلاس چندین شی مختلف بسازیم.
1 2 |
$bmw = new Car(); $mercedes = new Car(); |
در واقع می توانیم چند شی متفاوت از یک کلاس بسازیم و بعد به هر کدام مقادیر متفاوتی از property ها رو بدیم.
آبجکت ها به چه دردی میخورند؟
در سبک برنامه نویسی رویه ای (procedural)، همه توابع و متغییرها در اسکوپ همگانی (global scope) قرار دارند و می توان فقط با زدن نامشان فراخوانی کرد ولی با استفاده از کلاس ها همه چیز داخل همان کلاس قرار دارد و از اسکوپ همگانی مخفی است.
به این دلیل که کدهای داخل اسکوپ کلاس، کپسوله شدند و خارج از آن قابل دسترس نیست.
برای همین برای استفاده از این کدهای داخل کلاس نیاز به ساخت شی (object) داریم.
از کلاس Car
ما انواع آبجکت هایی با نام های Mercedes
, Bmw
, Audi
ساختیم.
اگرچه همه شی های ساخته شده از کلاس یکسان هست و به متدها (توابع) و خاصیت ها(متغییر) های کلاس دسترسی داریم، ولی مقادیر آن متغییرها می تواند متفاوت باشند.
برای مثال، در عکس بالا، هر کدام از ماشین ها رنگ های مختلفی دارند.
یک کلاس همه پراپرتی ها و متدهای خود را با تمام آبجکت هایی که ازش ساخته می شوند به اشتراک می گذارد.
اگرچه آبجکت ها از کد یکسان استفاده می کنند ولی به دلیل اینکه هر کدام ورودی متفاوتی می گیرند ممکن است خروجی مختلفی هم داشته باشند.
چطور خاصیت های آبجکت را دریافت کنیم.
همینکه یک آبجکت را ساختیم، می توانیم خاصیت (property) آن را بگیریم. برای مثال :
1 2 |
echo $bmw -> color; echo $mercedes -> color; |
برای گرفتن پراپرتی کافیه نام متغییر آبجکت را به همراه علامت دش و بزرگت از (->
) و بعد نام پراپرتی تایپ کنیم.
توجه کنید نام property با $ شروع نمی شود و فقط نام آبجکت را با $
می نویسیم.
خروجی :
Red
Red
چطور مقادیر خاصیت شی را ست کنیم؟
برای این کار کافی هست مثل همان روش دریافت مقدار عمل کنیم و در آخر با مساوی مقدار جدید را ست کنید :
1 |
$bmw->color = 'blue'; |
همینکه مقدار پراپرتی را ست کردید می توانید با کد زیر مقدار ست شده را دریافت کنید :
1 |
echo $bmw->color; |
چطور متد جدید به کلاس اضافه کنیم؟
بیشتر کلاس ها شامل توابعی هستند که داخل کلاس به آنها متد(method) می گیم.
در کد زیر متد hello()
را با پیشوند public
و کلمه کلیدی function
تعریف کردیم.
1 2 3 4 5 6 7 8 9 10 11 |
class Car { public $comp; public $color = 'red'; public $hasSunRoof = true; public function hello() { return "beep"; } } |
بعد ساخت شی برای دسترسی به متد می توانیم مثل خاصیت ها (property) عمل کنیم
1 2 3 4 5 |
$bmw = new Car(); $mercedes = new Car(); echo $bmw->hello(); echo $mercedes->hello(); |
1 2 3 4 5 |
$bmw = <span class="blue">new</span> Car (); $mercedes = <span class="blue">new</span> Car(); <span class="yellow">echo</span> $bmw -> hello(); <span class="yellow">echo</span> $mercedes -> hello(); |
خروجی
beep
beep
کد کامل که در این آموزش نوشتیم به اینصورت است :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
<?php // Declare the class class Car { // properties public $comp; public $color = 'red'; public $hasSunRoof = true; // method that says hello public function hello() { return "beep"; } } // Create an instance $bmw = new Car (); $mercedes = new Car (); // Get the values echo $bmw -> color; // beige echo "<br />"; echo $mercedes -> color; // beige echo "<hr />"; // Set the values $bmw -> color = 'blue'; $bmw -> comp = "BMW"; $mercedes -> comp = "Mercedes Benz"; // Get the values again echo $bmw -> color; // blue echo "<br />"; echo $mercedes -> color; // beige echo "<br />"; echo $bmw -> comp; // BMW echo "<br />"; echo $mercedes -> comp; // Mercedes Benz echo "<hr />"; // Use the methods to get a beep echo $bmw -> hello(); // beep echo "<br />"; echo $mercedes -> hello(); // beep |
جمع بندی
در این آموزش، شما اولین قدم خود برای ورود به دنیای برنامه نویسی شی گرا را با یادگیری کلاس و آبجکت ها، گذاشتید
در آموزش بعدی، در مورد کلمه کلیدی $this
که به ما اجازه استفاده از خاصیت و متدها داخل خود کلاس را می دهد، صحبت می کنیم.
امیدوارم از این آموزش نهایت استفاده را برده باشید.
هر سوال یا مشکلی داشتید در بخش نظرات همین پست ارسال کنید، سریعا بررسی و راهنمایی می شود.
موفق و پیروز باشید.