Я хотел бы знать, является ли хорошей практикой объявление свойства объекта, например:

$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?

php
0
Tomas Lucena 14 Июн 2017 в 06:16
Одно изменение, которое я хотел бы сделать, - это вставить соединение с вашей базой данных вместо того, чтобы делать это внутри метода validate().
 – 
Rasclatt
14 Июн 2017 в 06:20
Хорошо. Вы можете увидеть больше здесь, в этом вопросе Для чего используется функция __construct?
 – 
lgflorentino
14 Июн 2017 в 06:20
Кроме того, может иметь смысл ввести db в __construct($db) и $id в validate($id)
 – 
Rasclatt
14 Июн 2017 в 06:22

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();
1
Rasclatt 14 Июн 2017 в 06:51
Потрясающе, это имеет большой смысл для меня ... Мне нужно больше узнать об этой части инъекции, но я обязательно последую вашему совету
 – 
Tomas Lucena
14 Июн 2017 в 06:51