Пространство имен с eval () и include () не работает должным образом

Я просто возился, и я сталкивался с этим:


Не работает

<?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() ?

    Related of "Пространство имен с eval () и include () не работает должным образом"

    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(); }