- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
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[] = sprintf(Tools::displayError('%1$s (parse error in %2$s)'), $module, substr($filepath, strlen(_PS_ROOT_DIR_)));
}
Это оригинал кода из знаменитого Prestashop ...
Попросили написать модуль. Долго мучался, почему валидный код не работает. Потом нашел.
Смысл логики в строках 13-17 : мы не хотим принимать файлы модулей с eval функцией.
Поэтому мы сначала проверяем, есть ли eval в файле.
Как проверяем?
А давайте его просто выполним!
Если выполнится - тогда - require_once
В общем я О....ЕЛ! Других слов просто нет.
Мало того, так еще нужно следить, чтобы ваш файл модуля был валидным для eval функции.
Иначе - Parse error: syntax error ...