Я думаю, что я делаю это неправильно (создание класса PHP и знаки и многое другое)

#php #class #oop #inheritance

#php #класс #ооп #наследование

Вопрос:

В настоящее время у меня есть класс с именем user, который я хочу создать с разными переменными, но я думаю, что делаю это неправильно.

В настоящее время у меня есть класс «Unit» с этими двумя функциями

 public function __construct($table, $id) {
    require_once('database.php');
    require_once('app.php');
    require_once("postmark.php");
    $this->table = $table;
    $this->valid = true;

    if(!$id) {
        $this->valid = false;
    }

    $this->populate($id);
}

public function populate($id) {
    $db = new DB();
    $q = $db->where('id', $id)->get($this->table);
    $resp = $q->fetchAll();
    foreach ($resp as $row) {
        foreach ($row as $key=>$value) {
            if(!is_int($key))
                $this->$key = html_entity_decode($value, ENT_QUOTES);
            if(is_null($value)) {
                $this->$key = null;
            }
        }
    }
    if(count($resp) <= 0) $this->valid = false;
    $verdict = !$db->error;

    $db = null;
    unset($db);

    return $verdict;    
}
  

И затем мой класс «User» расширяет его следующим образом

 public function __construct($id, $hash = null, $verify = null, $api = null) {
    if($api)
    $value = $this->apiToId($api);
    else if($verify)
    $value = $this->verifyToId($verify);
    else if($hash)
    $value = $this->hashToId($hash);
    else 
    $value = $id;

    parent::__construct("users", $value);
}
  

Но я не могу не думать, что это плохой дизайн. Несколько вещей, которые я видел в прошлом, — это использование амперсандов, возможно, делающих это так, чтобы я мог делать

 $user = new User()->fromId($id);
  

Или

 $user = new User()->withHash($hash);
  

Вместо того, чтобы передавать ему длинный список нулевых параметров. Это или я мог бы улучшить то, как работает наследование. Хотя мне нравится думать, что я знаю, что я делаю с PHP, мне бы очень хотелось, чтобы мне помогли найти правильное направление. Документы PHP настолько громоздки, что я никогда не знаю, где искать, но всегда нахожу интересные полезные инструменты. Мне интересно, как я могу улучшить это для большей гибкости и структуры.

Комментарии:

1. просто примечание, на вашем месте я бы переместил require_once вызовы перед любым объявлением класса.

Ответ №1:

  • Переместите includes в самый верх вашего php-файла.Все, что должно быть включено условно, вероятно, плохо спроектировано.
  • Ваш класс unit должен быть объявлен как абстрактный.Это не позволяет никому создавать экземпляр unit. Вы можете объявлять только его подклассы.
  • Любые функции, относящиеся к вашему классу, должны быть объявлены как методы.Таким образом, пример, приведенный в ответе, который теперь удален, является ужасным выбором. Функция alloc действительно должна быть статической функцией, определенной в User . Фрагмент кода внизу.
  • Ваши init функции должны быть объявлены как статические и возвращать новый экземпляр класса.Определение экземпляра класса для повторного создания экземпляра класса — просто плохая идея.
  • Ваше подключение к базе данных должно использовать одноэлементный шаблон.Посмотрите, если вам нужно.

Опубликуйте свой полный код и прокомментируйте этот ответ, если вам нужна помощь в реализации всего этого.


 $user  = User::initWithHash($hash);


//your create method:
/**
 * Creates and returns a new instance of the class. Useful
 * @return an instance of User.
 */
public static function create() {
    return new User();
}