Как подавить виртуальные методы в PHP?

Допустим, у меня есть класс Animal и Dog (собака наследует от Animal). Для каждого класса у меня есть метод (защищенный) foo с одинаковой подписью. Эти методы должны быть обычными, не виртуальными. Но поскольку PHP делает все не приватные методы виртуальными, у меня возникла проблема.

Прежде чем я начну писать некоторые обходные пути, возможно, это может быть решено более простыми способами. А именно:

  • возможно ли в PHP пометить метод как не виртуальный?

  • «сидя» внутри данного класса (животное или собака) можно назвать foo в контексте ток класс, так виртуальный механизм не сработает?

0

Решение

Вы можете пометить метод как окончательный:

class foo {
final protected function bar() {} //can not be overriden
}

Или даже пометить класс как окончательный:

final class foo { // can not be extended
//...
}

Вы можете использовать self ключевое слово в сочетании с вызовом метода для вызова метода в контексте текущего класса:

class A {
function aa() { echo 1; }
function cc() { self::aa(); }
function dd() { $this->aa(); }
}

class B extends A {
function aa() { echo 2; }
function bb() { self::aa(); }
}

$b = new B;
$b->bb(); //2 - the value from B::aa() - call from B's context
$b->cc(); //1 - the value from A::aa() - call from A's context
$b->dd(); //2 - the value from B::aa() - regular virtual call
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]