включаемый файл с областью видимости - PullRequest
2 голосов
/ 26 августа 2011

Когда мы включаем файлы в PHP, они как-то кэшируются. Итак, если один содержит определение класса, когда мы пытаемся включить его дважды, мы получим сообщение об ошибке «Can not redeclare class».

Но возможно ли получить код включаемого файла, вызванный с областью действия, установленной для текущей функции, скажем?

например. если у нас есть два файла:

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 ]

1 голос
/ 26 августа 2011

Используйте require_once() и include_once(). Они заставят PHP помнить, какие файлы были включены, и НЕ включать их снова где-нибудь в коде. После первого включения / запроса последующие файлы в том же файле по сути станут недействительными.

0 голосов
/ 26 августа 2011

Кажется, что исправление обезьяны добилось цели :

<?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;

Большое спасибо Марку Б. за подсказку!

0 голосов
/ 26 августа 2011

Вы должны попробовать реализовать автозагрузку для ваших классов. Это поможет предотвратить такие вещи.

0 голосов
/ 26 августа 2011

Пространства имен должны исправить эту проблему -> http://php.net/manual/en/language.namespaces.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...