Вызов родительской функции с одинаковой подписью / именем - PullRequest
3 голосов
/ 16 ноября 2011

A и B имеют функцию с одинаковой сигнатурой - давайте предположим: foo($arg) - и это class A extends B.

Теперь у меня есть экземпляр:

$a = new A();

$a.foo($data);

МожетЯ также запускаю родительскую функцию (B) foo() через $a или она была переопределена?

Спасибо!Ними

Ответы [ 6 ]

7 голосов
/ 16 ноября 2011

. - оператор конкатенации строк в PHP.Чтобы вызвать методы, используйте ->.

Для вызова переопределенного метода используйте parent::method()

class B {
  public function foo($data) {
    echo 'B';
  }
}

class A extends B{
  public function foo($data) {
    parent::foo($data);
    echo 'A';
  }
}

$a = new A();
$a->foo($data); // BA
$b = new B();
$b->foo($data); // B
5 голосов
/ 16 ноября 2011

Это переопределено, но если вы хотите использовать оба, вы можете сделать это:

function parentFoo($arg)
{
    return parent::foo($arg);
}

Если вы хотите, чтобы дочерняя функция вызывала родительскую функцию, сделайте следующее:

function foo($arg)
{
    $result = parent::foo($arg);
    // Do whatever you want
}

См. Этот URL для получения дополнительной информации: http://php.net/manual/en/keyword.parent.php

1 голос
/ 16 ноября 2011

Отвечая на ваш вопрос, нет, вы не можете вызвать родительский метод foo () через объект класса A, так как единственный метод foo (), который A понимает в своем публичном API, это его собственный метод foo (),Вам, вероятно, нужно подумать о своем дизайне.Если foo () B предоставляет функции, отличные от foo () A, то должен ли один переопределять другой?Или вам нужно подумать о том, что A foo () вызывает B's foo () через parent :: foo () - при условии, что вы хотите, чтобы B foo () вызывался каждый раз, когда вызывается A foo ().Или используйте другой шаблон.Если foo () A не всегда подходит для объекта A, то вы можете посмотреть на Decorator или Strategy patttern's.

Если выНачиная с ОО-программирования, я не могу рекомендовать книгу Gang of Four достаточно высоко.

0 голосов
/ 16 ноября 2011

Могу ли я также запустить функцию foo () родителя через $ a или она была переопределена?

Не извне.Скажем:

<?php
class A {
    function talk( ) {
        return 'Hello world';
    }
}
class B extends A {
    function talk( ) {
        return 'Goodbye world';
    }
}

$b = new B;
$b->talk( ); // Goodbye world.

В этом примере невозможно получить вывод $ b-> talk A :: talk (), кроме как через прокси через B. Если вам нужно вместо этого получить результат от Aо Б, вы можете объяснить свою дилемму;это проблема, с которой вы не должны сталкиваться, и если вы это сделаете, скорее всего, дизайн не оптимален.

0 голосов
/ 16 ноября 2011

В классе A вы можете написать

parent::foo($param);

для вызова метода foo (...) базовых классов.

0 голосов
/ 16 ноября 2011

Вы можете получить доступ к методам родителей с помощью parent::foo()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...