Я создаю интерфейс для «PickupPoints». Каждая точка пикапа должна быть в состоянии вернуть все найденные точки срабатывания и данные точки пикапа и, возможно, в будущем получить дополнительную информацию. Это нормально с кодом ниже:
<?php interface iPickupPoint { public function getPickupPoints($countryCode, $postalCode, $city); public function getPickupPointDetails($pickupPointId); } class PickupPoint1 implements iPickupPoint{ ... } class PickupPoint2 implements iPickupPoint{ ... }
Проблема в том, что я не хочу вызывать классы PickupPoint1, PickupPoint2, .. самих себя. Мне нужен класс, например PickupPoint (PickupPointType), поэтому я просто хочу указать тип точки срабатывания, а типы должны быть PickupPoint1, PickupPOint2, ..
Как это может быть сделано? Возможно ли это? Это лучшая практика?
То, что вы описываете, это шаблон Factory, так что да, это лучшая практика.
http://www.devshed.com/c/a/PHP/Design-Patterns-in-PHP-Factory-Method-and-Abstract-Factory/
Сама фабрика не нуждается в реализации интерфейса. Это может быть статический класс или даже функция:
class PickupPointFactory{ public static function create($type){ /* your creation logic here */ switch ($type) { case "PickupPoint1" : $obj = new PickupPoint1(); break; case "PickupPoint2" : $obj = new PickupPoint2(); break; } return $obj; } } $newPoint = PickupPointFactory::create("PickupPoint2");
Логика создания может быть намного более универсальной, чтобы не менять фабрику каждый раз, когда вы добавляете класс в свое приложение:
class PickupPointFactory{ public static function create($type, $options){ /* your creation logic here */ if(file_exists(dirname(__FILE__).'/'.$type.'.class.php')) { require_once(dirname(__FILE__).'/'.$type.'.class.php'); $obj = new $type($options); return $obj; } else { throw new Exception('Unknown PickupPoint type: '.$type); } } } $newPoint = PickupPointFactory::create("PickupPoint2", array());
Предполагается, что вы создаете свои классы в файлах с именем «PickupPoint1.class.php» в том же каталоге, что и на заводе, и что конструктору в ваших классах нужен только один параметр.
Я не тестировал этот код, поэтому может произойти ошибка.
Я бы создал 1 функцию точки переадресации, в которой вы указываете номер точки пикапа с выражением if внутри.
Pickup Point ($pickuppointnum) { if ($pickuppointnum == 1){ //Pickup Point information for Pickuppoint #1 } elseif ($pickuppointnum ==2) { //Pickup Point information for Pickuppoint #2 } }