2013-10-22 42 views
0

我有一個基類,所有的動作都在進行。在這個類的一個方法中,我創建了另一個自己的類的實例,這是一個幫助程序....在我的基類中,我有名爲log的方法 - 此方法的用途很明顯。那麼是否有可能以某種方式直接向基類日誌方法傳遞一些引用的幫助類?是否可以創建對該方法的引用?

目前,我有這樣的事情:

class trololo { 
    public function log(){ 
     echo __CLASS__ . ' => ' . __FUNCTION__ ."<br>\n"; 
    } 

    private function three(){} 
} 

class test { 

    function __construct(&$data){ 
     $data->log(); 
    } 

} 

class lol extends trololo { 

    private function one(){} 

    protected function two(){} 

    public function four(){ 
     $this->log(); 

     new test($this); 
    } 
} 

$lol = new lol; 

$lol->four(); 

但你可以看到我通過全笑對象來測試類,但可能也可以通過只log方法?

+3

爲什麼你會傳遞一個方法?爲什麼沒有一個日誌記錄對象只是爲了記錄和分享你的類?這樣你就有了一個可以進行日誌記錄的對象,這就是它所做的一切,因此沒有耦合,也沒有問題,例如「如何傳遞方法而不是對象」。 –

回答

4

你不能從它的對象中分離一個方法。但是,你可以通過一個callable

class Foo { 
    public function bar() { echo 'bar'; } 
} 

$ref = array(new Foo, 'bar'); 
$ref(); 

作品,因爲PHP 5.4,你需要call_user_func($ref),而不是$ref()之前。

或者,可以使用匿名函數:

class Foo { 
    public function bar() { echo 'bar'; } 
} 

$foo = new Foo; 
$ref = function() use ($foo) { return $foo->bar(); }; 
$ref(); 
+0

請注意,在這個問題下面@ N.B.的評論是非常正確的,這不是一個真正需要解決的問題。您通常會輸入提示「Log」對象並使用其定義的接口,而不是隻傳遞一個方法。 – deceze

-1

更改功能,靜態:

public static function log(){ 
    echo __CLASS__ . ' => ' . __FUNCTION__ ."<br>\n"; 
} 

那麼你就可以稱它是這樣的:

trololo::log(); 
相關問題