2011-02-18 161 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 2011-02-18 16:18:32

4

为什么不能做一些比较常见的,如:

function __construct() { 

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

您可以只创建类的方法方法1和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

见@伊万等回答正确的语法是什么样子,你正在试图做的。

不过,也有另外一种选择 - 使用一个静态的方法代替构造函数:

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