2016-07-15 2 views
0

В нескольких разных местах я называю:PHP Have Object Возвращает другой объект

$model=NEW MakeCall($form); 

Я обновил MakeCall класс с некоторыми изменениями, которые я хочу принять повлиять после указанной даты. Я переименовал оригинальный класс MakeCallOld

Как я могу оставить мои звонки:

$model=NEW MakeCall($form); 

неповрежденными и в MakeCall сделать это:

class MakeCall 
{ ... 

    public function __construct($form) 
    { 
     //Use Legacy MakeCallOld for stuff before 2016-10-01 
     if ($form['date']<'2016-10-01') { 
      $object=NEW MakeCallOld($form); 
      return $object; 
     } 

     $this->perform several functions and set variables... 

Это в настоящее время только возвращает пустой объект класса MakeCallOld но он не запускает конструктор в MakeCallOld, поскольку все свойства пустые. Мне бы хотелось, чтобы весь объект MakeCallOld упал на $model.

+0

Возможный дубликат [Возвращение значения в конструктор функции класса] (http://stackoverflow.com/questions/6849572/returning-a-value-in-constructor-function-of-a-class) – imtheman

+0

Вы хотите фабрику – felipsmartins

ответ

0

Что вам нужно, это статический заводский конструктор. Так вы должны делать это, чтобы добавить логику инициализации или конструкторы переключателей в зависимости от аргумента.

class MakeCall 
{ 

    public function __construct($form) 
    { 
     $this->form = $form; 
    } 

    public function showForm(){ 
     echo $this->form; 
    } 


    public static function create($form){ 
     //put logic for picking object or whatever here! 
     $object = new MakeCall($form); 
     //Do more initializing if you want here! 
     return $object; 

    } 
} 

$form = "asdasd"; 
$model= MakeCall::create($form); 
$model->showForm(); 
0

Конструкторы не имеют возвращаемого значения, поэтому, говоря return $object, вы просто прекращаете поток управления там и ничего не делаете, никогда не достигаете «выполнения нескольких функций и заданных переменных». В зависимости от вашей структуры вы должны подумать о том, чтобы сделать MakeCall inherit от MakeCallOld, тогда вы можете просто позвонить parent::__construct(); в конструктор MakeCall.

Смежные вопросы