Я думаю, что я делаю это неправильно (создание класса PHP и знаки и многое другое) - PullRequest
1 голос
/ 03 октября 2011

В настоящее время у меня есть класс с именем 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;    
}

А потом мой класс "Пользователь" расширяет его, как это так

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 Ответ

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

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


$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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...