Как создать объект производного класса как объект базового класса в PHP - PullRequest
0 голосов
/ 21 октября 2011

Я внедряю Factory Pattern в php. Существует класс AbstractFactory, один из которых - класс ConcreteFactory. Ниже приведен код, который я использую:

/** AbstractFactory.php */
abstract class AbstractFactory{
      abstract function xyz();
}


/** ConcreteFactory.php */
require_once "AbstractFactory.php"
require_once "ABC.php"
class ConcreteFactory extends AbstractFactory{
     public function xyz(
           return new ABC();   
     );   
}


/** Client.php */

require_once "ConcreteFactory .php"
class Client extends ConcreteFactory {
   public function dothis() {

       // Now i want to create AbstractFactory type object from ConcreateClass

       AbstractFactory $afobject = new ConcreteFactory();
    }
}

(AbstractFactory $afobject ) возвращает ошибку разбора.
Может кто-нибудь сказать, пожалуйста, как создать этот объект?

Ответы [ 2 ]

2 голосов
/ 21 октября 2011

PHP это не Java.Вы не можете объявить экземпляр следующим образом:

AbstractFactory $afobject = new ConcreteFactory();

Вы просто делаете

$afobject = new ConcreteFactory();

, и это даст вам экземпляр ConcreteFactory в $ afobject.

Есть другиесинтаксические ошибки также:

 public function xyz(
       return new ABC();   
 );   

должен прочитать

 public function xyz() {
       return new ABC();   
 }   

, и после пропуска

require_once "ConcreteFactory .php"

отсутствует точка с запятой. Попробуйте код с IDE, которая выполняет синтаксисвыделите или запустите свой код с помощью php -l filename из командной строки, чтобы скопировать его.

1 голос
/ 21 октября 2011

вы создаете это так:

$afobject = new ConcreteFactory();

В PHP нет реальных типов, поэтому даункинг не нужен.Просто используйте объект, как если бы это была абстрактная фабрика.Обычно вы указываете это в документации.Допустим, вы хотите передать этот объект методу, который принимает только абстрактные фабрики, а затем просто указать его в атрибуте @param вашей документации.Я не рекомендовал бы использовать Type-Hints для этой цели, так как это вызовет уведомление, если вы попытаетесь поместить в конкретный класс.Если вы хотите убедиться, что у вас есть абстрактная фабрика, проверьте это с instanceof в первых строках вашего метода.

Надеюсь, это поможет, Томас

...