PHP belirli bir sınıfın örneğini almak nasıl?

10 Cevap php

Ben ise orada class_A in exists bir örneği, ve does exist, eğer orada get bu örneği kontrol etmeniz gerekir.

PHP bunu yapmak nasıl?

Her zaman olduğu gibi, ben basit bir örnek iyi olduğunu düşünüyorum.

Now Benim bir sorun haline gelmiştir:

$ins = new class_A();

Başlatmasını class_A, statik bir üye değişkeni örneğini saklamak için nasıl?

__construct() çağrılırken örneği saklanabilir eğer daha iyi olacak. Say, bunun örneğinin nasıl üzerinde bir sınırlama olmaksızın çalışması gerekir.

10 Cevap

Eğer kurucu değiştirebilir miyim? Yani olabilir:

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

if ($a = a::$instance) {
    //do something with existing instance of a
}

Ne sormak için (Eh, belki de bir teknik anlamda, ama son derece pratik) imkansız. Bu nesnelerin ve sınıfların amacı hakkında derin bir yanlış anlama var olduğunu göstermektedir.

Ile tekiz desen, bir PHP example from Wikipedia ben bir "checkExists" yöntemi eklediğiniz, bunu çıkış yapmazsa mutlaka onu yaratmadan sınıfın varlığı için kontrol etmek istediğiniz gibi geliyor:

final class Singleton 
{
    protected static $_instance;

    protected function __construct() # we don't permit an explicit call of the constructor! (like $v = new Singleton())
    { }

    protected function __clone() # we don't permit cloning the singleton (like $x = clone $v)
    { }

    public static function getInstance() 
    {
      if( self::$_instance === NULL ) {
        self::$_instance = new self();
      }
      return self::$_instance;
    }

    public static function checkExists() 
    {
      return self::$_instance;
    }
}

if(Singleton::checkExists())
   $instance = Singleton::getInstance();

Belki gibi bir şey istiyorum

for (get_defined_vars() as $key=>$value)
{
  if ($value instanceof class_A)
    return $value;
}

EDIT: Upon further reading, you have to jump through some hoops to get object references. So you might want return $$key; instead of return $value;. Or some other tricks to get a reference to the object.

Ben ne istediğiniz olduğunu düşünüyorum Registry Pattern

Pikrass cevap genişletmek için, temelde böyle bir şey yapmak isteyeceksiniz:

class class_A {
  private static $instance = false;

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

    return self::$instance;
  }

  // actual class implementation goes here
}


// where you need to use the instance:
$mySingleton = class_A::getInstance();
// do something with $mySingleton

Singleton'ununu kullanarak, temelde global variable büyük bir oluştururken unutmayın. Değiştiğinde durumu var ise, kod öngörülemeyen olabilir. Yani dikkatli kullanın.

Lütfen dosyaları tekiz örnekleme eğitimde kullanılan yedek bir sabit odaklı davranış dönüşebilir bir sorun ise: sabitleri (yani benzersiz olmak şartı bir örneği durumunda, senaryonun tüm süre için söz konusu olan tüm komut süresi) inşaat yöntemi, uygun bir şekilde, bir sabit varlığı / değerine bağlı olabilir.

class superObject {
    public function __construct() {
        if (defined('SUPER_OBJECT')) {
            trigger_error('Super object '.__CLASS__.' already instantiated', E_USER_ERROR);
                    // ...or just do whatever you want to do in case of instances overlap
        } else {
            define('SUPER_OBJECT', true);
        }
    // the rest of your construct method
    // ...
    }
}