2013-05-11 5 views
0

У меня есть классКак вызвать перекрытый метод в детстве, на родительском классе

class foo { 

    function do_something() { 
     load(); 
    } 

    function load() { 
    //things 
    echo 'load from foo'; 
    } 
} 

И еще один класс, расширяющий Foo (дочерний класс):

class bar extends foo { 

    function load() { 
    //things 
    echo 'load from bar (child)'; 
    } 

} 

А потом :

$obj = new bar(); 

То, что я хочу знать, как я могу назвать $obj->do_something() таким образом, что метод использует метод ребенка «нагрузки» вместо метода decla красный в классе foo.

Итак, я хочу выход быть:

$obj->do_something(); 

Выход: load from bar (child)

Возможно ли это с PHP?

Спасибо!

ответ

1

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

class foo { 
    function do_something() { 
     // load(); 
     $this->load(); 
    } 
    function load() { 
     echo 'load from foo'; 
    } 
} 

class bar extends foo { 
    function load() { 
     echo 'load from bar (child)'; 
    } 
} 

$obj = new bar(); 
$obj->do_something(); 

В своем коде (просто называя load()) языком ищет глобально определенную функцию с именем load, который, конечно, не будет работать (или в худшем случае, будет, но неправильно)

Как еще один ответ указывает, вы должны также квалифицировать статические методы, хотя использование self или static (), которое я бы предложил вам прочитать, чтобы понять различия в привязке)

С наследуемым классом, в наиважнейшей метод, вы можете также использовать parent для вызова определения родительских классов метода:

class bar extends foo { 
    function load() { 
     parent::load(); // right here 
     echo 'load from bar (child)'; 
    } 
} 

Это будет ссылаться на версию родительского метода load, и по-прежнему выполнение с определением дочерних классов.

-1

Попробуйте

class foo { 

    function do_something() { 
     static::load(); 
    } 

    function load() { 
    //things 
    echo 'load from foo'; 
    } 

} 

class bar extends foo { 

    function load() { 
    //things 
    echo 'load from bar (child)'; 
    } 

} 

$obj = new bar; 
$obj->do_something(); 
+0

Это «работает», но я бы не рекомендовал его, как использование 'static' разрешить вызов метода может привести к весьма запутанным ошибкам данных статическими контекст, в отличие от '$ this', который всегда будет корректно разрешаться для текущего экземпляра. – Dan

+0

На самом деле, я за это. – mpyw

+0

Извините, я не понимаю; вы полагаете, что использование 'static' вместо' $ this' предпочтительнее по какой-то причине? – Dan

0

Я бы рекомендовал использовать абстрактную функцию, если вы хотите иметь такую ​​тесную связь методов. это потребует высокого обслуживания, и вы создаете некоторые плотные связи между классами.

Я бы рекомендовал создать абстрактную функцию в родительском объекте, которую каждый из них будет реализовывать с помощью своей собственной логики.

Даже тогда, если вы хотите изменить функцию родительского класса для этого

function do_something(){ 
    if(method_exists($this, 'test')){ 
     $this->test(); 
    } 
} 
0

вы можете использовать абстрактный класс и абстрактный метод:

abstract class Foo{ 
    function test() { 
     $this->method(); 
    } 
    abstract function method(); 
} 
class Test extends Foo { 
    function method() { 
     echo 'class Test'; 
    } 
} 
$test = new Test(); 
$test->test(); 
Смежные вопросы