2011-01-31 38 views
0

我的所有網站共享一個共同的首發,處理網址,文件位置等。有3種情況需要處理 - 是目錄,文件存在和文件不存在。每個應用程序對每種情況都有唯一的代碼我決定修改一下runkit,並試圖統一代碼。每個案例將由一個函數處理,可以通過runkit重新定義。PHP - runkit重新定義方法

考慮以下代碼:

class start { 
    function __construct() { 
     $this->options = array(); 
    } 

    public function process() { 
     // some code here 
     $this->file_not_exists(); 
    } 

    public function file_not_exists() { 
     $this->options['page'] = 222; 
    } 

    public function redefine($what, $code) { 
     runkit_method_redefine(get_class($this), $what, '', $code, RUNKIT_ACC_PUBLIC); 
    } 
} 

$start = new start(); 

$start->redefine('file_not_exists', '$this->options["page"] = 333;') 

// page is now 333 

這部分按預期工作。但是當我嘗試更改代碼時,重新定義的方法會調用用戶函數。但是,對於上帝的愛,我無法弄清楚如何將$ this傳遞給函數。

重新定義方法是這樣的:

public function redefine($what, $code) { 
    runkit_method_redefine(get_class($this), $what, '', 'call_user_func('.$code.'(), '.$this.');', RUNKIT_ACC_PUBLIC) 
} 

這是不行的,不管我什麼(call_user_func_array爲好)。我只是不知道。備案號:

public function redefine($what, $code) { 
    my_user_function($this); 
} 

是否有效。

任何幫助表示讚賞。

請注意,這只是一個實驗,我想知道如何做到這一點:)

編輯: 我得到:

Catchable fatal error: Object of class starter could not be converted to string in blablallala\rewrite_starter2.php on line 153 
+0

你是什麼意思「這不工作」?編譯錯誤?或者是什麼?你如何發現不工作的東西? – 2011-01-31 09:50:59

+0

我更新了我的問題 – realshadow 2011-01-31 10:38:04

回答

0

{...去除不必要的.. }

====編輯=====

[對於新的問題,你需要的是這個]

<? 
class start { 
    function __construct() { 
     $this->options = array(); 
    } 

    public function process() { 
     // some code here 
     $this->file_not_exists(); 
    } 

    public function file_not_exists() { 
     $this->options['page'] = 222; 
    } 

    public function redefine($what, $code) { 
     runkit_method_redefine(get_class($this), 
     $what, 
     '', 
     'call_user_func(array($this,' .$code. '),$this);', 
     RUNKIT_ACC_PUBLIC); 
    } 

    public function my_func($someobj) 
    { 
     print_r($someobj); 
    } 
} 


$start = new start(); 
$start->redefine('file_not_exists', 'my_func'); 

$start->process(); 

?> 
0

call_user_func函數的文檔說第一個參數是'callable'。因此要動態調用類方法,您應該通過array($obj, 'func_name')