2011-03-13 51 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