Обход перегруженных конструктора в PHP


У меня есть класс, целью которого является отображения комментария. Я хотел бы, чтобы инстанцировать его, передав комментарий возражать, если я, случается, есть он доступен, или просто значения, если это то, что у меня имеется на данный момент. К сожалению, PHP не позволяют перегруженных конструкторов, так вот решение я придумал.

class CommentPanel extends Panel {
    //Private Constructor, called only from MakeFrom methods
    private function CommentPanel($text, $userName, $timestamp) {
        parent::Panel(0, $top, System::Auto, System::Auto);

        // Render comment
    }

    public static function MakeFromObject(Comment $comment) {
        return new CommentPanel($comment->text, $comment->User->nickname, $comment->last_updated_ts);
    }

    public static function MakeFromValues($text, $userName, $timestamp) {
        return new CommentPanel($text, $userName, $timestamp);
    }
}

Итак, вот два метода для создания CommentPanel:

$cp = CommentPanel::MakeFromObject($comment);
// or...
$cp = CommentPanel::MakeFromValues($text, $user, $last_updated_ts);
// but not
$cp = new CommentPanel(); //Runtime error

Я умеренно доволен, хотя это не так интуитивно, как перегруженный конструктор. Какие мысли по улучшению этого?



3709
7
задан 1 февраля 2011 в 02:02 Источник Поделиться
Комментарии
1 ответ

Учитывая, что PHP позволяет необязательных параметров и не требует проверки типа параметров, которые передаются в, можно вроде "фейк" перегруженный конструктор.

что-то вроде этого:

class CommentPanel extends Panel {
public function __construct($text_or_comment, $username=null, $timestamp=null) {
if (is_string($text_or_comment) {
$this->textConstructor($text_or_comment, $username, $timestamp);
}
else { // assume that it's a comment since it's not a string ... there are better ways to handle this though
$this->commentConstructor($text_or_comment);
}
}

private function textConstructor($text, username, $timestampe) { /* . . . */ }
private function commentConstructor(Comment $comment) { /* . . . */ }
}

Этот метод позволит более последовательный API и один, возможно, более знакомы с Java и C++.

Кроме того, я не уверен, какая версия PHP, которую вы нацелились, но я считаю, что в текущей версии используется метод __Construct вместо имени класса в качестве конструктора. Я не уверен, если это является предпочтительным, но в документации написано, что он проверяет метод __Construct, а затем имя класса стиля конструктор, так что я думаю, что, используя метод __Construct() вместо CommentPanel() позволит сократить время выполнения очень немного. Я не 100% уверен на что, хотя, это только мое понимание. Пожалуйста, поправьте меня, если я ошибаюсь :)

8
ответ дан 1 февраля 2011 в 06:02 Источник Поделиться