Это использование паттерна "Фабрика", прошу помощи понять, правильно ли я его использую.
<?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();
Не совсем правильно. Фабрика должна создавать любой объект. Например расширяющих один интерфейс или абстрактный класс.
<?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;
В данной реализации ваша фабрика может создавать только объекты класса MyHello
, а должна создавать объекты различных классов. Посмотрите небольшую статью, там всё понятно написано. Напишите интерфейс, который будут реализовывать порождаемые классы и дополните описание метода createHello()
с помощью PHPDoc и будет всё отлично.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Как при соответствующем ответе от пхп файла остановить отправку формыСейчас форма отправляется в любом случае
Есть одна таблица на одной странице сайта, в ней содержатся определённые данныеЕсть другая таблица на другой странице