Ne yapar yeni self ();

4 Cevap php

Bu gibi bir kod görmedim:

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

O kadar aynı mı new className()?

EDIT

Sınıf inheritant ise, hangi sınıf gösteriyor?

4 Cevap

self yazılı olduğu sınıfa puan.

Yani, getInstance yöntemi bir sınıf adına ise MyClass, aşağıdaki satırı:

self::$_instance = new self();

Olarak aynısını yapacağız:

self::$_instance = new MyClass();



Edit : a couple more informations, after the comments.

Eğer birbirine uzanan iki sınıfları varsa, iki durum vardır:

  • getInstance çocuk sınıfında tanımlanmış
  • getInstance üst sınıfında tanımlanmış

İlk durum, bu gibi bakmak (ben bu örneğin, olmayan tüm gerekli kodu kaldırdık - Eğer tekil davranış almak için geri eklemek gerekir) olurdu *:

class MyParentClass {

}
class MyChildClass extends MyParentClass {
    public static function getInstance() {
        return new self();
    }
}

$a = MyChildClass::getInstance();
var_dump($a);

Burada, alırsınız:

object(MyChildClass)#1 (0) { } 

Hangi self araçları MyChildClass anlamına gelir - bu yazılı olduğu sınıf, yani.


For the second situation, the code would look like this :

class MyParentClass {
    public static function getInstance() {
        return new self();
    }
}
class MyChildClass extends MyParentClass {

}

$a = MyChildClass::getInstance();
var_dump($a);

Ve çıktı bu tür almak istiyorum:

object(MyParentClass)#1 (0) { }

self araçları MyParentClass anlamına gelir - yani burada da, the class in which it is written.




With PHP < 5.3, that "the class in which it is written" is important -- and can sometimes cause problems.

PHP 5.3 static anahtar kelime için yeni bir kullanım sunuyor yüzden: biz self, bu örneklerde kullanılan tam olarak nerede şimdi kullanılabilir:

class MyParentClass {
    public static function getInstance() {
        return new static();
    }
}
class MyChildClass extends MyParentClass {

}

$a = MyChildClass::getInstance();
var_dump($a);

Ancak, static yerine ile self, şimdi alırsınız:

object(MyChildClass)#1 (0) { } 

Bunun anlamı the class that is used yazılı olduğu bir (biz MyChildClass::getInstance() kullanılan), ve değil puan static tür.

Tabii ki, bir davranış self mevcut uygulamaları kırmak değil, bir değişiklik olmamıştır - PHP 5.3 sadece static anahtar geri dönüşüm, yeni bir davranış ekledi.


And, speaking about PHP 5.3, you might want to take a look at the Late Static Bindings page of the PHP manual.

This seems to be an implementation of the Singleton pattern. The function is called statically and checks whether the static class has the variable $_instance set.

Değilse, bir kendisi örneğini (new self()) ve $_instance mağaza başlatır.

Eğer className::getInstance() Eğer tekiz desen nokta her çağrı, one and the same sınıf örneğini alacak ararsanız.

I've never seen it this done this way, though, and honestly didn't know it was possible. What is $_instance declared as in the class?

Varsa bu yüzden büyük olasılıkla örneğinin önlemek amacıyla yapıcı özel olarak tanımlanır, burada singleton tasarım deseni, kullanılan, çift kolon (::) operatörü, sınıf içinde static beyan üyeleri erişebilir static üyeler, bu kullanılamaz sözde değişken $, dolayısıyla kod kullanılan self yerine, Singletons sadece veritabanı bağlayıcı işlemcileri gibi bir nesnenin 1 örneğini sağlayacak iyi bir programlama uygulamaları vardır. Müşteri kodundan, o örneğe erişen bu durumda o, kendi içinde getInstance temelde oluşturmak için new anahtar sözcüğünü kullanarak nesneyi oluşturan işlevi oldu getInstance() adında, tek bir erişim noktası oluşturarak yapılabilir olacaktır yapıcı yöntemini yani bir nesne de denirdi.

çizgi if(!isset(self::instance)) denetler bir nesne zaten yaratılmış olan varsa, kod becuase bu anlayamadık sadece bir parçası olduğunu, bir yerde üst muhtemelen gibi statik üye olmalıdır

private static $_instance = NULL; 

normal sınıflarda biz sadece bu üyeyi erişilen olurdu

$this->_instance = 'something';

ama onun statik ilan etti ve böylece biz $ yerine kullanmak bu kodu kullanabilirsiniz olamazdı

self::$_instance

Bu statik sınıf değişkeni üzerinde saklanan bir nesne var ise kontrol ederek, sınıfı, daha sonra bir tek örneğini oluşturmak için oluşturmak veya karar verebilir, böylece onun set değilse! isset, hiçbir nesneyi yani sonra, statik üye $ _instance üzerinde var Bu komutu tarafından statik üyesi bunu saklanan yeni bir nesne, $_instance üretir

self::$_instance = new self();

ve istemci kodu döndü. İstemci kodu sonra mutlu tek bir erişim noktası, o getInstance() yöntemi de zor olduğunu çağırarak, kamu yöntemleri ile nesne tek bir örneğini kullanabilirsiniz, ancak istemci kodu olabilir, bu olmak zorunda Böyle denir

$thisObject = className::getInstance();

nedeni, kendi içinde fonksiyon statik ilan edilir.

Evet, new className() (bu yöntemi içeren sınıfa atıfta), muhtemelen yapıcı özel bir Singleton deseni kullanılmıştır gibi.