0

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

问题是,如果id__construct方法提供了 an 但数据库表中没有行有这个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
        }
    }

    ...

}

任何帮助,将不胜感激。

4

2 回答 2

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
于 2013-09-06T09:20:12.397 回答
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;
    }
}

...

}
于 2013-09-06T09:32:04.350 回答