オブジェクトのクラスがあるとしましょう。例として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を使用できると想定されています。
だから、解決策?回避策?
ありがとう。