Взломщик проверки типов не распознает ключевое слово 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.

3 ответа

Во-первых, сам 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;
    }
}
Другие вопросы по тегам