1

私の貧しいクラスを考えてみましょう:

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 '' ...

質問: クロージャにクラス コンテキストを「継承」させる方法はありますか?

4

1 に答える 1

1

どうやらネイティブではないようです。このマニュアル ノートでは、リフレクションとラッパー クラスを使用して、クロージャーにプライベート/保護されたアクセス機能を提供するかなり面倒な方法を提案しています。

于 2011-01-25T21:52:55.623 に答える