2016-04-29 10 views
4

我只是瞎搞,我已經遇到這不起作用:命名空間用的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-Apr-2016 14:12:42 America/New_York] PHP Fatal error: Cannot redeclare a_func() (previously declared in data:text/plain, <?php function a_func(){echo "hi";}:1) in data:text/plain, <?php function a_func(){echo "bye";} on line 1

不工作

<?php 
namespace first{ 
    eval('function a_func(){echo "hi";}'); 
    a_func(); 
} 
namespace second{ 
    eval('function a_func(){echo "bye";}'); 
    a_func(); 
} 

[29-Apr-2016 14:19:21 America/New_York] PHP Fatal error: Cannot redeclare a_func() (previously declared in C:\path\test.php(3) : eval()'d code:1) in C:\path\test.php(7) : eval()'d code on line 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()工作?

回答

6

includeeval導致編譯器處理它們的輸入,就好像它來自兩種情況下的單獨文件。

這意味着您在設置代碼中的名稱空間聲明不會傳遞到來自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(); 
}