0

オブジェクトのクラスがあるとしましょう。例としてUserを使用しましょう。Userクラスには、送信する前にデータを検証するための独自のルールが含まれています。データベースに保存する前に、ルールがチェックされ、エラーがあれば返されます。それ以外の場合は、更新が実行されます。

class User extends DBTable // contains $Rules, $Data, $Updates, and other stuff
{
    public __construct($ID)
    {
        parent::__construct($ID);
        // I'll only list a couple rules here...
        $this->Rules['Email'] = array(
            'Empty' => 'ValidateEmpty', // pre-written functions, somewhere else
            'Invalid' => 'ValidateBadEmail', // they return TRUE on error
            'Duplicate' => function($val) { return existInDatabase('user_table', 'ID_USER', '`Email`="'. $val .'" AND `ID_USER`!='. $this->ID);}
        );
        $this->Rules['Password'] = array(
            'Empty' => 'ValidateEmpty',
            'Short' => function($val) { return strlen($val) < 8; }
        );
        this->Rules['PasswordConfirm'] = array(
            'Empty' => 'ValidateEmpty',
            'Wrong' => function($val) { return $val != $this->Updates['Password']; }
        );
    }

    public function Save(&$Errors = NULL)
    {
        $Data = array_merge($this->Data, $this->Updates);
        foreach($this->Rules as $Fields => $Checks)
        {
            foreach($Checks as $Error => $Check)
            {
                if($Check($Data[$Field])) // TRUE means the data was bad
                {
                    $Errors[$Field] = $Error; // Say what error it was for this field
                    break; // don't check any others
                }
            }
        }
        if(!empty($Errors))
            return FALSE;

        /* Run the save... */

        return TRUE; // the save was successful
    }
}

うまくいけば、私はここに十分に投稿しました。したがって、Eメールの重複エラーで、自分以外のユーザーに新しいEメールが存在しないことを確認したいと思います。また、 PasswordConfirmは、$ this-> Updates ['Password']を使用して、同じものを2回入力したことを確認しようとします。

保存が実行されると、ルールをループし、存在するエラーを設定します。

これが私の問題です:

Fatal error: Using $this when not in object context in /home/run/its/ze/germans/Class.User.php on line 19

このエラーは、$thisを使用するすべてのクロージャーで表示されます。

配列内のクロージャとクラス内のその配列の組み合わせが問題を引き起こしているようです。このRule配列は、クラスの外部(通常は「use」を含む)で正常に機能し、AFAIKクロージャはクラスで$thisを使用できると想定されています。

だから、解決策?回避策?

ありがとう。

4

1 に答える 1

2

問題はWrongバリデーターにあります。検証メソッドはここから呼び出されます。

if($Check($Data[$Field])) // TRUE means the data was bad

この呼び出しはオブジェクトコンテキストでは行われません(ラムダはクラスメソッドではありません)。したがって$this、ラムダの本体の内部では、オブジェクトコンテキストにある場合にのみ存在するため、エラーが発生します。

PHP> = 5.4.0の場合、次のキャプチャを実行することで問題を解決できます$this

function($val) { return $val != $this->Updates['Password']; }

Updatesこの場合、可視性に関係なくアクセスできます。

PHP> = 5.3.0の場合、オブジェクト参照のコピーを作成し、代わりにそれをキャプチャする必要があります。

$self = $this;
function($val) use($self) { return $val != $self->Updates['Password']; }

ただし、この場合は、である場合にのみアクセスできUpdatesますpublic

于 2013-01-30T01:01:52.217 に答える