2011-02-18 4 views
3

У меня есть идея использования этого синтаксиса в php. Это иллюстрирует, что существуют различные способы возврата объекта

function __construct() { 

    if(some_case()) 
     $this = method1(); 
    else 
     $this = method2(); 

} 

Это кошмар? Или это работает?

ответ

13

Или это работает?

Не работает. Вы не можете отменить или кардинально изменить объект, который создается в конструкторе. Вы также не можете установить возвращаемое значение. Все, что вы можете сделать, это установить свойства объекта.

Один из способов обойти это наличие отдельного «заводской» класса или функции, которая проверяет состояние и возвращает новый экземпляр правильного объекта, как так:

function factory() { 

    if(some_case()) 
     return new class1(); 
    else 
     return new class2(); 

} 

Смотрите также:

+2

Должен быть статический метод. – BoltClock

4

Почему бы не сделать что-то более общего вида:

function __construct() { 

    if(some_case()) 
     $this->construct1(); 
    else 
     $this->construct2(); 
} 
1

Вы можете просто создать класс методов method1 и method2 и просто написать

function __construct() { 

    if(some_case()) 
     $this->method1(); 
    else 
     $this->method2(); 

} 
1

Вы можете сделать заводской метод.

Пример: ответ

 
class A {} 
class B {} 

class C { 
    function static getObject() { 
     if(some_case()) 
     return new A(); 
     else 
      return new B(); 
    } 
} 

$ob = C::getObject(); 
0

Знакомства @ Ivan среди других для правильного синтаксиса для того, что он выглядит, как вы пытаетесь сделать.

Однако, есть еще одна альтернатива - использовать статический метод в качестве альтернативного конструктора:

class myclass { 
    function __construct() { /* normal setup stuff here */} 

    public static function AlternativeConstructor() { 
     $obj = new myclass; //this will run the normal __construct() code 
     $obj->somevar = 54; //special case in this constructor. 
     return $obj; 
    } 

} 

... 

//this is how you would use the alternative constructor. 
$myobject = myclass::AlternativeConstructor(); 

(примечание: вы определенно не можете использовать $this в статическом методе)

-1

Если вы хотите разделить некоторые функции, сделать некоторые, как

class base{ 
    'your class' 
} 

class A extends base{ 
    'your class' 
} 

class B extends base{ 
    'your class' 
} 

И позвони, как

if(some_case()) 
    $obj = new A(); 
else 
    $obj = new B(); 
Смежные вопросы