Я просто возился, и я сталкивался с этим:
Не работает
<?php namespace first{ include 'data:text/plain, <?php function a_func(){echo "hi";}'; a_func(); } namespace second{ include 'data:text/plain, <?php function a_func(){echo "bye";}'; a_func(); }
[29-апр-2016 14:12:42 America / New_York] PHP Неустранимая ошибка: не удается обновить a_func () (ранее объявлено в данных: text / plain, <? Php function a_func () {echo "hi";}: 1 ) в данных: text / plain, <? php function a_func () {echo "bye";} в строке 1
Не работает
<?php namespace first{ eval('function a_func(){echo "hi";}'); a_func(); } namespace second{ eval('function a_func(){echo "bye";}'); a_func(); }
[29-апр-2016 14:19:21 America / New_York] PHP Неустранимая ошибка: не удается обновить a_func () (ранее объявлено в C: \ path \ test.php (3): eval () 'd code: 1) в C: \ path \ test.php (7): код eval () 'в строке 1
Работает
<?php namespace first{ function a_func(){echo "hi";} a_func(); } namespace second{ function a_func(){echo "bye";} a_func(); }
Протестировано в PHP 5.6.20 и 7.0.5
Это ошибка? Особенность? Целенаправленно реализован?
Дополнительный кредит: Как сделать работу include()
или eval()
?
include
и eval
заставляют компилятор обрабатывать свой вход, как если бы он поступал из отдельного файла в обоих случаях.
Это означает, что ваши объявления пространства имен в установочном коде не передаются в код, входящий в include
/ eval
, а функции, которые определены там, определены в глобальном пространстве имен. Вы можете легко проверить это с помощью
<?php namespace outer; eval('function func(){}'); var_dump(function_exists('\outer\func')); // false var_dump(function_exists('\func')); // true
Чтобы получить ожидаемое поведение, вы должны включить объявления пространства имен в код, который вытягиваете:
<?php namespace first{ include 'data:text/plain,<?php namespace first; function a_func(){echo "hi";}'; a_func(); } namespace second{ include 'data:text/plain,<?php namespace second; function a_func(){echo "bye";}'; a_func(); }
а также
<?php namespace first{ eval('namespace first; function a_func(){echo "hi";}'); a_func(); } namespace second{ eval('namespace second; function a_func(){echo "bye";}'); a_func(); }