دوره شی گرایی PHP قسمت سوم: متدهای زنجیره ای و جادویی

نوشته شده توسط:
قسمت های دیگر این مطلب:

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

نظر خود را برای این مطلب وارد کنید
دریافت خبرنامه

موضوعات بخش برنامه نویسی و نرم افزار

مطالب برگزیده برنامه نویسی php

مطالب برگزیده سایت