簡體   English   中英

包含可見范圍的文件

[英]include file with visibility scope

當我們在PHP中包含文件時,它們會以某種方式進行緩存。 因此,如果其中包含一個類定義,則當我們嘗試將其包含兩次時,將收到一條錯誤消息:“無法重新聲明類”。

但是,是否有可能在范圍設置為當前函數的情況下調用包含文件代碼?

例如,如果我們有兩個文件:

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")); ,命名空間也至少用最少的代碼也沒有產生預期的效果。

使用require_once()include_once() 它們將使PHP記住所包含的文件,而不會在代碼中的其他位置再次包含它們。 在第一個包含/要求之后,同一文件上的后續包含/替換基本上將變為空操作。

命名空間應解決此問題-> http://php.net/manual/zh/language.namespaces.php

您應該嘗試為類實現自動加載 這將有助於防止此類情況。

看來,猴子補丁的伎倆

<?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.的提示!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM