返回对PHP中对象实例的引用

时间:2010-02-04 22:19:16

标签: php oop reference singleton factory

我有一个单例工厂,并希望它返回对对象实例的引用,以便我可以使用单例工厂来销毁实例,而不是在我的代码中的其他地方存在实例。

我希望能够做到的例子:

$cat = CatFactory::getInstance();
$cat->talk(); //echos 'meow'
CatFactory::destructInstance();
$cat->talk(); //Error: Instance no longer exists

4 个答案:

答案 0 :(得分:2)

根据unset的文档,我认为不可能。你不能实际销毁一个对象,只有它的句柄。如果其他变量仍然存在引用,则该对象将继续存在。

答案 1 :(得分:2)

这可行:

<?php
class FooFactory
{
  private static $foo;

  private function __construct()
  {
  }

  public static function getInstance()
  {
    return self::$foo ? self::$foo : (self::$foo = new FooFactory());
  }

  public static function destroyInstance()
  {
    self::$foo = null;
  }

  public function __call($fn, $args)
  {
    if (!method_exists(self::$foo, $fn) || $fn[0] == "_")
      throw new BadMethodCallException("not callable");

    call_user_func_array(array(self::$foo, $fn), $args);
  }

  # function hidden since it starts with an underscore
  private function _listen()
  {
  }

  # private function turned public by __call
  private function speak($who, $what)
  {
    echo "$who said, '$what'\n";
  }

}

$foo = FooFactory::getInstance();
$foo->speak("cat", "meow");
$foo->_listen();                 # won't work, private function
FooFactory::destroyInstance();
$foo->speak("cow", "moo");       # won't work, instance destroyed
?>

显然这是一个黑客攻击。

答案 2 :(得分:0)

您可以通过让Cat对象强制执行私有$ destroyed属性来完成您想要的任务。 PHP 5默认情况下通过引用传递对象,因此您不必担心该部分。

答案 3 :(得分:0)

解决方法是创建一个猫类

class cat
{
  public $cat;

  public function __construct()
  {
    $this->cat = CatFactory::getInstance();
  }

  public function __destruct()
  {
    CatFactory::destructInstance();
  }

}

$cat = new cat();
$cat->cat->talk();
$cat->cat->talk();