我想知道声明一个对象的属性是否是一个好习惯,如:
$this->name = $name;
退出函数__construct
我正在尝试使用数据库表中的数据构建一个对象。但是只有在注册了id时才会构建此对象。我知道__construct函数总是返回一个对象,所以我不能得到错误的返回。所以我尝试了以下内容:
//test.php
$mod = new item($id);
if($mod->validate()) {
$item = $mod;
}
class item {
protected $id;
public function __construct($id) {
$this->id = $id;
}
public function validate() {
$db = new db('restaurants_items_modifiers');
if($mod = $db->get($this->id)) {
$this->price = $mod['price'];
$this->name = $mod['name'];
$this->desc = $mod['desc'];
return true;
} else {
return false;
}
}
}
这样可行,但这样做是一种很好的做法吗?或者我应该在__construct
函数上声明所有内容?
答案 0 :(得分:1)
做你正在做的事情很好,但我认为将数据库注入构造并将id引入验证更有意义。创建setId()
也很有价值:
class item
{
protected $id,
$db;
# Inject the $db instead
public function __construct(db $db)
{
$this->db = $db;
}
# Inject the id here
public function validate($id = false)
{
if(!empty($id))
$this->id = $id;
if($mod = $this->db->get($this->getId())) {
$this->price = $mod['price'];
$this->name = $mod['name'];
$this->desc = $mod['desc'];
return true;
} else {
return false;
}
}
# Create a method that can assign so you can reused the object
public function setId($id)
{
$this->id = $id;
# Return the object for chaining
return $this;
}
# Have a method to get current id
public function getId()
{
return $this->id;
}
}
# Create instance, inject db class
$mod = new item(new db('restaurants_items_modifiers'));
# Inject the id here
if($mod->validate($id)) {
$item = $mod;
}
您也可以重置此ID。它们基本上与注入validate()
相同,但它取决于您希望能够在线下$id
访问多少(可能将其private
转为将其锁定可能需要直接访问):
$mod->setId($id)->validate();