در این قسمت با متدهای زنجیره‌ای و جادویی در 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 می‌توانید لیست کاملی از این متدها بیابید.