Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mari kita bercakap tentang corak tunggal dalam PHP

Mari kita bercakap tentang corak tunggal dalam PHP

青灯夜游
青灯夜游ke hadapan
2021-07-26 19:05:244108semak imbas

Dalam artikel sebelumnya "Analisis mendalam corak kaedah templat dalam PHP " kami memperkenalkan corak kaedah templat dalam PHP Artikel ini akan membawa anda memahami singleton dalam corak reka bentuk PHP. model.

Mari kita bercakap tentang corak tunggal dalam PHP

Corak tunggal pastinya menduduki tempat pertama antara corak reka bentuk temu duga yang biasa digunakan dan sering ditanya. Di satu pihak, ia cukup mudah dan boleh dijelaskan dalam beberapa perkataan. Sebaliknya, ia cukup kompleks Pelaksanaannya bukan sahaja dalam satu bentuk, tetapi juga perlu mempertimbangkan isu penguncian berbilang benang dalam bahasa tak segerak seperti Java. Jadi semasa temu duga, jangan fikir penemuduga akan berehat apabila dia bertanya soalan tentang model tunggal Model ini benar-benar boleh menjadi mendalam atau cetek, dan ia boleh menggambarkan tahap pembangun. Kerana selagi anda bekerja untuk satu tempoh masa, anda pasti akan bersentuhan dengan model ini.

Rajah dan penjelasan kelas Gof

Definasi GoF: Pastikan kelas hanya mempunyai satu tika dan menyediakan pusat akses global untuk mengaksesnya.

Rajah kelas GoF

Mari kita bercakap tentang corak tunggal dalam PHP

Pelaksanaan kod

class Singleton
{
    private static $uniqueInstance;
    private $singletonData = '单例类内部数据';

    private function __construct()
    {
        // 构造方法私有化,外部不能直接实例化这个类
    }

    public static function GetInstance()
    {
        if (self::$uniqueInstance == null) {
            self::$uniqueInstance = new Singleton();
        }
        return self::$uniqueInstance;
    }

    public function SingletonOperation(){
        $this->singletonData = '修改单例类内部数据';
    }

    public function GetSigletonData()
    {
        return $this->singletonData;
    }

}

Ya, intinya ialah kelas tunggal, tiada yang lain. Biarkan pembolehubah statik menyimpan dirinya selepas instantiasi. Apabila objek ini diperlukan, panggil kaedah GetInstance() untuk mendapatkan objek unik secara global.

$singletonA = Singleton::GetInstance();
echo $singletonA->GetSigletonData(), PHP_EOL;

$singletonB = Singleton::GetInstance();

if ($singletonA === $singletonB) {
    echo '相同的对象', PHP_EOL;
}
$singletonA->SingletonOperation(); // 这里修改的是A
echo $singletonB->GetSigletonData(), PHP_EOL;

panggilan pelanggan, kami akan mendapati bahawa Mari kita bercakap tentang corak tunggal dalam PHPsingletonB ialah objek yang sama.

  • Ya, seperti yang anda boleh lihat daripada kod, penggunaan terbesar singleton adalah untuk menjadikan objek kami unik di peringkat global.
  • Jadi apakah faedah keunikan global? Penciptaan beberapa kelas adalah sangat mahal, dan kita tidak perlu menggunakan objek baru setiap kali Mereka boleh digunakan semula sebagai satu objek. Mereka tidak mempunyai sifat atau status yang perlu diubah, tetapi hanya menyediakan beberapa perkhidmatan awam. Contohnya, kelas operasi pangkalan data, kelas permintaan rangkaian, kelas operasi log, perkhidmatan pengurusan konfigurasi, dll.
  • Seorang penemuduga pernah bertanya, adakah singleton satu-satunya dalam PHP? Jika di bawah satu proses iaitu di bawah satu fpm, sudah tentu ia unik. Itu bukan satu-satunya di antara berbilang fpm yang nginx ditarik secara serentak. Satu proses setiap proses!
  • Kelebihan corak tunggal: akses terkawal kepada ruang nama yang disempitkan;
  • Laravel menggunakan mod tunggal dalam bahagian bekas IoC. Kami akan menerangkan kandungan bahagian kontena dalam siri artikel akan datang tentang Laravel. Kita boleh mencari kaedah tunggal dalam kelas IlluminateContainerContainer. Ia memanggil kaedah getClosure dalam kaedah bind. Jika anda terus menjejaki, anda akan mendapati bahawa mereka akhirnya akan memanggil kaedah buat atau binaan Kontena untuk membuat instantiat kelas Tanpa mengira kaedah buat atau binaan, mereka akan mempunyai pertimbangan tunggal, iaitu, untuk menilai sama ada kelas telah digunakan atau sudah wujud dalam bekas . jika (!$reflector->isInstantiable()) dalam binaan.

Syarikat ini semakin lama semakin besar, tetapi kami hanya mempunyai satu salinan (kelas tunggal) daripada semua senarai senarai syarikat, yang disimpan dalam sistem OA kami. Apa yang saya takut, kekeliruan akan timbul selepas setiap jabatan mempunyai jadual masing-masing Contohnya, jika kemas kini tidak menepati masa, pekerja yang baru menyertai atau meletakkan jawatan dari jabatan lain akan terlepas. Jabatan lain boleh melihat keseluruhan jadual apabila diperlukan, atau mereka boleh membuat dan mengubah suai bahagian jabatan mereka sendiri berdasarkan keseluruhan senarai. Tetapi dalam sistem OA, apa yang sebenarnya mereka ubah suai ialah kandungan senarai umum Apa yang semua orang kekalkan sebenarnya adalah satu-satunya senarai sebenar yang disimpan dalam pelayan sistem OA

Kod penuh: https: //github.com/zhangyue0503/designpatterns-php/blob/master/21.singleton/source/singleton.php

Contoh

Sejak itu disebutkan di atas bahawa kedua-dua kelas operasi pangkalan data dan kelas permintaan rangkaian suka menggunakan mod tunggal, maka kami akan melaksanakan pembangunan mod tunggal untuk kelas permintaan Http. Saya masih ingat bahawa semasa saya bekerja pada Android suatu masa dahulu, tidak terdapat banyak rangka kerja seperti yang terdapat sekarang.

Cache gambarajah kelas

Mari kita bercakap tentang corak tunggal dalam PHP

Kod sumber penuh: https://github.com / zhangyue0503/designpatterns-php/blob/master/21.singleton/source/singleton-http.php

<?php 

class HttpService{
    private static $instance;

    public function GetInstance(){
        if(self::$instance == NULL){
            self::$instance = new HttpService();
        }
        return self::$instance;
    }

    public function Post(){
        echo &#39;发送Post请求&#39;, PHP_EOL;
    }

    public function Get(){
        echo &#39;发送Get请求&#39;, PHP_EOL;
    }
}

$httpA = new HttpService();
$httpA->Post();
$httpA->Get();

$httpB = new HttpService();
$httpB->Post();
$httpB->Get();

var_dump($httpA == $httpB);

Penerangan

  • Adakah ia masih sangat mudah? Saya tidak akan bercakap lebih lanjut tentang bentuk singleton ini di sini Mari kita bercakap tentang beberapa bentuk singleton lain
  • Dalam bahasa statik seperti Java. , pembolehubah statik boleh menjadi objek baharu secara langsung, dalam perisytiharan Mari kita bercakap tentang corak tunggal dalam PHP

    contoh = new HttpService();. Dengan cara ini, kaedah GetInstance() boleh diabaikan, tetapi pembolehubah statik ini akan diinstantiate terus dan menduduki memori tanpa mengira sama ada ia digunakan atau tidak. Singleton jenis ini dipanggil corak singleton Cina yang lapar.

  • Kod dan contoh kami jelas sekali bukan gaya Hungry Man, borang ini dipanggil gaya Lazy Man. Anda perlu menggunakan GetInstance() secara aktif untuk mendapatkannya, dan kemudian saya akan mencipta objek tersebut.
  • Dalam aplikasi berbilang benang, seperti Java multi-threading atau menggunakan swoole dalam PHP, masalah penciptaan berulang akan berlaku dan objek yang dibuat beberapa kali bukanlah objek yang sama. Pada masa ini, pengesanan berganda biasanya digunakan untuk memastikan bahawa terdapat hanya satu objek global. Anda boleh mencari sendiri kod tertentu. Tidak akan ada masalah dengan gaya Han Lapar itu sendiri telah menetapkan nilai kepada atribut statik dan tidak akan berubah lagi.
  • Cara lain ialah mencipta kelas dalaman statik. Ini jarang dilihat, dan kadar penggunaan sumbernya adalah tinggi. Letakkan pembolehubah statik di dalam kaedah supaya pembolehubah statik menjadi pembolehubah dalam kaedah dan bukannya pembolehubah dalam kelas. Ia membenarkan objek tunggal memanggil kaedah dan sifat statiknya sendiri.

Alamat asal: https://juejin.cn/post/6844903990585458702

Pengarang: Pengurus Projek Tegar

Pembelajaran yang disyorkan: " Tutorial Video PHP"

Atas ialah kandungan terperinci Mari kita bercakap tentang corak tunggal dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:juejin.cn. Jika ada pelanggaran, sila hubungi admin@php.cn Padam