PHP5 sınıfta, ne zaman özel bir yapıcı denir olsun demek?

5 Cevap php

Diyelim ki bir tek olması gerekiyordu bir PHP (> = 5.0) sınıfı yazıyorum diyelim. Ben okudum dokümanlar tüm sınıf doğrudan örneği olamaz böylece sınıf yapıcısı özel yapmak için söylüyorlar.

Yani böyle bir şey varsa:

class SillyDB
{
  private function __construct()
  {

  }

  public static function getConnection()
  {

  }
}

Ben yapıyorum __ construct () dışında denir herhangi bir durum vardır

new SillyDB()

sınıfının kendi içinde arama?

Ve neden hiç kendi içinde gelen SillyDB örneğini izin ediyorum?

5 Cevap

Eğer özel bir kurucu içeren sınıf için bir yöntem içinde denilen eğer __construct() sadece adı olacaktır. Lütfen Singleton Yani, şöyle bir yöntem olabilir:

class DBConnection
{
   private static $Connection = null;

   public static function getConnection()
   {
      if(!isset(DBConnection::Connection))
      {
         DBConnection::Connection = new DBConnection();
      }
      return DBConnection::Connection;
   }

   private function __construct()
   {

   }
}

$dbConnection = DBConnection::getConnection();

Eğer / kendi içinde sınıf örneğini isterim edebiliyoruz nedeni yalnızca bir örnek herhangi bir zamanda var olduğundan emin olmak için kontrol edebilirsiniz yani. Bu, tüm sonra, bir Singleton tüm noktasıdır. Bir veritabanı bağlantısı için bir Singleton kullanarak uygulama bir anda DB bağlantıları bir ton yapmıyor olmasını sağlar.

Burada sadece bir tarih / zaman dize oluşturur çok basit bir tekil bulunuyor:

class TheDate
{
    private static $DateInstance = null;
    private $dateVal;

    public static function getDateInstance()
    {
        if(!isset(TheDate::$DateInstance))
        {
            TheDate::$DateInstance = new TheDate();
        }

        return TheDate::$DateInstance;
    }

    public static function getDateVal()
    {
        return TheDate::$DateInstance->dateVal;
    }

    private function __construct()
    {
        $this->dateVal = strftime("%Y-%m-%d %H:%M:%S");
    }
}

Böyle bir şey yaptığını açıkçası bana ve üzerinde aynı tarihini verir:

$date1 = TheDate::getDateInstance();
echo $date1->getDateVal() . "<br />";

$date2 = TheDate::getDateInstance();
echo $date2->getDateVal() . "<br />";

Ve bunu yaparken herhangi bir hata oluşturmaz:

class NewDate extends TheDate
{
    public function __construct()
    {

    }
}

Tamam, benim kendi bazı testler yaptım.

  • Eğer sınıfta kendi kurucu beyan yoksa bu üst sınıf kurucusunu çağırmak için çalışır, çünkü, bunu oluşturmaya çalışırken, ölümcül bir hata atmak olacaktır.
  • Eğer muhtemelen bir mysqli örneği veya mysql_connect() fonksiyonu (ya da diğer bazı RDBMS'e diğer bazı bağlantı) tarafından döndürülen kaynak (neyse, PHP) iade ederken DB bağlantı durumunda, sürece Eğer örneği özel olarak işaretleyip, birileri onu sınıflara ve bağlantı ile müdahale tehdidi yok.
  • Daha önce değindiğim gibi, birileri gerçekten davranışı geçersiz kılmak ve birden fazla bağlantı yapmak istiyorsa, onlar gibi iyi bir yeni bir sınıf yazarak bunu yapabilirdi.

Kodunu, Mark sınamak, ve bana ne öğrenmek ne bildirin.

EDIT: Ayrıca, bu özel durumda, ben subclassing bir kişiyi önlenmesi ile ilgili olması gerekir neden emin değilim. Birisi alt sınıf için PHP kodu erişimi varsa, o zaman onlar da bunu kopyalamak için kod erişim ve onlar (ne sebeple olursa olsun) uygun bulmak şeye erişim düzenleyiciler değiştirin.

Bu durumda Singleton pratik faydası da kullanarak, size her zaman belirli bir HTTP isteği için aynı veritabanı bağlantısını kullanarak emin olabiliriz olmasıdır. O gerçekleştirir. Diğer şeyler (final ve özel Kurucular kullanarak) bir teori perspektifinden bilmek yararlıdır, ve hatta daha kullanışlı diğer programcılar için API kaliteli kodu dağıtmak istiyorsanız, biliyorum, ama bu durumda da Özellikle örnek, tüm anahtar kelimeleri yapıyoruz sınıf dosyanın boyutu bayt ekliyor.

Biraz sirke çekme: bütünlüğü için, ederim muhtemelen declare the class as final de birinin bu sınıf sınıflara ve kendi public kurucu uygulama istemem beri.

(Derleyici özel bir kurucu geçersiz kılma yakalarsa beni affedin, ama ben öyle düşünmüyorum)