Вернуть ссылку на экземпляр объекта в PHP - PullRequest
0 голосов
/ 05 февраля 2010

У меня есть одноэлементная фабрика, и я хотел бы, чтобы она возвращала ссылку на экземпляр объекта, чтобы я мог использовать одноэлементную фабрику для уничтожения экземпляра и не иметь экземпляров в другом месте моего кода для выживания.

Пример того, что я хотел бы сделать:

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

Ответы [ 4 ]

2 голосов
/ 05 февраля 2010

Это может сработать:

<?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 голосов
/ 05 февраля 2010

На основании документации для unset я не думаю, что это возможно. Вы не можете на самом деле уничтожить объект, только ручку к нему. Если вокруг находятся другие переменные, которые все еще содержат ссылку, объект будет продолжать жить.

0 голосов
/ 05 февраля 2010

Обходным путем было бы создание класса кошки

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();
0 голосов
/ 05 февраля 2010

Вы можете достичь желаемого, если ваш объект Cat принудительно установит закрытое свойство $ destroy. PHP 5 передает объекты по ссылке по умолчанию, поэтому вам не нужно беспокоиться об этой части.

...