Хотелось бы получить критику на данный код

236
19 декабря 2016, 19:36

Это использование паттерна "Фабрика", прошу помощи понять, правильно ли я его использую.

<?php
Class HelloFactory {
  static $config = "My";
  public static function createHello() {
    $fullNameClass = self::$config . "Hello";
    return new $fullNameClass;
  } 
}
Class CustomHello {
  public function view() {
    return "hello world!";
  }
}
Class MyHello {
  public function view() {
    return "hello everybody";
  }
}
$test = HelloFactory::createHello();
echo $test->view();
Answer 1

Не совсем правильно. Фабрика должна создавать любой объект. Например расширяющих один интерфейс или абстрактный класс.

<?php
class HelloFactory {
  static $parentClass = "Hello";
  /**
   * @param string $className
   * @return Hello
   * @throws \Exception
   */
  public static function create($className) {
    if(!class_exists($className)) {
        throw new \Exception("Класс $className не найден");
    }
    if(!in_array(self::$parentClass, class_parents($className))) {
        throw new \Exception("Класс $className не наследует абстрактный класс " . self::$parentClass);
    }
    $object = new $className();
    // делегируем конфигурацию объекта самому объекту, иначе в фабрике много лишней логики и кода
    $object->init();
    return $object;
  } 
}
abstract class Hello {
  public $message;
  // инициализация объекта
  abstract function init();
  public function view() {
    return $this->message;
  }
}
class HelloWorld extends Hello {
  public function init() {
    $this->message = 'hello world!';
  }
}
class HelloEveryBody extends Hello {
  public function init() {
    $this->message = 'hello everybody!';
  }
}
$test = HelloFactory::create('HelloWorld');
echo $test->view() . PHP_EOL;
$test2 = HelloFactory::create('HelloEveryBody');
echo $test2->view() . PHP_EOL;
// получаем исключение
$test3 = HelloFactory::create('HelloAnyBody');
echo $test3->view() . PHP_EOL;
Answer 2

В данной реализации ваша фабрика может создавать только объекты класса MyHello, а должна создавать объекты различных классов. Посмотрите небольшую статью, там всё понятно написано. Напишите интерфейс, который будут реализовывать порождаемые классы и дополните описание метода createHello() с помощью PHPDoc и будет всё отлично.

READ ALSO
Передать другой формат даты в MySQL [дубликат]

Передать другой формат даты в MySQL [дубликат]

На данный вопрос уже ответили:

184
остановить отправку формы ajax

остановить отправку формы ajax

Как при соответствующем ответе от пхп файла остановить отправку формыСейчас форма отправляется в любом случае

181
Обратный отсчет jquery.flipCountDown

Обратный отсчет jquery.flipCountDown

У меня есть php переменная

287
Как сделать перенос данных из одной страницы на другую в автоматическом режиме

Как сделать перенос данных из одной страницы на другую в автоматическом режиме

Есть одна таблица на одной странице сайта, в ней содержатся определённые данныеЕсть другая таблица на другой странице

195