Bir sınıf örneği

4 Cevap

bir PHP komut dosyası aynı sınıfın örneğini önlemek için bir yol var?

$user = new User();


$user2 = new User();  // I want to catch another instance of the user class and throw an exception

Ben bir statik değişkeni oluşturma ve statik fonksiyonu ile manipüle denedim:

User::instance()

ama bunu yaparken beni durmuyor:

$user = new User();

4 Cevap

Nesne semantik değiştirmeden, yapıcı bir statik sayaç tutmak olabilir. Bu yalnızca instantiatable kez, genel olarak kullanılabilir değil gibi bu, bir tek değil ...

class Foo {
    private static $counter = 0;
    final public function __construct() {
        if (self::$counter) {
            throw new Exception('Cannot be instantiated more than once');
        }
        self::$counter++;
        // Rest of your constructor code goes here
    }
    // Rest of class
}

Ben bunu denedim bu yana bir süre oldu, ama sizin __ construct yöntem korumalı veya özel yapım denediniz mi?

Ben php sözdizimi ve dil özellikleri hakkında emin değilim, ama User sizin User nesnesinin bir örneğini tutacak tarzda kendi sınıfındaki statik bir alan olabilir. Ve yapıcı bir hata atmak olun. Eğer User.Instance çağırabilir ve sadece mevcut örneği dönecektir kendi sınıfının bir örneğini istiyorum bu şekilde. Eğer nesne örneğini oluşturmak için çalışırsanız bir hata atmak olacaktır.

C # da böyle bir şey olmazdı. Ben de belirtildiği gibi, ben php sözdizimi bilmiyorum.

class User
{
  private static User instance = null;

  public User()
  {
      //throw exception
  }

  public static User Instance
  {
    get 
    {
       if(instance == null)
       {
          instance = new User();
       }
       return instance;
    }
  }

}