2011-07-04 34 views
8

我使用preg_replace_callback找到與實時鏈接替換文本鏈接:preg_replace_callback()的問題

http://www.example.com 

<a href='http://www.example.com'>www.example.com</a> 

的回調函數,我提供的函數是在另一個所以當我嘗試:

return preg_replace_callback($pattern, "Utilities::LinksCallback", $input); 

我得到一個錯誤,聲稱該函數不存在。有任何想法嗎?

+1

'Utilities :: LinksCallback'不存在。 –

+0

不一定。你不能在所有的PHP版本中傳遞這樣的回調字符串。 –

回答

20

在PHP中使用類方法作爲回調時,你必須使用array形式的回調。也就是說,您創建了一個數組,其第一個元素是類(如果該方法是靜態的)或該類的一個實例(如果沒有),第二個元素是要調用的函數。例如。

class A { 
    public function cb_regular() {} 
    public static function cb_static() {} 
} 

$inst = new A; 

preg_replace_callback(..., array($inst, 'cb_regular'), ...); 

preg_replace_callback(..., array('A', 'cb_static'), ...); 

您正在調用的函數當然必須在您使用回調的範圍內可見。

有關有效回調的詳細信息,請參見http://php.net/manual/en/language.pseudo-types.php

N.B.在那裏閱讀,似乎從5.2.3開始,只要回調函數是靜態的,就可以使用你的方法。

+0

是的謝謝。根據PHP.net使用的方法,我的代碼應該是正確的,儘管它們的例子很相似,但它們使用常規函數 - 而不是類靜態方法。編輯:問題是簡單地省略靜態關鍵字。 – Lee

+2

錯過了NB,這是我的問題。僅供參考 - 如果在一個類實例中使用,'array($ this,'method_name')'這樣做。 – benmarks

4

你可以這樣說:

return preg_replace_callback($pattern, array("Utilities", "LinksCallback"), $input) 

參考:http://php.net/callback

+1

我不瞭解靜態函數,所以上面的解決方案可能是正確的。但是,如果它是一個常規函數,那麼可以這樣使用:'return preg_replace_callback($ pattern,array(&$ this,「LinksCallback」),$ input);' –

+0

這對於實例肯定有效。對於靜態函數,我的符號是必需的。我猜他們(Zend)認爲大多數對靜態函數的引用都是靜態類中的引用。 –

+0

是的,LinksCallback()是靜態的,並且在Utilities類中。我會試試看,謝謝。 – Lee