کلمه کلیدی self روال طبیعی ارث بری پیش نمی برد و همیشه self به کلاسی که در آن قرار دارد اشاره می کند. و این یعنی اینکه اگر در کلاس پدر با استفاده از self متد استاتیکی را صدا زده باشید و در کلاس فرزند بخواهید از متد فرزند استفاده کنید، نمی توانید و همان متد پدر را صدا میزند.
class A
{
public static function getName() { return 'Car'; }
public static function showName() { echo self::getName(); }
}
class B extends A {
public static function getName() { return 'BMW'; }
}
A::showName(); // Car
B::showName(); // Car
راه حل ۱ : تکرار متد در کلاس فرزند
class A
{
public static function getName() { return 'Car'; }
public static function showName() { echo self::getName(); }
}
class B extends A {
public static function getName() { return 'BMW'; }
public static function showName() { echo self::getName(); }
}
A::showName(); // Car
B::showName(); // BMW
راه حل دوم : استفاده از متد get_called_class
class A
{
public static function getName() { return 'Car'; }
public static function showName() {
$class = get_called_class();
echo $class::getName();
}
}
class B extends A {
public static function getName() { return 'BMW'; }
}
A::showName(); // Car
B::showName(); // BMW
راه حل سوم : برای رفع این مشکل کلمه کلیدی جدیدی به نام static استفاده می کنیم.
class A
{
public static function getName() { return 'Car'; }
// public static function showName() { echo self::getName(); }
public static function showName() { echo static::getName(); }
}
class B extends A {
public static function getName() { return 'BMW'; }
}
A::showName(); // Car
B::showName(); // BMW
هنگامی که از self استفاده می کنیم در زمان کامپایل مقدار را جایگذاری میکند ولی زمانی که از static استفاده می کنیم در زمان اجرا مقدار را جای گذاری می کند. استفاده از روش سوم را last static binding می گوییم.
منابع :
https://stackoverflow.com/questions/1912902/what-exactly-are-late-static-bindings-in-php
https://codeinphp.github.io/post/late-static-binding-in-php/
http://ir2.php.net/language.oop5.late-static-bindings
Leave a Reply