PHP bir nesnenin örneğine bir başvuru döndürmek

4 Cevap php

Ben bir tek fabrika var ve ben örneği yok etmek ve hayatta kalmak için başka bir yerde benim kod örnekleri zorunda değil tekil fabrika kullanın böylece bu nesne örneği bir başvuru dönmek istiyorum.

Ben yapabilmek için ne istiyorsunuz örnek:

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

4 Cevap

Bu işe yarayabilir:

<?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
?>

Açıkçası kesmek.

Için belgelere dayanarak unset , I do not think that is possible. You cannot actually, ona sadece bir kolu, bir nesneyi yok. Hala bir başvuruyu tutmak çevresindeki diğer değişkenler ise, nesne üzerinde yaşamaya devam edecektir.

Sen Cat nesne özel $ tahrip özelliği uygulamak suretiyle istediğinizi gerçekleştirebilirsiniz. PHP 5 varsayılan referans nesneleri geçer, böylece bu bölümü hakkında endişelenmenize gerek yok.

Bir iş etrafında bir kedi sınıf oluşturmak olacaktır

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