Общие функции php в хаке

Я решил начать новый проект, чтобы попасть в hacklang, и после исправления некоторых проблем, с которыми я изначально столкнулся при переходе с php-привычек, я столкнулся со следующими ошибками:

Unbound name: str_replace
Unbound name: empty

Проведя некоторое исследование, я обнаружил, что это связано с использованием «устаревшего» php, который не проверяется на тип, и выдает ошибку с //strict.

Ничего страшного, empty() было достаточно легко заменить, а вот str_replace() немного сложнее.

Есть ли эквивалентная функция, которая будет работать с //strict? Или хотя бы что-то подобное.

Я знаю, что мог бы использовать //decl, но мне кажется, что в моем случае это противоречит цели.

Есть ли хоть какой-то способ узнать, какие функции реализованы в хаке, а какие нет в документации, поскольку я не смог найти?

Для справки (хотя это не слишком относится к самому вопросу), вот код:

<?hh //strict
class HackMarkdown {
    public function parse(string $content) : string {
        if($content===null){ 
            throw new RuntimeException('Empty Content');
        }
        $prepared = $this->prepare($content);

    }
    private function prepare(string $contentpre) : Vector<string>{
        $contentpre = str_replace(array("\r\n","\r"),"\n",$contentpre);

        //probably need more in here
        $prepared = Vector::fromArray(explode($contentpre,"\n"));
        //and here
        return $prepared;
    }
}

person Tiksi    schedule 30.03.2014    source источник


Ответы (1)


Вам вообще не нужно менять код. Вам просто нужно сообщить инструментам Hack обо всех встроенных функциях PHP.

Самый простой способ сделать это — загрузить эту папку и поместить ее куда-нибудь в свой проект. . Я положил его в папку hhi в базе моего проекта. Файлы там сообщают Хаку обо всех встроенных функциях PHP.

Большинство из них не имеют подсказок типа, что может привести к тому, что Хак будет думать, что возвращаемый тип всего — mixed вместо фактического возврата, что на самом деле правильно в большинстве случаев, поскольку, например, str_replace может возвращать либо string, либо bool. . Однако он останавливает ошибки «несвязанного имени», что является основной причиной их добавления.

person Community    schedule 30.03.2014
comment
Это именно то, что вам нужно сделать. Соответствующая документация находится здесь: docs. hhvm.com/manual/ru/ - person Gabe Levi; 30.03.2014
comment
Важные примечания из документации: 1) эта папка установлена ​​в /usr/share/hhvm/hack, если вы используете наши бинарные пакеты Debian или Ubuntu, поэтому она может уже быть в вашей системе. 2) Вам нужно фактически скопировать, а не символическую ссылку, папку, из-за ограничений inotify в добавочном режиме . - person Josh Watzman; 30.03.2014
comment
Благодарю вас! Это именно то, что я искал. Я уже написал собственные версии explode и str_replace и не собирался делать остальные. Не уверен, как я пропустил это в документах. И спасибо за подсказку о символической ссылке, я как раз собирался это сделать. - person Tiksi; 31.03.2014