late-static-bindings چیست ؟

کلمه کلیدی 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

3 فکر می‌کنند “late-static-bindings چیست ؟

پاسخ دادن به علی یوسفی لغو پاسخ

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *