Путаница между Private
а также Final
в PHP.
Например у меня есть 3 класса:
Что я понимаю:
Мой вопрос:
После использования private мы можем достичь такой же функциональности, как final, тогда почему мы используем final?
Я задаю этот вопрос только для моего разъяснения для себя.
Просто чтобы было понятно, ключевое слово final
не нужно ничего делать с видимостью метода. Видимость метода определяется ключевыми словами: public
, protected
а также private
,
Ключевое слово final определяет, может ли другой класс перезаписать метод или нет (если метод final, он не может быть перезаписан другим классом), когда другой класс имеет доступ к методу. В противном случае он даже не будет иметь доступа к методу, поэтому он не может ни использовать / вызывать метод, ни перезаписывать его.
Также только методы могут быть окончательными, их нельзя использовать со свойствами.
A, B и C являются правильными, и, как я сказал выше, ключевое слово final не имеет ничего общего с видимостью, поэтому D не является правильным.
Для получения дополнительной информации см. Соответствующие страницы руководства:
Финальные классы или методы могут НЕ быть отмененным
Из php doc
В PHP 5 вводится ключевое слово final, которое не позволяет дочерним классам переопределять метод, добавляя префикс перед final. Если сам класс определяется как final, он не может быть расширен.
Пример из документации php:
<?php
class BaseClass {
public function test() {
echo "BaseClass::test() called\n";
}
final public function moreTesting() {
echo "BaseClass::moreTesting() called\n";
}
}
class ChildClass extends BaseClass {
public function moreTesting() {
echo "ChildClass::moreTesting() called\n";
}
}
// Results in Fatal error: Cannot override final method BaseClass::moreTesting()
?>
Больше деталей: http://php.net/manual/en/language.oop5.final.php
Недвижимость final
метода используется, чтобы дать понять компилятору, что данный метод не может быть переопределен где-либо еще.
В результате, если мы объявим функцию как final
а затем мы пытаемся переопределить его где-то еще, мы получим warning
или fatal error
,