2015-01-02 35 views
0

我有以下幾點:訪問這些參數傳遞給孩子的方法

class bar { 

    function __construct(){ 

     // set $a_from_fire to $a from fire() method arg 
     // set $b_from_fire to $b from fire() method arg 
    } 
} 

class foo extends bar { 

    function fire ($a, $b){ 

    } 
} 

我需要設置$ a_from_fire和$ b_from_fire使用參數從foo->火()

所以,如果我這樣做:

$test = new foo; 
$test->fire(1, 2); 

這些增值經銷商將被設置:

$a_from_fire == 1; // true 
$b_from_fire == 2; // true 
+0

你的問題不是很清楚:s –

+2

我不確定你想要做什麼。你能否至少展示一些非工作代碼或進一步的描述來解釋你想要的東西?另外,聲明'$ a_from_fire'在哪裏? – Jakar

+0

我剛加了一些說明。我正在嘗試調試一組正在作爲消息隊列中的作業運行的類。他們都擴展了一個父類,所以我希望我可以通過簡單地向父類添加一個方法來記錄傳遞給每個子類方法的參數,以捕獲參數。 – phirschybar

回答

0

我不認爲你可以用任何「正確」的方式做到這一點。我的第一個想法是使用__call,但這當然只是要求未定義的功能。

而且除非您已經使用RunKit,否則動態rename the methods並沒有真正的方法。 (不是我所知道的或可以找到的)。

如果純粹出於調試目的,您可以設置自己的類自動加載器來預處理文件,更改方法名稱,然後在父類上使用神奇方法。

spl_autoload_register(function($class){ 
     $hackPath = '/home/_classes/'.$class; 
     if (!file_exists($hackPath)){ 
      $realPath = '/home/classes/'.$class; 
      $file = file_get_contents($realPath); 
      $processedContent = //use regex or something to prepend all function names with an _. 
      file_put_contents($hackPath,$processedContent); 
     } 


     require_once $hackPath; 
    }); 

然後在你的父類

class parent { 

    public function __call($funcName,$arguments){ 

     $this->myLogFunc($funcName,$arguments); 
     //since you prepended with an underscore 
     return call_user_func_array('_'.$funcName,$arguments); 

    } 

這是做什麼你問一個可怕的方式,但它可以工作。文件的預處理可能會很慢,但如果原件發生更改(只能使用filemtime來檢查它是否更改),您只需執行此操作即可。

0

這是不可能的,因爲當對象第一次實例__construct()被調用,所以fire($a, $b)總會後__construct()

運行如果你只是想設置的變量時fire()被調用時,簡單地做:

class bar { 
    protected $a_from_fire; 
    protected $b_from_fire; 
} 

class foo extends bar { 
    public function fire($a, $b) { 
     $this->a_from_fire = $a; 
     $this->b_from_fire = $b; 
    } 
}