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


Comments

3 responses to “late-static-bindings چیست ؟”

  1. رسول Avatar
    رسول

    عالی

  2. کوروش عباسی پور Avatar
    کوروش عباسی پور

    خیلی خوب توضیح دادین ممنون

    1. علی یوسفی Avatar
      علی یوسفی

      خواهش میکنم

Leave a Reply

Your email address will not be published. Required fields are marked *