为什么我不能在get_object_vars中使用$ this

时间:2013-10-26 07:42:45

标签: php

<?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时出错。 注意:未定义的变量:此

为什么我不能在get_object_vars私有函数has_attribute($attribute)中使用它。 任何人都可以帮助我吗? 谢谢。

2 个答案:

答案 0 :(得分:5)

$this未在静态方法中定义(它们通常属于类,而不属于特定对象) - 但 all 类中的方法定义为{{1} }。

您可能想要更改static方法,因此它会将has_attribute的实例作为参数,但我不认为这是一个好的设计。实际上,我不明白为什么你需要这个方法:对于访问对象的不存在属性的所有情况,自动调用所谓的magic method __get()

  

在与属性交互时调用重载方法   或者尚未声明或在其中不可见的方法   目前的范围。 [...] User用于从不可访问的属性中读取数据。

如果您定义__get()以阻止访问不存在的属性(例如记录这些尝试),请将代码移至has_attribute

答案 1 :(得分:2)

这是因为在静态上下文中无法访问 $this 关键字。

Source