- دوره شی گرایی PHP قسمت اول: آشنایی با شی گرایی
- دوره شی گرایی PHP قسمت دوم: ارث بری و سطح دسترسی
- دوره شی گرایی PHP قسمت سوم: متدهای زنجیره ای و جادویی
- دوره شی گرایی PHP قسمت چهارم: کلاس های abstruct و interface ها
- دوره شی گرایی PHP قسمت پنجم: namespace ها
در این قسمت با متدهای زنجیرهای و جادویی در PHP آشنا میشوید.
متدهای زنجیره ای
در مبحث متدهای زنجیرهای میتوانید متدها را پشت سر هم فراخوانی یا مقدار دهی کنید، که باعث خلاصه نویسی و قدرتمند تر شدن کلاسها میشود. مثال زیر را ببینید:
<?php
class Car{
protected $car_info;
public function name($value){
$this->car_info .= "Name: $value, ";
return $this;
}
public function wheel($value){
$this->car_info .= "Wheel: $value, ";
return $this;
}
public function maxSpeed($value){
$this->car_info .= "Max Speed: $value, ";
return $this;
}
public function breakType($value){
echo $this->car_info .= "Breac Type: $value";
}
}
$BMW = new Car();
$BMW->name("BMW")->wheel(4)->maxSpeed(220)->breakType("ABS");
?>
در مثال فوق یک کلاس به نام Car داریم که مشخصات یک ماشین را دریافت و در نهایت چاپ میکند.
همانطور که در ساختار کلاس میبینید یک رشته از نوع protected به نام car_info وجود دارد. درون کلاس چهار متد برای نام، تعداد چرخ ها، حداکثر سرعت و نوع ترمز قرار گرفته است.
هدف ما این است که به ترتیب کلیه مشخصات شیء را دریافت و در نهایت در خروجی چاپ کنیم.
همانطور که در سطر یکی مانده به آخر میبینید ما متدها را بعد از نام شیء یکی پس از دیگری آورده و مقدار آنها را درون پرانتز قرار دادیم.
در ساختار متدها نیز car_info با علامت نقطه و مساوی مقدار دهی میکنیم و در هر مرحله باید کلاس را با return $this برگردانیم تا هدایت به متد بعدی منتقل شود.
در نهایت با مقدار دهی کردن breakType پراپرتی car_info چاپ خواهد شد.
ترکیب متدهای زنجیرهای و متدهای static
مثال زیر را ببینید:
<?php
class Car{
static protected $car_info;
static public function name($value){
self::$car_info .= "Name: $value, ";
return new static;
}
public function wheel($value){
self::$car_info .= "Wheel: $value, ";
return new static;
}
public function maxSpeed($value){
self::$car_info .= "Max Speed: $value, ";
return new static;
}
static public function breakType($value){
echo self::$car_info .= "Breac Type: $value";
}
}
Car::name("BMW")->wheel(4)->maxSpeed(220)->breakType("ABS");
?>
همانطور که میبینید پراپرتی و متد name از نوع static هستند. وقتی اولین متد از نوع static باشد کافی است. در درسهای قبلی از return $this برای بازگشت کلاس و پیمایش متدهای بعدی استفاده میکردیم ولی در این مبحث از return new static استفاده میکنیم.
متدهای جادویی
متدهایی هستند که به کلاسهای PHP قدرت و انعطاف پذیری بیشتری میبخشند. برای تعریف متدهای جادویی قبل از نام آنها دو علامت فاصله -- میآوریم. در پایین چند متد جادویی را با هم بررسی میکنیم:
متد جادویی construct، یا متد سازنده
متد construct یا متد سازنده، اگر در کلاسی وجود داشته باشد پس از فراخوانی متد اکیدا فراخوانی میشود. مثال زیر را ببینید:
<?php
class Car{
public function __construct(){
echo "construct";
}
}
$BMW = new Car();
?>
به محض ساخت شیء BMW از کلاس Car بلافاصله رشته construct در خروجی چاپ میشود.
یکی از مهم ترین کاربردهای متد سازنده مقدار دهی Property هاست. مثال زیر را ببینید:
<?php
class Car{
public function __construct($name, $speed){
$this->name = $name;
$this->speed = $speed;
}
public $name;
public $speed;
}
$BMW = new Car("BMW", "220");
var_dump($BMW);
?>
همانطور که در بالا میبینید در هنگام ایجاد شیء BMW از روی کلاس Car یک سری آرگومان میگذاریم که بوسیله construct پراپرتیهای کلاس را مقدار دهی میکنند.
در نهایت var_dump کلیه مقادیر موجود را با ورودیهای موجود چاپ میکند.
متدهای جادویی get و set
مثال زیر را ببینید:
<?php
class Car{
public $name;
}
$BMW = new Car();
echo $BMW->speed;
?>
در سطر یکی مانده به آخر چون سعی در چاپ پراپرتی با نام speed داریم که در کلاس وجود ندارد با خطا مواجه میشویم.
با متد جادویی __get
می توان فرایند خروجی گرفتن از پراپرتیهای نا شناس را مدیریت کرد. مثال زیر را ببینید:
<?php
class Car{
public $name;
public function __get($value){
echo "anonymous property: ".$value;
}
}
$BMW = new Car();
echo $BMW->speed;
?>
متد get تمام پراپرتیهای نا شناس را مدریت میکند.
با متد جادویی __set
نیز میتوانید دریافت مقادیر را مدیریت کرد. مثال زیر را ببینید:
<?php
class Car{
public $name;
public function __set($value_name, $value_info){
echo "anonymous property => ".$value_name.": ".$value_info;
}
}
$BMW = new Car();
$BMW->speed = "220";
?>
البته متدهای جادویی دیگری نیز وجود دارند که در این جا مجالی برای بررسی همه آنها وجود ندارد. در سایت php.net میتوانید لیست کاملی از این متدها بیابید.