-3
<?php 
     require_once 'database.php';
class User {
public $id;
public $username;
public $first_name;
public $last_name;
public $password;
public static function find_by_id($id){
    $result_array = self::find_by_sql("SELECT * FROM users WHERE id = {$id} LIMIT 1");
    return !(empty($result_array))? array_shift($result_array): false;
}
public static function find_by_sql($sql){
    global $database;
    $result = $database->query($sql);
    $object = array();
    while ($row = $database->fetct_array($result)){
     $object[] = self::instantiate($row);  
    }
    return $object;
}
public static function instantiate($record)
        {
    $object = new self;
    foreach($record as $attribute => $value)
        {
        if ($object->has_attribute($attribute)){
            $object->$attribute = $value;
        }
    }
    return $object;
}
private static function has_attribute($attribute){       
    $object_var = get_object_vars($this);
    return array_key_exists($attribute, $object_var);


}
}
?>

関数 has_attribute を呼び出そうとするとエラーが発生しました。注意: 未定義の変数: this

get_object_varsこれをプライベート関数で使用できない理由has_attribute($attribute)。誰でもそれで私を助けることができますか?ありがとうございました。

4

2 に答える 2

5

$thisは静的メソッドで定義されていません (特定のオブジェクトではなく、一般にクラスに属しています)。ただし、クラス内のすべてのメソッドは として定義されていstaticます。

has_attributeのインスタンスをパラメーターとして受け取るようにメソッドを変更することもできますが、それはUser良い設計ではないと思います。実際、なぜこのメソッドが必要なのかまったくわかりません。オブジェクトの存在しないプロパティにアクセスするすべての場合で、いわゆる魔法のメソッド __get()が自動的に呼び出されます。

オーバーロード メソッドは、宣言されていない、または現在のスコープに表示されていないプロパティまたはメソッドと対話するときに呼び出されます。[...]__get()アクセスできないプロパティからデータを読み取るために利用されます。

存在しないプロパティへのアクセスを防止するように定義した場合has_attribute(たとえば、これらの試行をログに記録する)、コードを に移動します__get

于 2013-10-26T07:44:28.053 に答える
2

これは$this、静的コンテキストではキーワードにアクセスできないためです。

Source

于 2013-10-26T07:45:30.013 に答える