Ключевое слово final в методах и классах языка PHP
Вход Регистрация

Ключевое слово final в методах и классах языка PHP

Специальное слово "final" перед объявлением метода в классе, запрещает перегрузку данного метода в производном классе. В старых версиях PHP допускалось объявление членов с ключевым словом "final", в текущих версиях PHP данная возможность запрещена.

У нас имеется базовый класс "mybasefinal", в котором объявлен метод "mymethodfinal", и производный класс "myderived" который наследуется от класса "mybasefinal".


class mybasefinal {

	final public function mymethodfinal () {
		echo 'Финальный метод базового класса, который не может быть перегружен.';
	}

}

class myderived extends mybasefinal {

	public function mymethodfinal () {
		echo 'Запрещённый метод, так как в базовом классе мы указали слово "final" перед созданием метода.';
	}

}

/* В итоге получаем фатальную ошибку: */

$my_class = new myderived();
echo $my_class->mymethodfinal();

Не имеет значения, в каком порядке будет выставленно ключевое слово "final", допускается как использование последовательности "final public" так и "public final".

Кроме обычных методов можно объявить и специальные. Например, в качестве final - метода объявить конструктор класса "mybasefinal", после чего становится невозможным наследование производного класса "myderived" с переопределённым конструктором. Приведём пример данной конструкции:


class mybasefinal {

	public final function __construct () {
		echo 'Конструктор определён как финальный, переопределение невозможно.';
	}

}

class myderived extends mybasefinal {

	public final function __construct () {
		echo 'Невозможное переопределение.'; # Будет вызвана фатальная ошибка;
	}

}

$my_class = new myderived();

Однако тем самым мы не теряем доступ к производному классу. Достаточно не переопределять конструктор класса "myderived" для того чтобы наследование стало возможным. Пример:


class mybasefinal {

	public final function __construct () {
		echo 'Конструктор определён как финальный, переопределение невозможно.';
	}

}

class myderived extends mybasefinal {
	# Конструктор не переопределён, наследование возможно.
}
$my_class = new myderived();

Слово "final" можно использовать и с классами, но об этом поговорим ниже.

Для того чтобы полностью запретить наследование базового класса, следует обявить сам класс как финальный поставив ключевое слово "final" перед словом "class". А так же класс не может быть объявлен как "final" и как "abstract" (абстрактный). Пример:


final class mybasefinal {

	public function mytest() {
		echo 'Объявление метода как "final" бессмысленно, так как класс уже объявлен как "final", что запрещает его наследование.';
	}

}

class myderived extends mybasefinal {
	/* Будет вызвана ошибка: наследование базового класса запрещено.
	Класс "myderived" не может быть унаследован от final - класса "mybasefinal". */
}

Данное ключевое слово даёт возможность избавиться от повтора создания одноимённых классов и методов.


Комментировать

captcha

Вход

Зарегистрируйтесь, если нет учетной записи

Напомнить пароль
Регистрация
Напомнить пароль
Войти в личный кабинет