5

我有一个在 php.ini 中使用这种语法的想法。它说明了创建对象有不同的后备方式

function __construct() {

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

}

这是一场噩梦吗?或者它有效?

4

7 回答 7

14

或者它有效?

它不起作用。您不能取消设置或从根本上更改在构造函数中创建的对象。您也可以不设置返回值。您所能做的就是设置对象的属性。

解决此问题的一种方法是拥有一个单独的“工厂”类或函数,它检查条件并返回正确对象的新实例,如下所示:

function factory() {

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

}

也可以看看:

于 2011-02-18T16:03:18.490 回答
4

为什么不做一些更常见的事情,比如:

function __construct() {

   if(some_case())
      $this->construct1();
   else
      $this->construct2();
}
于 2011-02-18T16:03:47.347 回答
1

您可以只创建类方法 method1 和 method2 并编写

function __construct() {

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

}
于 2011-02-18T16:04:57.627 回答
1

这听起来有点像Singleton 类模式

于 2011-02-18T16:06:21.217 回答
1

您可以制作工厂方法。

例子:

A类{}
B类{}

C类{
   函数静态getObject(){
      如果(某些情况())
         返回新的 A();
      别的
          返回新的 B();
   }
}

$ob = C::getObject();
于 2011-02-18T16:06:36.340 回答
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在静态方法中使用)

于 2011-02-18T16:09:22.397 回答
-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();
于 2014-06-18T14:04:35.043 回答