Saya belum pernah melihat kode seperti ini:
public static function getInstance()
{
if ( ! isset(self::$_instance)) {
self::$_instance = new self();
}
return self::$_instance;
}
Apakah itu sama dengan new className()
?
EDIT
Jika kelas tersebut diturunkan, kelas mana yang ditunjuknya?
Jawaban:
self
menunjuk ke kelas di mana itu ditulis.Jadi, jika metode getInstance Anda ada dalam nama kelas
MyClass
, baris berikut:Akan melakukan hal yang sama seperti:
Edit: beberapa informasi lagi, setelah komentar.
Jika Anda memiliki dua kelas yang saling memperluas, Anda memiliki dua situasi:
getInstance
didefinisikan di kelas anakgetInstance
didefinisikan di kelas indukSituasi pertama akan terlihat seperti ini (saya telah menghapus semua kode yang tidak diperlukan, untuk contoh ini - Anda harus menambahkannya kembali untuk mendapatkan perilaku tunggal) *:
Di sini, Anda akan mendapatkan:
Yang artinya
self
berartiMyChildClass
- yaitu kelas di mana itu ditulis.Untuk situasi kedua, kodenya akan terlihat seperti ini:
Dan Anda akan mendapatkan hasil seperti ini:
Yang berarti
self
berartiMyParentClass
- yaitu sini juga, kelas di mana ada tertulis .Dengan PHP <5.3, "kelas tempat ia ditulis" itu penting - dan terkadang dapat menyebabkan masalah.
Itulah mengapa PHP 5.3 memperkenalkan penggunaan baru untuk
static
kata kunci: sekarang dapat digunakan tepat di tempat yang kita gunakanself
dalam contoh tersebut:Namun, dengan
static
alih - alihself
, Anda sekarang akan mendapatkan:Yang berarti
static
poin semacam itu ke kelas yang digunakan (yang kami gunakanMyChildClass::getInstance()
), dan bukan yang tertulis.Tentu saja, perilaku
self
belum diubah, untuk tidak merusak aplikasi yang ada - PHP 5.3 baru saja menambahkan perilaku baru, mendaur ulangstatic
kata kunci.Dan, berbicara tentang PHP 5.3, Anda mungkin ingin melihat halaman Binding Statis Akhir dari manual PHP.
sumber
baseclass
,class
yang satu tidak menunjuk ke?self
dan warisan; dan saya juga menyertakan beberapa informasi tentangstatic
di PHP 5.3 ;; harap ini membantu :-)Ini tampaknya merupakan implementasi dari pola Singleton . Fungsi ini dipanggil secara statis dan memeriksa apakah kelas statis memiliki
$_instance
set variabel .Jika tidak, itu menginisialisasi sebuah instance dari dirinya sendiri (
new self()
) dan menyimpannya di$_instance
.Jika Anda menelepon,
className::getInstance()
Anda akan mendapatkan satu dan instance kelas yang sama pada setiap panggilan, yang merupakan titik pola singleton.Saya belum pernah melihat ini dilakukan dengan cara ini, dan sejujurnya tidak tahu itu mungkin. Apa yang
$_instance
dideklarasikan di kelas?sumber
$_instance
dideklarasikan sebagaipublic static $_instance;
Ini kemungkinan besar digunakan dalam pola desain tunggal, di mana konstruktor didefinisikan sebagai privat untuk menghindari pembuatan instance,
(::)
operator titik dua ganda dapat mengakses anggota yang dinyatakan statis di dalam kelas, jadi jika ada anggota statis, variabel pseudo $ ini tidak dapat digunakan, oleh karena itu kodenya digunakan sendiri, Singletons adalah praktik pemrograman yang baik yang hanya akan mengizinkan 1 instance objek seperti penangan konektor database. Dari kode klien, mengakses instance itu akan dilakukan dengan membuat satu titik akses, dalam hal ini dia menamakannyagetInstance()
, getInstance itu sendiri adalah fungsi yang membuat objek pada dasarnya menggunakan kata kunci baru untuk membuat objek yang berarti metode konstruktor itu disebut juga.baris ini
if(!isset(self::instance))
memeriksa apakah suatu objek telah dibuat, Anda tidak dapat memahami ini karena kodenya hanyalah sebuah fragmen, di suatu tempat di atas, harus ada anggota statis seperti mungkindi kelas normal kami akan mengakses anggota ini dengan mudah
tetapi ini dinyatakan statis sehingga kami tidak dapat menggunakan $ kode ini yang kami gunakan sebagai gantinya
dengan memeriksa apakah ada objek yang disimpan pada variabel kelas statis ini, kelas kemudian dapat memutuskan untuk membuat atau tidak membuat satu instance, jadi jika tidak disetel,! isset, artinya tidak ada objek pada anggota statis $ _instance, maka itu menghasilkan objek baru, menyimpannya di anggota statis
$_instance
dengan perintahdan mengembalikannya ke kode klien. Kode klien kemudian dapat dengan senang hati menggunakan contoh tunggal objek dengan metode publiknya, tetapi dalam kode klien, memanggil titik akses tunggal, yaitu,
getInstance()
metode ini juga rumit, harus dipanggil seperti iniPasalnya, fungsi itu sendiri dinyatakan statis.
sumber
Ya, ini seperti
new className()
(mengacu pada kelas yang berisi metode itu), mungkin digunakan dalam pola Singleton di mana konstruktornya bersifat pribadi.sumber
Jika kelas diwarisi maka memanggil getInstance () dari anak tidak akan memberi Anda instance anak. Ini hanya akan mengembalikan instance dari instance induk. Ini karena kita menyebut diri baru ().
Jika Anda ingin agar kelas anak akan mengembalikan turunan dari kelas anak kemudian gunakan static () baru di getInstance () dan kemudian akan mengembalikan contoh kelas anak. Ini disebut pengikatan terlambat !!
sumber