Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erklärung des PHP-Singleton-Modus

Detaillierte Erklärung des PHP-Singleton-Modus

小云云
小云云Original
2018-03-21 11:45:151676Durchsuche

Tatsächlich bedeutet das Singleton-Modell, um es ganz klar auszudrücken, dass eine Klasse nur einmal instanziiert werden kann. Aber wie machen wir so viel Aufhebens um diese Instanziierung? Tatsächlich ist die magische Methode __construct() ein Durchbruch. Diese Methode bedeutet, dass diese Methode automatisch ausgeführt wird, wenn die Klasse instanziiert wird. Welchen Effekt hat es dann, wenn ich diese Methode geschützt oder privat mache?


<?php
class test{

	protected function __construct(){

	}
}

$test = new test();
?>

Führen Sie dann Folgendes aus, und diese Situation wird eintreten.

&lt;img data-rawheight="125" data-rawwidth="994"https://img.php.cn/upload/article/000/054 /025/a79c550120d3e119df603c5755b0f293-0.jpg" class="origin_image zh-lightbox-thumb" width="994" src=" e0d3_r.jpg"&gt ; In diesem Fall kann es nicht instanziiert werden. Dadurch wird sichergestellt, dass es nicht von jemand anderem instanziiert werden kann.
Aber wie sollten wir in diesem Fall die Instanziierung implementieren? Das ist es:


<?phpclass test{

	protected function __construct(){

	}

	public static function getInstance(){
		$_test = new test();
		return $_test;
	}}$test = test::getInstance();var_dump($test);?>

Das ist es. Es erscheint ein Beispiel. Werfen wir einen Blick darauf:
&lt;img data-rawheight="50" data-rawwidth="152"https://img.php.cn/upload/article/000 / 054/025/a79c550120d3e119df603c5755b0f293-1.jpg" class="content_image" width="152&gt;Aber nachdem ich so viel gesagt habe, bin ich immer noch nicht zum Punkt gekommen. Hier kommt der entscheidende Punkt, solange wir ein anderes Schlüsselwort (statisch) verwenden. Verdammt, verdammt, verdammt:


<?php
class test{

	protected function __construct(){

	}

	public static function getInstance(){
		static $_test;
		if (empty($_test)) {
			$_test = new test();
		}
		return $_test;
	}
}

$test1 = test::getInstance();
$test2 = test::getInstance();
$test3 = test::getInstance();

var_dump($test1,$test2,$test3);
echo $test1 == $test2 ? &#39;true&#39; : &#39;false&#39;;
echo "<br>";
echo $test2 == $test3 ? &#39;true&#39; : &#39;false&#39;;
echo "<br>";
echo $test1 == $test3 ? &#39;true&#39; : &#39;false&#39;;
?>

Sehen Sie sich das Ergebnis an:
&lt;img data-rawheight="160" - rawwidth="133" src="https://img.php.cn/upload/article/000/054/025/a79c550120d3e119df603c5755b0f293-2.jpg" ; amp;gt;Auf diese Weise kann der Effekt eines PHP-Singletons erzielt werden.
Für Singletons ist es am besten, nur diese eine Klasse anstelle mehrerer Klassen zu verwenden.
Zum Beispiel. Beispielsweise gibt es eine Konfigurationsklasse, in der hauptsächlich die Konfigurationsinformationen dieses Projekts gespeichert werden. Wenn diese Klasse mehrmals instanziiert werden kann, woher wissen Sie dann, in welcher Konfigurationsklasse die Änderung vorgenommen wurde, wenn die Konfiguration während der Ausführung des Codes geändert wird? Zu diesem Zeitpunkt wird die Verwendung des Singleton-Modus diese Situation vermeiden. Alle Änderungen an der Konfigurationsdatei werden basierend auf der Instanz dieser Klasse geändert. Aufgrund der Instanziierung mehrerer Klassen kommt es nicht vor, dass die Operation bei Änderungen in der Operation nicht in Echtzeit aktualisiert wird. Darüber hinaus nimmt die Instanziierung mehrerer Klassenbibliotheken viel Speicher in Anspruch, sodass sie nur einmal instanziiert werden. Gibt es nicht viele Vorteile?

Weitere Erkenntnisse:

Auch den Klon privatisieren

class test{
private static $instance;
private function __construct(){
}
private function __clone(){
}
public static function getInstance(){
if (! self::$instance instanceof self ) {
self::$instance = new self();
}
return self::$instance;
}
}

Eine intuitivere Methode:

Klicken Sie hier, um den Link zu öffnen


/*
单例设计模式 (单态)
    定义: 一个类 只能允许有 一个对象存在.
    1.不让进: 使类不能被实例化
    2.留后门: 设置静态方法
    3.给对象: 在静态方法里实例化该类
    4.判初夜: 判断是否是 第一次产生该类的对象
    5.设静态: 静态方法里 要使用静态属性
 */

/*//1.不让进: 使类不能被实例化-----------------
class Test
{
    // 设置 一个封装的构造方法
    private function __construct()
    {
        //占位, 我就是不让你NEW我~~~
    }
}*/

/*//2.留后门: 设置静态方法--------------------
class Test
{
    // 设置 一个封装的构造方法
    private function __construct()
    {
        //占位, 我就是不让你NEW我~~~
    }
    //后门
    public static function getObject()
    {
        echo "啊,我是后门,进吧!<br>";
    }
}*/

/*//3.给对象: 在静态方法里实例化该类------------------
class Test
{
    // 设置 一个封装的构造方法
    private function __construct()
    {
        //占位, 我就是不让你NEW我~~~
    }
    //后门
    public static function getObject()
    {
        echo "啊,我是后门,进吧!<br>";
        return new self();//实例化一个对象给你
    }
}*/

/*//4.判初夜: 判断是否是 第一次产生该类的对象------------------
class Test
{
    private $obj = null;//属性值为对象,默认为null
    // 设置 一个封装的构造方法
    private function __construct()
    {
        //占位, 我就是不让你NEW我~~~
    }
    //后门
    public static function getObject()
    {
        echo "啊,我是后门,进吧!<br>";
        if ($this->obj === null) {
            $this->obj = new self();//实例化一个对象
        }
        //返回的属性 其实就是本对象
        return $this->obj;
    }
}*/

//5.设静态: 静态方法里 要使用静态属性------------------
class Test
{
    private static $obj = null;//属性值为对象,默认为null
    // 设置 一个封装的构造方法
    private function __construct()
    {
        //占位, 我就是不让你NEW我~~~
    }
    //后门
    public static function getObject()
    {
        echo "啊,我是后门,进吧!<br>";
        if (self::$obj === null) {
            self::$obj = new self();//实例化一个对象
        }
        //返回的属性 其实就是本对象
        return self::$obj;
    }
}

/*Test::getObject();//使用静态方法访问该类里的方法
exit;*/

$t1 = Test::getObject();
$t2 = Test::getObject();
$t3 = Test::getObject();
$t4 = Test::getObject();
$t5 = Test::getObject();
$t6 = Test::getObject();
$t7 = Test::getObject();
$t8 = Test::getObject();

//判断 两个对象 是否是同一个对象
if ($t1 === $t6) {
    echo "哦, Yes! 是同一个实例<br>";
} else {
    echo "哦, No! 不是同一个实例<br>";
}

Verwandte Empfehlungen:

Analyse der Vorteile des PHP-Singleton-Modus

PHP-Singleton Detaillierte Erläuterung der Beispielmodus-Demo

Mitteilung der einfachen Verwendung des PHP-Singleton-Modus

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung des PHP-Singleton-Modus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn