Я использую HHVM для написания системного инструмента и не могу понять, почему этот код выдает ошибку при запуске hh_client
$__al_paths = array();
function requires(string $classPath): void {
global $__al_paths;
$className = basename($classPath);
if (!isset($__al_paths[$className])) {
$__al_paths[$className] = AL_CLASSES_FOLDER.'/'.$classPath.'.'.AL_CLASS_EXTENSION;
}
}
Это выдает следующее, когда я бегу hh_client
/usr/lib/mango/tools/autoloader.hh:9:9,19: Expected
Линия, на которую он указывает, является линией, которая говорит
global $__al_paths;
Который объявляется в global
объем. Это кажется синтаксической ошибкой, это как если бы global
Ключевое слово не поддерживается в HHVM, однако я проверил документацию, и в нем есть несколько примеров его использования в коде Hack.
Во-первых, сам HHVM поддерживает все, начиная с языка PHP, когда вы пишете код PHP, включая global
, Это ограничение связано с использованием вами языка хака — global
это одна из вещей, которые мы удалили из языка. Если вам действительно нужны глобалы, вы можете использовать $GLOBALS
только в частичном режиме, но строгий режим запрещает им вообще. (И если вы видите нашу документацию, используя global
, это неправильно, пожалуйста, используйте кнопку на странице, чтобы сообщить об ошибке!)
Вместо того, чтобы использовать global
попробуйте переписать ваш код следующим образом (это называется внедрение зависимостей):
function requires(string $classPath, $__al_paths): void {
$className = basename($classPath);
if (!isset($__al_paths[$className])) {
$__al_paths[$className] = AL_CLASSES_FOLDER.'/'.$classPath.'.'.AL_CLASS_EXTENSION;
}
}
Тогда назовите это как:
$__al_paths = array();
requires('classpath', $__al_paths);
Таким образом, вы создаете гораздо более гибкий и стабильный код, чем игра с глобальными переменными, которые должны быть удалены из разума каждого человека.
ОБНОВИТЬ !!!
Казалось бы, это решило проблему, я хотел бы знать, почему global
ключевое слово не работает, хотя
$__al_paths = array();
function requires(string $classPath): void {
$__al_paths = $GLOBALS['__al_paths'];
$className = basename($classPath);
if (!isset($__al_paths[$className])) {
$__al_paths[$className] = AL_CLASSES_FOLDER.'/'.$classPath.'.'.AL_CLASS_EXTENSION;
$GLOBALS['__al_paths'] = $__al_paths;
}
}