我知道在php中使用这种语法。它说明了创建对象有不同的回退方式
function __construct() {
if(some_case())
$this = method1();
else
$this = method2();
}
这是一场噩梦吗?或者它有效吗?
答案 0 :(得分:13)
或者它有效吗?
它不起作用。您不能取消或从根本上改变在构造函数中创建的对象。您也可以不设置返回值。您所能做的就是设置对象的属性。
解决这个问题的一种方法是使用单独的“工厂”类或函数来检查条件并返回正确对象的新实例,如下所示:
function factory() {
if(some_case())
return new class1();
else
return new class2();
}
另见:
答案 1 :(得分:4)
为什么不做更常见的事情,如:
function __construct() {
if(some_case())
$this->construct1();
else
$this->construct2();
}
答案 2 :(得分:1)
您只需创建类方法method1和method2,然后编写
即可function __construct() {
if(some_case())
$this->method1();
else
$this->method2();
}
答案 3 :(得分:1)
听起来有点像Singleton class pattern。
答案 4 :(得分:1)
您可以制作工厂方法。
示例:
class A {} class B {} class C { function static getObject() { if(some_case()) return new A(); else return new B(); } } $ob = C::getObject();
答案 5 :(得分: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
)
答案 6 :(得分:-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();