Взломщик проверки типов не распознает ключевое слово global внутри функции

Я использую 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.

4

Решение

Во-первых, сам HHVM поддерживает все, начиная с языка PHP, когда вы пишете код PHP, включая global, Это ограничение связано с использованием вами языка хака — global это одна из вещей, которые мы удалили из языка. Если вам действительно нужны глобалы, вы можете использовать $GLOBALS только в частичном режиме, но строгий режим запрещает им вообще. (И если вы видите нашу документацию, используя global, это неправильно, пожалуйста, используйте кнопку на странице, чтобы сообщить об ошибке!)

4

Другие решения

Вместо того, чтобы использовать 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);

Таким образом, вы создаете гораздо более гибкий и стабильный код, чем игра с глобальными переменными, которые должны быть удалены из разума каждого человека.

1

ОБНОВИТЬ !!!

Казалось бы, это решило проблему, я хотел бы знать, почему 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;
}
}
0
По вопросам рекламы [email protected]