我有一个在php中使用这种语法的想法。它说明有不同的回退方式来创建对象
function __construct() {
if(some_case())
$this = method1();
else
$this = method2();
}
这是一场噩梦吗?或者它有效?
我有一个在php中使用这种语法的想法。它说明有不同的回退方式来创建对象
function __construct() {
if(some_case())
$this = method1();
else
$this = method2();
}
这是一场噩梦吗?或者它有效?
或者它有效吗?
它不起作用。您无法取消设置或从根本上更改构造函数中正在创建的对象。您也可以不设置返回值。你所能做的就是设置对象的属性。要解决这个问题
一种方法是有一个单独的“工厂”类或函数,来检查病情,并返回正确的对象,像这样一个新的实例:
function factory() {
if(some_case())
return new class1();
else
return new class2();
}
参见:
为什么不能做一些比较常见的,如:
function __construct() {
if(some_case())
$this->construct1();
else
$this->construct2();
}
您可以只创建类的方法方法1和method2和只写
function __construct() {
if(some_case())
$this->method1();
else
$this->method2();
}
这听起来像Singleton class pattern一点点。
您可以制造工厂方法。
例子:
class A {} class B {} class C { function static getObject() { if(some_case()) return new A(); else return new B(); } } $ob = C::getObject();
见@伊万等回答正确的语法是什么样子,你正在试图做的。
不过,也有另外一种选择 - 使用一个静态的方法代替构造函数:
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
)
如果你想分享一些功能,做一些像
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();
虽然应该是一个静态方法。 – BoltClock 2011-02-18 16:18:32