Bagaimana cara membuat kelas Singleton menggunakan kelas PHP5?
php
oop
design-patterns
singleton
Andrew Moore
sumber
sumber
Jawaban:
Menggunakan:
$fact == $fact2;
Tapi:
Melempar kesalahan
Lihat http://php.net/manual/en/language.variables.scope.php#language.variables.scope.static untuk memahami cakupan variabel statis dan mengapa pengaturan
static $inst = null;
berfungsi.sumber
PHP 5.3 memungkinkan pembuatan kelas Singleton yang dapat diwariskan melalui pengikatan statis akhir:
Ini memecahkan masalah, bahwa sebelum PHP 5.3 setiap kelas yang memperpanjang Singleton akan menghasilkan turunan dari kelas induknya bukan miliknya sendiri.
Sekarang Anda bisa melakukannya:
Dan $ foo akan menjadi turunan dari Foobar bukan turunan dari Singleton.
sumber
"subclass should own its own static var. check this: echo get_class(Foobar::getInstance());echo get_class(Singleton::getInstance());"
.$instance
berada di Singleton, bukan subclass. Setelah beberapa subclass di-instantiated, getInstance () akan mengembalikan instance itu untuk semua subclass.Sayangnya jawaban Inwdr terputus ketika ada beberapa subclass.
Ini adalah kelas dasar Singleton bawaan yang benar.
Kode uji:
sumber
Cara Nyata dan Modern untuk membuat Pola Singleton adalah:
Jadi sekarang Anda bisa menggunakannya seperti.
Seperti yang Anda lihat, realisasi ini jauh lebih fleksibel.
sumber
instance
fungsi$instance
seharusnyanull
tidakfalse
Anda mungkin harus menambahkan metode __clone () pribadi untuk melarang kloning instance.
Jika Anda tidak memasukkan metode ini, berikut ini menjadi mungkin
sekarang
$inst1
! ==$inst2
- mereka bukan contoh yang sama lagi.sumber
menggunakan:
respose:
Jika Anda menggunakan PHP 5.4: trait nya pilihan, sehingga Anda tidak perlu membuang hirarki warisan untuk memiliki pola Singleton
dan perhatikan juga apakah Anda menggunakan ciri atau memperluas kelas Singleton pada akhirnya adalah membuat singleton dari kelas anak jika Anda tidak menambahkan baris kode berikut:
di kelas anak
hasil yang tak terduga adalah:
sumber
Kode ini dapat diterapkan untuk kelas apa pun tanpa peduli dengan nama kelasnya.
sumber
Mendukung Banyak Objek dengan 1 baris per kelas:
Metode ini akan memberlakukan lajang pada setiap kelas yang Anda inginkan, yang harus Anda lakukan adalah menambahkan 1 metode ke kelas yang ingin Anda buat lajang dan ini akan melakukannya untuk Anda.
Ini juga menyimpan objek dalam kelas "SingleTonBase" sehingga Anda dapat men-debug semua objek yang telah Anda gunakan dalam sistem Anda dengan mengulangi
SingleTonBase
objek.Buat file bernama SingletonBase.php dan sertakan di root skrip Anda!
Kodenya adalah
Kemudian untuk kelas mana pun yang Anda ingin membuat singleton cukup tambahkan metode tunggal kecil ini.
Ini adalah contoh kecil:
Dan Anda bisa menambahkan fungsi singleton ini di kelas yang Anda miliki dan itu hanya akan membuat 1 instance per kelas.
CATATAN: Anda harus selalu menjadikan __construct pribadi untuk menghilangkan penggunaan Kelas baru (); Instansiasi.
sumber
sumber
Anda tidak benar-benar perlu menggunakan pola Singleton karena dianggap sebagai antipattern. Pada dasarnya ada banyak alasan untuk tidak menerapkan pola ini sama sekali. Baca ini untuk mulai dengan: Praktik terbaik di kelas PHP tunggal .
Jika bagaimanapun Anda masih berpikir Anda perlu menggunakan pola Singleton maka kita bisa menulis kelas yang memungkinkan kita untuk mendapatkan fungsionalitas Singleton dengan memperluas kelas abstrak SingletonClassVendor kami.
Inilah yang saya datangi untuk menyelesaikan masalah ini.
Gunakan contoh:
Hanya untuk membuktikan bahwa itu berfungsi seperti yang diharapkan:
sumber
Semua kerumitan ini ("keterlambatan pengikatan statis" ... harumph), bagi saya, hanyalah tanda dari objek PHP rusak / model kelas. Jika objek kelas adalah objek kelas satu (lihat Python), maka "$ _instance" akan menjadi instance kelas variabel - anggota objek kelas, yang bertentangan dengan anggota / properti dari instansnya, dan juga sebagai lawan untuk dibagikan oleh keturunannya. Di dunia Smalltalk, ini adalah perbedaan antara "variabel kelas" dan "variabel instance kelas".
Dalam PHP, saya merasa seolah-olah kita perlu memperhatikan pedoman bahwa pola adalah panduan untuk menulis kode - kita mungkin berpikir tentang template Singleton, tetapi mencoba untuk menulis kode yang mewarisi dari kelas "Singleton" yang sebenarnya tampak sesat untuk PHP (meskipun saya kira beberapa jiwa giat dapat membuat kata kunci SVN yang cocok).
Saya akan terus hanya kode setiap singleton secara terpisah, menggunakan templat bersama.
Perhatikan bahwa saya benar-benar keluar dari diskusi lajang-jahat, hidup ini terlalu singkat.
sumber
Saya tahu ini mungkin akan menyebabkan perang api yang tidak perlu, tetapi saya dapat melihat bagaimana Anda mungkin menginginkan lebih dari satu koneksi basis data, jadi saya akan mengakui bahwa singleton mungkin bukan solusi terbaik untuk itu ... namun, ada kegunaan lain dari pola singleton yang menurut saya sangat berguna.
Berikut ini contohnya: Saya memutuskan untuk menggulung MVC dan mesin templating saya sendiri karena saya menginginkan sesuatu yang sangat ringan. Namun, data yang ingin saya tampilkan berisi banyak karakter matematika khusus seperti ≥ dan μ dan apa pun yang Anda miliki ... Data disimpan sebagai karakter UTF-8 yang sebenarnya dalam basis data saya alih-alih pra-HTML-disandikan karena aplikasi saya dapat memberikan format lain seperti PDF dan CSV selain HTML. Tempat yang tepat untuk memformat HTML ada di dalam templat ("view" jika Anda mau) yang bertanggung jawab untuk merender bagian halaman itu (snippet). Saya ingin mengonversikannya ke entitas HTML yang sesuai, tetapi fungsi PHP get_html_translation_table () tidak super cepat. Masuk akal untuk mengambil data satu kali dan menyimpannya sebagai sebuah array, membuatnya tersedia untuk semua orang. Sini' sa sampel saya mengetuk bersama untuk menguji kecepatan. Agaknya, ini akan berhasil terlepas dari apakah metode lain yang Anda gunakan (setelah mendapatkan contoh) statis atau tidak.
Pada dasarnya, saya melihat hasil khas seperti ini:
Jadi, walaupun saya jelas bukan pakar, saya tidak melihat cara yang lebih nyaman dan dapat diandalkan untuk mengurangi overhead panggilan lambat untuk beberapa jenis data, sambil membuatnya super sederhana (satu baris kode untuk melakukan apa yang Anda butuhkan). Diberikan contoh saya hanya memiliki satu metode yang bermanfaat, dan karena itu tidak lebih baik dari fungsi yang didefinisikan secara global, tetapi begitu Anda memiliki dua metode, Anda akan ingin mengelompokkannya bersama, bukan? Apakah saya jauh dari markas?
Juga, saya lebih suka contoh yang benar-benar MELAKUKAN sesuatu, karena kadang-kadang sulit untuk memvisualisasikan ketika contoh menyertakan pernyataan seperti "// lakukan sesuatu yang berguna di sini" yang saya lihat sepanjang waktu ketika mencari tutorial.
Ngomong-ngomong, saya suka umpan balik atau komentar tentang mengapa menggunakan singleton untuk hal semacam ini merugikan (atau terlalu rumit).
sumber
Artikel ini membahas topik cukup luas: http://www.phptherightway.com/pages/Design-Patterns.html#singleton
sumber
Saya telah menulis pemikiran lama untuk dibagikan di sini
sumber
Saya setuju dengan jawaban pertama tetapi saya juga akan menyatakan kelas sebagai final sehingga tidak dapat diperpanjang karena memperluas singleton melanggar pola singleton. Juga variabel instan harus pribadi sehingga tidak dapat diakses secara langsung. Jadikan juga metode __clone pribadi sehingga Anda tidak dapat mengkloning objek singleton.
Di bawah ini adalah beberapa contoh kode.
Contoh Penggunaan
Apa ini menghentikan Anda dari melakukan (yang akan melanggar pola singleton ..
ANDA TIDAK BISA MELAKUKANNYA!
sumber
Ini harus menjadi cara yang benar dari Singleton.
sumber
Saya suka metode @ jose-segura menggunakan ciri-ciri tetapi tidak suka kebutuhan untuk mendefinisikan variabel statis pada sub-kelas. Di bawah ini adalah solusi yang menghindarinya dengan melakukan caching instance dalam variabel lokal statis ke metode pabrik yang diindeks oleh nama kelas:
Penggunaannya sama dengan @ jose-segura hanya tidak perlu untuk variabel statis di sub-kelas.
sumber
Kelas database yang memeriksa jika ada instance database yang ada, ia akan mengembalikan instance sebelumnya.
Ref http://www.phptechi.com/php-singleton-design-patterns-example.html
sumber
Ini adalah contoh dari membuat singleton pada kelas Database
pola desain 1) singleton
maka put put adalah -
gunakan hanya satu instance tidak membuat 3 instance
sumber
Contoh cepat:
Semoga bantuan.
sumber
Inilah contoh saya yang memberikan kemampuan untuk memanggil $ var = new Singleton () dan juga membuat 3 variabel untuk menguji apakah ia menciptakan objek baru:
sumber