ホームページ  >  記事  >  バックエンド開発  >  PHPシングルトンモードの詳しい説明

PHPシングルトンモードの詳しい説明

小云云
小云云オリジナル
2018-03-21 11:45:151658ブラウズ

実際、シングルトン モードは、率直に言うと、クラスを 1 回だけインスタンス化できることを意味します。しかし、このインスタンス化についてどうやって大騒ぎするのでしょうか?実際、画期的な方法は魔法のメソッド __construct() です。このメソッドは、クラスがインスタンス化されると、このメソッドが自動的に実行されることを意味します。では、このメソッドを保護または非公開にすると、どのような影響があるでしょうか?


<?php
class test{

	protected function __construct(){

	}
}

$test = new test();
?>

次に以下を実行するとこの状況が発生します。

&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="https://pic4.zhimg.com/3a977167d4bb4083db5218628d34e0d3_r.jpg"&gt; , インスタンス化することはできません。これにより、誰でもインスタンス化できないことが保証されます。
しかし、この場合、インスタンス化をどのように実装すればよいでしょうか?以上です:


<?phpclass test{

	protected function __construct(){

	}

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

のような言葉。例が表示されます。見てみましょう:
&lt;img data-rawheight="50" data-rawwidth="152" src="https://img.php.cn/upload/article/000/054 / 025/a79c550120d3e119df603c5755b0f293-1.jpg" class="content_image" width="152"&gt;しかし、ここまで言ってもまだ本題には入っていません。別のキーワード (静的) を使用する場合、ここが重要なポイントになります。ダン ダン ダン ダン:


<?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;;
?>

結果を見てください:
&lt;img data-rawheight="160" data-rawwidth="133" https://imgこのようにして、php シングルトンの効果は次のとおりです。達成されます。 シングルトンの場合、複数のクラスではなく、この 1 つのクラスのみを使用するのが最善です。
例え話をしてみましょう。たとえば、主にこのプロジェクトの構成情報を格納する config クラスがあります。このクラスが複数回インスタンス化できる場合、コードの実行中に構成が変更された場合、変更がどの構成クラスで行われたかをどのようにして知ることができますか。現時点では、シングルトン モードを使用すると、構成ファイルへのすべての変更がこのクラスのインスタンスに基づいて変更されます。複数のクラスのインスタンス化が原因で、操作の変更に対して操作がリアルタイムで更新されないように見えます。さらに、複数のクラス ライブラリをインスタンス化すると大量のメモリが消費されるため、インスタンス化されるのは 1 回だけです。メリットがたくさんあるんじゃないでしょうか?

その他の洞察:

クローンも非公開にする

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;
}
}

より直感的な方法:

クリックしてリンクを開きます



/*
单例设计模式 (单态)
    定义: 一个类 只能允许有 一个对象存在.
    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>";
}

関連する推奨事項:


PHP シングルトン モードの利点の分析

PHPシングルトンモードのデモの詳細説明

PHPシングルトンモードの簡単な使い方を共有

以上がPHPシングルトンモードの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。