parent, static, self, و $this کلیدواژههایی هستند که برای دسترسی به ویژگیها و متدهای مختلف کلاسها استفاده میشوند. در اینجا توضیح و مثالی برای هر یک ارائه داده شده:$this:
کلیدواژه $this به نمونه فعلی کلاس اشاره دارد. از این برای دسترسی به ویژگیها و متدهای غیر استاتیک درون یک کلاس استفاده میشود.
مثال:
class Car {
public $color;
public function setColor($color) {
$this->color = $color;
}
public function getColor() {
return $this->color;
}
}
$car = new Car();
$car->setColor('blue');
echo $car->getColor(); // خروجی: blue------
self:
کلیدواژه self به کلاسی اشاره دارد که در آن استفاده شده است. برای دسترسی به ویژگیها و متدهای استاتیک کلاس مورد استفاده قرار میگیرد.
مثال:
class Car {
public static $number_of_cars = 0;
public function __construct() {
self::$number_of_cars++;
}
public static function getNumberOfCars() {
return self::$number_of_cars;
}
}
new Car();
new Car();
echo Car::getNumberOfCars(); // خروجی: 2------
parent:
کلیدواژه parent برای دسترسی به ویژگیها و متدهای کلاس والد استفاده میشود. معمولاً در زمینههایی به کار میرود که وراثت مطرح است و میخواهیم به یک متد یا ویژگی در کلاس والد دسترسی داشته باشیم که در کلاس فرزند override شده است.
مثال:
class Vehicle {
protected function startEngine() {
echo "Engine started";
}
}
class Car extends Vehicle {
public function startEngine() {
parent::startEngine();
echo " and Car is ready!";
}
}
$car = new Car();
$car->startEngine(); // خروجی: Engine started and Car is ready!------
static:
کلیدواژه static در جایی استفاده میشود که میخواهیم به ویژگیها و متدهای استاتیک کلاس در حال اجرا دسترسی داشته باشیم، به ویژه در زمینههای وراثت که ممکن است نوع کلاس فرزند متفاوت باشد. static در زمان اجرا حل میشود و به کلاسی اشاره دارد که متد را فراخوانی کرده است.
مثال:
class Vehicle {
public static function who() {
echo "I am a Vehicle";
}
public static function test() {
static::who(); // دیر حلشدن: اینجا به "Vehicle" اشاره دارد
}
}
class Car extends Vehicle {
public static function who() {
echo "I am a Car";
}
}
Car::test(); // خروجی: I am a Carدر مثال بالا، با استفاده از static::who(), کلاس Car به جای Vehicle تشخیص داده شده است زیرا static به کلاسی اشاره دارد که متد در آن فراخوانی شده است. این مکانیزم به عنوان "Late Static Binding" شناخته میشود و به PHP اجازه میدهد که در زمان اجرا تصمیم بگیرد که کدام ورژن از متد باید استفاده شود، بر اساس کلاسی که متد را فراخوانی کرده، نه بر اساس کلاسی که متد در آن تعریف شده است.
این ویژگی بسیار مفید است زمانی که میخواهیم در یک کلاس پایه از متدهایی استفاده کنیم که ممکن است در کلاسهای وراثتشده تغییر کنند و میخواهیم اطمینان حاصل کنیم که ورژن صحیح متد بر اساس کلاس فرزند استفاده میشود، حتی اگر از طریق کلاس والد فراخوانی شود.
برای درک بهتر static و self را در کنار هم میگذاریم:
class BaseClass {
public static function who() {
echo "I am a BaseClass";
}
public static function test() {
self::who(); // این همیشه به BaseClass اشاره دارد.
static::who(); // این میتواند به کلاس فرزند اشاره داشته باشد اگر override شده باشد.
}
}
class ChildClass extends BaseClass {
public static function who() {
echo "I am a ChildClass";
}
}
ChildClass::test();خروجی این کد:
I am a BaseClass
I am a ChildClass
اولین خط با استفاده از self::who() همیشه به متد who() در BaseClass اشاره دارد، در حالی که دومین خط با استفاده از static::who() به متد who() در ChildClass اشاره دارد زیرا این متد در کلاس فرزند override شده است. این مثال نشان میدهد که چگونه self و static میتوانند به طور متفاوتی عمل کنند و چرا static در موارد وراثت بسیار مفید است.
👤 AmirHossein
💎 Channel: @DevelopixPHP