Ответ 1
Используйте parent::
before имя метода, например
parent::test();
См родитель
В приведенном ниже примере метод test()
в родительском классе Foo
переопределяется методом test()
в дочернем классе Bar
. Можно ли вызвать Foo::test()
из Bar::test()
?
class Foo
{
$text = "world\n";
protected function test() {
echo $this->text;
}
}// class Foo
class Bar extends Foo
{
public function test() {
echo "Hello, ";
// Cannot use 'parent::test()' because, in this case,
// Foo::test() requires object data from $this
parent::test();
}
}// class Bar extends Foo
$x = new Bar;
$x->test();
Используйте parent::
before имя метода, например
parent::test();
См родитель
parent::test();
(см. пример № 3 в http://www.php.net/manual/en/language.oop5.paamayim-nekudotayim.php)
Просто установите уровни видимости в свойстве $ text.
private $text = "world\n";
Вызов родительского метода может считаться плохой практикой или запахом кода и может указывать на логику программирования, которая может быть улучшена таким образом, что ребенку не нужно вызывать родителя. Хорошее общее описание предоставлено Википедией.
Реализация без вызова parent будет выглядеть следующим образом:
abstract class Foo
{
$text = "world\n";
public function test() {
$this->test_child();
echo $this->text;
}
abstract protected function test_child();
}// class Foo
class Bar extends Foo
{
protected function test_child() {
echo "Hello, ";
}
}// class Bar extends Foo
$x = new Bar;
$x->test();
Судя по вашим комментариям к пастебину, я бы сказал, что вы не можете.
Может быть, если у вас есть что-то вроде этого?
class foo {
public function foo($instance = null) {
if ($instance) {
// Set state, etc.
}
else {
// Regular object creation
}
}
class foo2 extends foo {
public function test() {
echo "Hello, ";
// New foo instance, using current (foo2) instance in constructor
$x = new foo($this);
// Call test() method from foo
$x->test();
}
}