PHP致命错误:从上下文''调用受保护的方法FormValidator :: setError()

时间:2011-01-25 21:46:45

标签: php class closures currying

考虑我的贫困阶层:

abstract class FormValidator
{
    private $error_objects = array();

    protected function setError($entry_name,$err_msg)
    {
        $this->error_objects[] = 
            new FormValidatorErrorObject($entry_name,$err_msg);
    }

    protected function setErrorCurry($entry_name)
    {
        $_this = $this;
        return function($err_msg) use($entry_name,$_this)
        {
            return $_this->setError($entry_name,$err_msg);
        };
    }

    public function countErrors()
    {
        return count($this->error_objects);
    }

    public function getError($index)
    {
        return $this->error_objects[$index];
    }

    public function getAllErrors()
    {
        return $this->error_objects;
    }

    abstract function validate();
}

我在实现类中使用它,如下所示:

$setError = $this->setErrorCurry('u_email');
    if(empty($uemail))
    {
        $setError(uregform_errmsg_email_null);
    }

    if(!filter_var($uemail,FILTER_VALIDATE_EMAIL))
    {
        $setError(uregform_errmsg_email_invalid);
    }

,这会导致以下错误:

Fatal error: Call to protected method FormValidator::setError() from context '' ...

问题:有没有办法让闭包“继承”类上下文?

1 个答案:

答案 0 :(得分:0)

显然不是原生的。 This manual note建议使用反射和包装类的相当麻烦的方式来为闭包提供私有/受保护的访问功能。