PHP:在构造函数中使用$ this

时间:2011-02-18 16:01:07

标签: php construct

我知道在php中使用这种语法。它说明了创建对象有不同的回退方式

function __construct() {

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

}

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

7 个答案:

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