Creando una interfaz en PHP, que puede especificar un tipo para determinar qué clase usar

Estoy creando una interfaz para “PickupPoints”. Cada punto de recogida debe ser capaz de devolver todos los puntos de recogida encontrados y los detalles del punto de recogida y, tal vez, en el futuro, más información. Está bien con el siguiente código:

<?php interface iPickupPoint { public function getPickupPoints($countryCode, $postalCode, $city); public function getPickupPointDetails($pickupPointId); } class PickupPoint1 implements iPickupPoint{ ... } class PickupPoint2 implements iPickupPoint{ ... } 

El problema es que no quiero llamar a las clases de PickupPoint1, PickupPoint2, … ellos mismos. Quiero una clase como PickupPoint (PickupPointType) así que solo quiero dar el tipo de punto de recogida y los tipos deben ser PickupPoint1, PickupPOint2, …

¿Cómo puede hacerse esto? ¿Esto es posible? ¿Es esta una mejor práctica?

Lo que está describiendo es el patrón de Fábrica, entonces sí, es una mejor práctica.

http://www.devshed.com/c/a/PHP/Design-Patterns-in-PHP-Factory-Method-and-Abstract-Factory/

Su fábrica en sí misma no necesita implementar la interfaz. Podría ser una clase estática o incluso una función:

 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"); 

La lógica de creación puede ser mucho más genérica para evitar cambiar de fábrica cada vez que agrega una clase a su aplicación:

 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()); 

Éste supone que estás creando tus clases en archivos llamados “PickupPoint1.class.php” en el mismo directorio que la fábrica, y que el constructor de tus clases solo necesita un parámetro.

No probé este código, por lo que algunos errores podrían haber ingresado.

Crearía 1 función de punto de recogida donde especificaría el número del punto de recogida con una instrucción if dentro.

 Pickup Point ($pickuppointnum) { if ($pickuppointnum == 1){ //Pickup Point information for Pickuppoint #1 } elseif ($pickuppointnum ==2) { //Pickup Point information for Pickuppoint #2 } }