شی گرایی در PHP چندین متد جادویی (magic method) و ثابت (Constant) را در اختیار ما قرار داده تا خیلی از کارهای برنامه نویسی را با کد کمتر بنویسیم.
ولی چندتا نقاط ضعف مثل کاهش جزئی در عملکرد مشاهده می شود.
اختلاف نظرهای زیادی در مورد متدهای جادویی وجود دارد، بنابراین در این بخش از آموزش شی گرایی در PHP مواردی که اکثرا با آن موافق اند را توضیح می دهیم و از بخش ها دارای اختلاف صرف نظر می کنیم.
متد جادویی __construct()
نام متدهایی جادویی همشه با دو خط زیرین شروع می شود و متد __construct()
هم از این قاعده استثنا نیست.
ما از __construct()
به منظور انجام کاری بلافاصله بعد از ساخته شدن یک شی از کلاس استفاده می کنیم.
معمولا از متد سازنده (constructor) برای ست کردم مقادیر خاصیت (property) استفاده می کنیم.
در این مثال ساده، ما مقدار $model
را به محض ساخته شدن آبجکت از کلاس، ست می کنیم. بنابراین داخل متد سازنده ما مقدار $model
رو به اینصورت قرار میدیم:
1 2 3 4 5 6 7 8 9 |
class Car{ private $model; // A constructor method. public function __construct($model) { $this -> model = $model; } } |
برای استفاده از متد سازنده، باید آرگومان را هنگام ساخت شی از کلاس به آن پاس بدیم. اما اگر سعی کنیم بدون ست کردم شی بسازیم خطای Warning ایجاد می شود.
1 |
$car1 = new Car(); |
خروجی:
Warning: Missing argument 1 for Car::__construct()
برای جلوگیری از این خطا، باید مقداری را به متد سازنده اختصاص بدید. بنابراین، مقدار “Mercedes” را به شی تازه ساخته شده اختصاص میدیم.
1 |
$car1 = new Car("Mercedes"); |
حالا، متد getCarModel()
اضافه می کنیم تا مقدار داده شده به آبجکت که همان مدل خودرو هست را چاپ کند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class Car { private $model; //__construct public function __construct ($model) { $this -> model = $model; } public function getCarModel() { return ' The car model is: ' . $this -> model; } } //We pass the value of the variable once we create the object $car1 = new Car("Mercedes"); echo $car1 -> getCarModel(); |
خروجی :
The car model is: Mercedes.
چطور یک متد سازنده بدون خطا بنویسیم؟
زمانی که قصد ساختن یک متد سازنده دارید، اگر هنگام ساخت آبجکت مقداری به آن پاس داده نشود، احتمال ایجاد خطا وجود دارد.
برای جلوگیری از آن، می توانیم یک مقدار پیش فرض را به خواص کلاس بدهیم.
عاقلانه ترین انتخاب برای مقدار پیش فرض پراپرتی می تواند صفر، رشته خالی یا حتی null
باشد.
اگر از مقدار پیش فرض null
استفاده کنیم، می توانیم از شرط استفاده کنیم که اگر نال نبود یعنی مقداری به این پراپرتی داده شده است.
در مثال زیر، مقدار پیش فرض null
را به $model
اختصاص دادیم و اگر مقداری به متد سازنده پاس داده شود، آن را برای پراپرتی ست می کنیم، در غیر اینصورت، پراپرتی $model
مقدار پیش فرض رشته “N/A” خواهد داشت.
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 |
class Car { // The $model property has a default value of "N/A" private $model = "N/A"; // We don’t have to assign a value to the $model property //since it already has a default value public function __construct($model = null) { // Only if the model value is passed it will be assigned if($model) { $this -> model = $model; } } public function getCarModel() { return ' The car model is: ' . $this -> model; } } //We create the new Car object without passing a value to the model $car1 = new Car(); echo $car1 -> getCarModel(); |
از آنجا که ما آبجکت را بدون پاس دادن به پراپرتی $model
ساختیم، هیچ اروری مشاهده نشد چون قبلا مقدار پیش فرضی به آن اختصاص دادیم
خروجی :
The car model is: N/A
از سمت دیگر، ببینیم چه اتفاقی می افتد اگر مقدار model
را هنگام ساخت آبجکت مشخص کنیم.
در این مثال، هنگام ساختن آبجکت از کلاس مقدار Mercedes را برای $model
ست کردیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
class Car { private $model = ''; //__construct public function __construct($model = null) { if($model) { $this -> model = $model; } } public function getCarModel() { return ' The car model is: ' . $this -> model; } } //We create the new Car object with the value of the model $car1 = new Car('Mercedes'); echo $car1 -> getCarModel(); |
خروجی:
The car model is: Mercedes
ثابت های جادویی
علاوه بر متدهای جادویی، زبان PHP چندین ثابت (Constant) جادویی را در اختیار ما قرار میدهد.
برای مثال، ثابت جادویی __CLASS__
(ثابت های جادویی، حروف بزرگ با دوتا خط زیر اول و آخر هستند) به منظور دریافت نام کلاس استفاده می شود.
بیاید نگاهی به مثال زیر بیاندازیم که از ثابت جادویی getCarModel()
برای دریافت نام کلاس استفاده کریم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class Car { private $model = ''; //__construct public function __construct($model = null) { if($model) { $this -> model = $model; } } public function getCarModel() { //We use the __CLASS__ magic constant in order to get the class name return " The <b>" . __CLASS__ . "</b> model is: " . $this -> model; } } $car1 = new Car('Mercedes'); echo $car1 -> getCarModel(); |
خروجی :
The Car model is: Mercedes
ثابت های جادویی دیگر که ممکن است به کارتان بیاد :
__LINE__
دریافت شماره خط کد
__FILE__
دریافت آدرس کامل یا فایل کد اجرا شده فعلی
__METHOD__
دریافت نام متد فعلی
جمع بندی آموزش شی گرایی در PHP
در این بخش از آموزش شی گرایی در PHP، ما با متد و ثابت های جادویی آشنا شدیم و دیدیم که چطور می توان مقادیر پیش فرض را همزمان با ساخت آبجکت به پراپرتی ها داد.
در بخش بعدی آموزش، در مورد ارث بری و اصول شی گرایی که از تکرار بی رویه کد جلوگیری می کند، صحبت می کنیم.