PHP statik sınıf ve tekiz sınıf arasındaki tam fark nedir

2 Cevap php

Ben her zaman PHP bir kayıt nesnesi için bir Singleton sınıf kullanmış. Tüm Singleton sınıflar gibi ana yöntem bu gibi görünüyor düşünüyorum:

class registry
{
    public static function singleton()
    {
        if( !isset( self::$instance ) )
        {
            self::$instance = new registry();
        }
        return self::$instance;
    }

    public function doSomething()
    {
        echo 'something';
    }
}

Ben kayıt sınıfının bir şey gerektiğinde bu yüzden bu gibi bir işlevi kullanın:

registry::singleton()->doSomethine();

Şimdi fark sadece normal statik işlev oluşturma arasında ne olduğunu anlamıyorum. Ben sadece normal bir statik sınıf kullanmak eğer yeni bir nesne oluşturur.

class registry
{
    public static function doSomething()
    {
        echo 'something';
    }
}

Şimdi sadece kullanabilirsiniz:

registry::doSomethine();

Birisi işlevi tekiz sınıf ne olduğunu bana açıklayabilir. Ben gerçekten bu anlamıyorum.

2 Cevap

Bir statik işlev, bir sınıfın bir nesnesi yaratmadan denebilecek bir fonksiyonudur.

registry::doSomething()

Bir Singleton design pattern, bir sınıfın birden fazla örneği oluşturmasını sınıf erişmelerini engellemek gerektiğidir. Bu nedenle, sadece one instance bir tek sınıfın genellikle yoktur. Bir Singleton'ın yapıcı ilan private ve tek örnek-nesneyi sağlayan bir statik yönteme sahip olmalıdır:

class Singleton
{
   private Singleton()
   {
   }

   private static var $instance = null;

   public static getInstance()
   {
     if(self::$instance == null)
       self::$instance = new Singleton();
     return self::$instance; 
   }
}

Daha fazla bilgi için bkz: http://en.wikipedia.org/wiki/Singleton_pattern

PS: benim kötü PHP için üzgünüm, sözdizimi% 100 doğru olmayabilir, ama kabaca ben OOP açısından ne anlama geldiğini anlamak gerekir.

Singleton tek nesne bir sınıfın örneğinin kısıtlayan bir tasarım deseni olduğu gerçeği, bu biraz daha zor bir statik sınıf ile bazı şeyler yapmak mümkündür:

  • Tembel başlatma
  • Factory alt-classing tarafından dahili uygulama yerine
  • Yapılandırması üzerinden yönetmek

Ancak, tekiz için çeşitli sakıncaları vardır, bu yüzden bu tür ayrışmalar ek avantajlar elde gibi Fabrikası gibi desenleri kullanmak genel olarak daha iyidir.