2011-03-13 49 views
2

我不知道它可能使用Boost.PHP替換一些PHP核心功能的邏輯和/或延長它們。所以,我要的是簡單的:當一個PHP腳本調用require_once(dirname(__FILE__) . "/file.php");我想收到dirname(__FILE__) . "/file.php"與我的功能,創建莫名其妙所需文件(在我的情況下,去一些分佈式存儲),並將該文件返回到PHP解釋器,如果它是期望的文件。Can Boost.PHP可以覆蓋核心PHP函數,例如require_once和include?

是否有可能與Boost.PHP?我怎麼能做這樣的事情?

回答

5

要改變一個核心PHP函數的beavior可以使用runkit擴展。

布爾runkit_function_rename(字符串$ funcname的,串$ NEWNAME)

注意:默認情況下,只有用戶空間功能可以刪除,重命名或修改。爲了覆蓋內部函數,您必須在php.ini中啓用runkit.internal_override設置。

請不是擴展主要用於單元測試,並在生產中經常(據我所知,至少有)不使用。

這樣你就可以到

runkit_function_rename("strlen", "org_strlen"); 
function strlen($string) { 
    return org_strlen($string + 1); 
} 

對於像requireisset事情是語言結構,而不是功能看@Wrikken答案(+1)

6

我不知道助力,但我懷疑它,因爲他們是語言構造,而不是功能。

但是,您可以write your own wrapper for a stream/protocol(或者定義自己,喜歡'mywrapper://path/to/something',或者可以覆蓋file://包裝,但後者意味着你必須保持覆蓋&正常之間翻轉,否則你不能對自己的文件系統中打開的文件:)

+0

和我們可以如何任何從PHP變化的語言結構或通過一些擴展? – Rella 2011-03-13 15:56:41

+0

是的,你可以,因爲PHP是開源的,所以你可以在PHP中重新編譯它。然而,這很可能不值得你花時間和麻煩。我不知道,這是否一個extenstion的,只是寫:一個包裝,做你想要使用的是什麼,那詢問/在你的代碼需要之前創建文件的另一個功能似乎helluvalot更少的工作和防錯。 – Wrikken 2011-03-13 16:03:03