2013-08-23 65 views
1

假設我有一個名爲MyClass的課程,它擴展了MyAbstractClass擴展類的方法之後在抽象類中調用方法?

MyClass之內有myMethod。在MyAbstractClass內有myAsbtractClassMethod

myMethod完成時,有沒有辦法讓myAsbtractMethod調用,而不必將parent::myAsbtractClassMethod放在最後?

回答

1

不,我不害怕。

如果你希望實現'post-execution hook'風格功能,你可以設計你的類來實現__call()魔術方法。例如:

<?php 

abstract class AbstractTest 
{ 
    protected function myMethod() 
    { 
    echo 'Bar'; 
    } 
} 

class Test extends AbstractTest 
{ 

    public function __call($methodName, $args) 
    { 
    call_user_func_array(array($this, $methodName), $args); 
    call_user_func_array(array('parent', $methodName), $args); 
    } 

    protected function myMethod() 
    { 
    echo 'Foo'; 
    } 

} 

$test = new Test(); 

// Will output 'FooBar' 
$test->myMethod(); 

通過聲明myMethod()受到保護,您不能公開調用它。因此,它被__call()方法'攔截',該方法在它自己的上下文中調用它,然後調用它的父代。這可能需要重新設計你的類是如何構建的。

+0

這是一個非常簡潔的方法:) –