Различное определение объекта на основе параметров конструктора в PHP? - PullRequest
0 голосов
/ 20 октября 2011

Я не верю, что это возможно, и поиск в Google не дал никаких результатов, но я думал, что спросить никогда не повредит.

Я пытаюсь внедрить Google Chart на своем сайте черезбиблиотека PHP.Библиотека, которая мне очень понравилась ( googlechartphplib ), содержит около 10 различных файлов классов для каждого типа диаграмм.Это означает, что для создания круговой диаграммы я должен использовать $chart = new GooglePieChart();, тогда как для создания QR-кода я должен использовать $chart = new GoogleQRCode(); и т. Д.

Однако, когда я действительно изучал использование API, я заметил, чтотип диаграммы передается в конструктор (он сохраняется и затем передается в API как часть строки запроса).Например, код для построения линейного графика - это не просто $chart = new GoogleChart();, а $chart = new GoogleChart('lc', 500, 200); (где lc определяет «линейный график», 500 и 200 - измерения)

Это заставило меня задуматься: почему я не могу просто прочитать этот первый параметр, чтобы определить, какой тип диаграммы создать?Есть один универсальный конструктор:

$piechart = new GoogleChart('pie');
$linechart = new GoogleChart('lc');
$qrcode = new GoogleChart('qr');
...

Я могу придумать способ сделать это, используя операторы switch / case во всех моих вызовах функций.Например:

public function computeQuery() {
    switch( $this->type ) {
        case 'qr':
            /* QR code function */
            break;
        case 'pie':
            /* Pie chart function */
            break;
        case 'lc':
        default:
            /* line chart code */
            break;
    }

Однако это потребовало бы переписывания всего кода, который уже присутствует (немного ускорилось благодаря моей способности копировать / вставлять 90% кода).Есть ли способ просто выбрать, какой класс результирующий объект должен быть основан на параметрах конструктора?Пример:

public function __construct($type, $x, $y) {
    $this->type = $type;
    switch( $type ) {
        case 'qr':
            return new GoogleQRCode($x, $y);
        case 'pie':
            return new GooglePieChart($x, $y);
        case 'lc':
        default:
            $this->width = $x;
            $this->height = $y;
    }
}

1 Ответ

5 голосов
/ 20 октября 2011

Не в конструкторе, вы не можете.

Это одна из причин, по которой фабрики существуют.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...