Я хотел бы знать, является ли хорошей практикой объявление свойства объекта, например:
$this->name = $name;
Вне функции __construct
Я пытаюсь создать объект с данными из таблицы базы данных. Но этот объект будет построен, только если идентификатор будет зарегистрирован. Я знаю, что функция __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
?
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;
}
Вы также можете сбросить идентификатор, сделав это. По сути, они делают то же самое, что и инъекция в validate()
, но это зависит от того, насколько вы хотите иметь доступ к $id
по линии (возможно, включив его private
, чтобы заблокировать его от может потребоваться прямой доступ):
$mod->setId($id)->validate();
Похожие вопросы
Новые вопросы
php
PHP - это широко используемый высокоуровневый, динамический, объектно-ориентированный и интерпретируемый язык сценариев, в первую очередь предназначенный для серверной веб-разработки. Используется для вопросов о языке PHP.
validate()
.__construct($db)
и$id
вvalidate($id)