PHP从__construct返回NULL

时间:2013-09-06 09:15:08

标签: php codeigniter

我正在尝试编写一些类,这些类将数据从我的数据库中提取出来,并根据该数据创建对象。我正在使用CodeIgniter。

问题是如果向id方法提供__construct但数据库表中没有行具有id,则返回一个对象,但所有属性都设置为NULL

如果没有相应的行,有没有办法可以检查并返回NULL而不是对象?

class JS_Model extends CI_Model
{
    protected $database_table_name;
    protected $database_keys;
    ...

    public function __construct($id = NULL){
        if($id){
            $this->getFromDatabase($id);
        }
    }

    ...

    function getFromDatabase($id){
        foreach($this->database_keys as $key){
           $this->db->select($key);
        }
        $this->db->from($this->database_table_name);
        $this->db->where('id', $id);
        $this->db->limit(1);
        $q = $this->db->get();

        if ($q->num_rows() > 0){
            foreach($q->result() as $property){     
                foreach($property as $key => $value){
                    $this->$key = $value;
                }
            }
        } else {
            // NEED TO SET THE OBJECT TO NULL FOR THIS CASE
        }
    }

    ...

}

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:4)

这是不可能的,一旦调用__construct,您将收到一个对象实例。

处理此问题的正确方法是从构造函数中抛出Exception

class JS_Model extends CI_Model
{
    protected $database_table_name;
    protected $database_keys;

    public function __construct($id = NULL){
        if($id){
            $row = $this->getFromDatabase($id);
            if (!$row) {
                throw new Exception('requested row not found');
            }
        }
    }
}

try {
    $record = new JS_Model(1);
} catch (Exception $e) {
    echo "record could not be found";
}
// from here on out, we can safely assume $record holds a valid record

答案 1 :(得分:1)

为什么不让你的构造函数私有并使用像GetInstance()这样的方法;这样的事情。语法可能不正确,因为我不再写多少php: - (。

class JS_Model extends CI_Model
{
protected $database_table_name;
protected $database_keys;
...

private function __construct($id = NULL){

}
public static function GetInstance($id)
{
  $x = new JS_Model($id);
  $x->getFromDatabase($id);
  if(is_object($x))
  {
    return $x;
  }
  return null;

}
...

function getFromDatabase($id){
    foreach($this->database_keys as $key){
       $this->db->select($key);
    }
    $this->db->from($this->database_table_name);
    $this->db->where('id', $id);
    $this->db->limit(1);
    $q = $this->db->get();

    if ($q->num_rows() > 0){
        foreach($q->result() as $property){     
            foreach($property as $key => $value){
                $this->$key = $value;
            }
        }
    } else {
       return null;
    }
}

...

}