我正在努力研究如何解释 PHP's include
construct ,例如是否包含文本,何时评估等。像往常一样,文档相当非正式和模糊。
根据实验,它似乎是语法糖。具体来说,构造
include 'Baz.php'
是一个表达式,可以替换为
eval('?>' . file_get_contents('Baz.php', FILE_USE_INCLUDE_PATH))
这是正确的吗?这种替换在一般情况下是正确的,还是仅在我的测试中正确?
编辑:正如 bwoebi 指出的那样,这通常不是真的,因为 eval
uated 代码没有相同的 __DIR__
和 __FILE__
魔法常量.如果有某种方法可以设置它们,我们也可以对其进行建模。
编辑 2:这个问题与这个问题重复:Equivalent of include using eval .但是,那里的所有答案似乎都忽略了 bwoebi 关于文件路径上下文的观点。
最佳答案
是的,这应该是普遍正确的。
唯一的区别是:
- 文件上下文(它现在是
eval() 的代码
,而不是来自该文件的代码) - 相对路径:当您在其他目录中包含文件并且它们使用自己的相对路径时,它指向的文件现在可能找不到了
file_get_contents()
不受allow_url_include
ini 设置的影响(虽然allow_url_fopen
影响两者)
关于PHP 包含语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23681582/