当我们在PHP中包含文件时,它们会以某种方式缓存。因此,如果一个包含类定义,当我们尝试将其包含两次时,我们将收到一条错误消息“无法重新声明类”。
但是,是否可以通过将范围设置为当前函数来调用包含文件代码,让我们说吧?
E.g。如果我们有两个文件:
moo.php :
<?php
class Moo
{
function __construct()
{
echo "hello, world!" . PHP_EOL;
}
}
?>
main.php :
<?php
function foo()
{
include("moo.php");
new Moo();
}
foo();
new Moo(); // <-- here should be an error saying "could not find class Moo"
include("moo.php");
new Moo(); // <-- and here should not
?>
据我所知,不是eval(file_get_contents("moo.php"));
,也没有命名空间或者用最少的代码给出预期效果......
答案 0 :(得分:1)
使用require_once()
和include_once()
。他们会让PHP记住包含哪些文件,而不是在代码的其他地方再包含它们。在第一个include / require之后,同一文件中的后续文件将基本上变为空操作。
答案 1 :(得分:0)
命名空间应该解决这个问题 - &gt; http://php.net/manual/en/language.namespaces.php
答案 2 :(得分:0)
您应该尝试为您的课程实施autoload。这将有助于防止这样的事情。
答案 3 :(得分:-2)
似乎猴子修补did the trick:
<?php
$code = <<<EOS
namespace monkeypatch;
\$s = "moofoo";
echo "This should six, but is it?: " . strlen(\$s) . PHP_EOL;
echo "Whoa! And now it is six, right?: " . \strlen(\$s) . PHP_EOL;
function strlen(\$x)
{
return -3.14;
}
EOS;
eval($code);
echo "While out of namespaces it is still six...: " . strlen("moofoo") . PHP_EOL;
非常感谢Marc B.提示!