绕过eval()T_USE解析错误

时间:2014-08-06 08:32:01

标签: php namespaces eval

所以基本上我想创建多个PrestaShop模块。有些模块会在同一个商店中活跃。问题是我想使用不同定义的类' MyTools'在两个模块中。

这会导致类重新定义错误。我的解决方案是使用命名空间:

<?php

require_once('classes/MyTools.php');
use Module1\MyTools;

class Module1 extends Module
{

另一个模块:

<?php

require_once('classes/MyTools.php');
use Module2\MyTools;

class Module2 extends Module
{

MyTools类在这里有所不同:只保留使用过的函数,某些函数可能会更新。所以我不能对所有模块使用相同的类,也是不可能的。

现在这段代码效果很好,除了&#39; use&#39;使用eval()时不能使用语句;这正是我的问题,因为PrestaShop在重建和检查模块索引和更改时使用eval():

// If class does not exists, we include the file                                                                                  
if (!class_exists($module, false))                                                                                                
{                                                                                                                                 
    // Get content from php file                                                                                                     
    $filepath = _PS_MODULE_DIR_.$module.'/'.$module.'.php';                                                                          
    $file = trim(file_get_contents(_PS_MODULE_DIR_.$module.'/'.$module.'.php'));                                                     
    if (substr($file, 0, 5) == '<?php')                                                                                              
        $file = substr($file, 5);                                                                                                       
    if (substr($file, -2) == '?>')                                                                                                   
        $file = substr($file, 0, -2);                                                                                                   

    // If (false) is a trick to not load the class with "eval".                                                                      
    // This way require_once will works correctly                                                                                    
    if (eval('if (false){   '.$file.' }') !== false)                                                                                   
        require_once( _PS_MODULE_DIR_.$module.'/'.$module.'.php' );                                                                     
    else                                                                                                                             
        $errors[] = '...';  
}      

如果没有T_USE的解析错误,有没有办法绕过这个语句?

if (eval('if (false){   '.$file.' }') !== false)  

错误

Parse error: syntax error, unexpected 'use' (T_USE) in  in \classes\module\Module.php(1096) : eval()'d code on line 8

2 个答案:

答案 0 :(得分:1)

你可以用额外的要求包装你的课程。将您的内容放到other_file.php并将其包含在模块文件中。

或者在模块文件中使用eval包装代码。 :^)

答案 1 :(得分:1)

看起来他们将eval作为在包含文件之前进行语法检查的方法。我认为最好只删除use语句。由于未执行,因此无法找到命名空间。在语法验证没问题之后,它会执行一个require,因此对于应用程序的工作,在语法检查期间删除使用并不重要。

可能是这样的:

$file = preg_replace('/\n[\s\t]*?use\s.*?;/', '', $file);

将替换use语句,只要它放在新行上即可。