我有一个在 php.ini 中使用这种语法的想法。它说明了创建对象有不同的后备方式
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();
}
您可以只创建类方法 method1 和 method2 并编写
function __construct() {
if(some_case())
$this->method1();
else
$this->method2();
}
这听起来有点像Singleton 类模式。
您可以制作工厂方法。
例子:
A类{} B类{} C类{ 函数静态getObject(){ 如果(某些情况()) 返回新的 A(); 别的 返回新的 B(); } } $ob = C::getObject();
有关您正在尝试执行的操作的正确语法,请参见@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
在静态方法中使用)
如果你想分享一些功能,做一些喜欢
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();