包含可见范围的文件

时间:2011-08-26 17:07:21

标签: php oop scope

当我们在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"));,也没有命名空间或者用最少的代码给出预期效果......

4 个答案:

答案 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.提示!