Web Development
31-05-2024

Late Static Binding в PHP

Dmytro Tus
Full Stack Web developer

Late Static Binding чи пізнє статичне скріплення ( як мені переклав перекладач ) така властивість PHP, яка яка може бути використана для посилання на клас, що викликається, в контексті статичного успадкування.

Звучить складно але зараз я покажу приклад і все стане зрозуміло.

Маємо такий код

<?php

class Model
{
	protected static $tableName = 'Model';

	public static function getTableName()
	{
		return self::$tableName;
	}
}

class User extends Model
{
	protected static $tableName = 'User';
}

echo User::getTableName(); // поверне нам 'Model' а не 'User'

Чому так відбувається?

  • Ми створили клас Model, у якому є статична властивість $tableName зі значенням Model та статичний метод getTableName(), який повертає значення $tableName.
  • Потім створили ще один клас з назвою User, який розширює клас Model. Клас User також має статичний атрибут $tableName.
  • Потім викликали метод getTableName() класу User. Однак він повертає Model замість User. Причина полягає в тому, що self привʼязується для класу, до якого належить метод. Якщо ви визначите метод у батьківському класі та викличете його з підкласу, то self не посилатиметься на підклас так, як ви, можливо, очікували.

Як вирішити проблему?

Все дуже просто. Потрібно замінити self на static

Ось поправлений код

<?php

class Model
{
	protected static $tableName = 'Model';

	public static function getTableName()
	{
		return static::$tableName;
	}
}

class User extends Model
{
	protected static $tableName = 'User';
}

echo User::getTableName(); // User

Це все. Ось так працює late static binding в PHP.


Tags:

Інші дописи