7

我决定开始一个新项目来进入 hacklang,在解决了一些我最初遇到的从 php 习惯过渡的问题之后,我遇到了以下错误:

Unbound name: str_replace
Unbound name: empty

做了一些研究,我发现这是由于使用了未经过类型检查的“旧版”php,并且会在//strict.

这很好,empty()很容易更换,但是str_replace()有点困难。

是否有等效的功能可以使用//strict?或至少类似的功能。

我知道我可以使用//decl,但我觉得这违背了我的目的。

至少有什么方法可以判断哪些功能是在 hack 中实现的,哪些不在文档中,因为我找不到?

作为参考(虽然它与问题本身并不太相关),这里是代码:

<?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;
    }
}
4

1 回答 1

5

您根本不需要更改代码。你只需要告诉 Hack 工具所有内置的 PHP 函数。

最简单的方法是下载此文件夹并将其放在项目中的某个位置。我把它放在我项目基础的一个 hhi 文件夹中。那里的文件告诉 Hack 所有内置的 PHP 函数。

它们中的大多数没有类型提示,这可能导致 Hack 认为所有内容的返回类型mixed而不是实际返回,这在大多数情况下实际上是正确的,例如,str_replace可以返回 astring或 a bool。但是,它确实停止了“未绑定名称”错误,这是添加它们的主要原因。

于 2014-03-30T10:18:30.380 回答