所以基本上我想创建多个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
答案 0 :(得分:1)
你可以用额外的要求包装你的课程。将您的内容放到other_file.php并将其包含在模块文件中。
或者在模块文件中使用eval包装代码。 :^)
答案 1 :(得分:1)
看起来他们将eval作为在包含文件之前进行语法检查的方法。我认为最好只删除use语句。由于未执行,因此无法找到命名空间。在语法验证没问题之后,它会执行一个require,因此对于应用程序的工作,在语法检查期间删除使用并不重要。
可能是这样的:
$file = preg_replace('/\n[\s\t]*?use\s.*?;/', '', $file);
将替换use语句,只要它放在新行上即可。