0

我正在使用 $this 在匿名函数中调用成员函数。

 $this->exists($str)

PHP 5.4 没有给我带来问题,5.3 给我带来了问题。

错误是

<b>Fatal error</b>:  Using $this when not in object context in

这是我的代码

class WordProcessor
{

private function exists($str)
{
 //Check if word exists in DB, return TRUE or FALSE
 return bool;
}

private function mu_mal($str)
{

    if(preg_match("/\b(mu)(\w+)\b/i", $str))
    {   $your_regex = array("/\b(mu)(\w+)\b/i" => "");      
        foreach ($your_regex as $key => $value) 
            $str = preg_replace_callback($key,function($matches)use($value)
            {
                if($this->exists($matches[0])) //No problems in PHP 5.4, not working in 5.3
                    return $matches[0];
                if($this->exists($matches[2]))
                    return $matches[1]." ".$matches[2];
                 return $matches[0];
            }, $str);
    }
    return $str;
}

}
4

1 回答 1

4

您正在使用$this在单独上下文中执行的闭包内部。

mu_mal函数的开头,您应该声明$that = $this(或者$wordProcessor更明确地说明变量是什么)。然后,在你preg_replace_callback的闭包中,你应该在你的闭包中添加use ($that)和引用$that而不是$this.

class WordProcessor
{

    public function exists($str)
    {
        //Check if word exists in DB, return TRUE or FALSE
        return bool;
    }

    private function mu_mal($str)
    {
        $that = $this;

        if(preg_match("/\b(mu)(\w+)\b/i", $str))
        {
            $your_regex = array("/\b(mu)(\w+)\b/i" => "");      
            foreach ($your_regex as $key => $value) 
                $str = preg_replace_callback($key,function($matches)use($value, $that)
                {
                    if($that->exists($matches[0])) //No problems in PHP 5.4, not working in 5.3
                        return $matches[0];
                    if($that->exists($matches[2]))
                        return $matches[1]." ".$matches[2];
                    return $matches[0];
                }, $str);
        }
        return $str;
    }
}

请注意,您必须公开exists该类的公共 API(我在上面已经完成了)

此行为在 PHP 5.4 中已更改

于 2013-02-20T20:43:33.150 回答