#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();
}