Создание интерфейса в PHP, который может указать тип, чтобы определить, какой класс использовать - PullRequest
0 голосов
/ 21 августа 2010

Я создаю интерфейс для «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, ..

Как это можно сделать? Это вообще возможно? Это лучшая практика?

Ответы [ 2 ]

4 голосов
/ 21 августа 2010

То, что вы описываете - это шаблон фабрики, так что да, это лучшая практика.

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" в том же каталоге, что и фабрика, и что конструктору в ваших классах нужен только один параметр.

Iне проверял этот код, поэтому, возможно, произошла ошибка.

0 голосов
/ 21 августа 2010

Я бы создал 1 функцию точки выдачи, где вы определяете номер точки выдачи с оператором if внутри.

Pickup Point ($pickuppointnum) {

  if ($pickuppointnum == 1){
    //Pickup Point information for Pickuppoint #1
  }
  elseif ($pickuppointnum ==2) {
    //Pickup Point information for Pickuppoint #2
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...