是否可以从静态类方法获取当前类实例?

时间:2012-02-24 22:46:57

标签: php class

例如在此代码中:

class C{

  function static getInstance(){
    // here
  }

}


$c = new c;
print_r(C::getInstance()); // should be $c

或至少使用

print_r($c::getInstance()); // should be $c

3 个答案:

答案 0 :(得分:3)

嗯...... 没有,因为根据定义, 没有当前的类实例。可以从任何地方调用方法getInstance(),甚至不需要存在类C的实例。

答案 1 :(得分:2)

这是创建单身人士的错误方法,但你可以这样做:

class C {

  private static $instance;

  public static function getInstance(){
    return self::$instance;
  }

  public function __construct() {
    self::$instance = $this;
  }
}

$c = new c;
print_r(C::getInstance()); // should be $c

我不确定你要做什么,但这是的方法。

<强>更新

更好的方法是执行以下操作:

class C
{
   private static $instance;

   public static function getInstance()
   {
     if (!is_null(self::$instance)) return self::$instance;
     self::$instance = new self;
     return self::$instance;
   }

   private function __construct()
   {
     // Whatever
   }
}

$c = new C; // This will not work since __construct() is private
$c1 = C::getInstance();
$c2 = C::getInstance();

echo ($c1 == $c2 ? 'yes' : 'no'); // yes

答案 2 :(得分:1)

在PHP 5.3中,你有一些像__invoke()这样的神奇方法可以为你的单身人士做你想做的事。

在此处阅读更多内容:http://br2.php.net/manual/en/language.oop5.magic.php#object.invoke

<?php
class CallableClass
{
    public function __invoke()
    {
        return this;
    }
}
$obj = new CallableClass;
var_dump($obj);