ホームページ  >  記事  >  バックエンド開発  >  PHPでシングルトンモードを実装する方法

PHPでシングルトンモードを実装する方法

coldplay.xixi
coldplay.xixiオリジナル
2020-08-06 14:07:362394ブラウズ

シングルトン モードを実装する

php メソッド: まず、このクラスのオブジェクトを保存する静的プライベート変数を作成します。次に、オブジェクトを直接作成するために new を使用しないようにします。次に、オブジェクトのクローンを作成するために clone を使用しないようにします。最終的に [$instance] がシングルトン オブジェクトであるかどうかを判断し、そうでない場合は作成するだけです。

PHPでシングルトンモードを実装する方法

シングルトン モードを実装するための php メソッド:

シングルトン モードの定義: クラスのインスタンスが 1 つだけであることを確認します。 、それにグローバル アクセス ポイントを提供します。

PHP はシングルトン モードを実装します:

class Singleton
{
    //创建静态私有的变量保存该类对象
    static private $instance;
    //防止使用new直接创建对象
    private function __construct(){}
    //防止使用clone克隆对象
    private function __clone(){}
    static public function getInstance()
    {
        //判断$instance是否是Singleton的对象,不是则创建
        if (!self::$instance instanceof self) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    public function test()
    {
        echo "我是一个单例模式";
    }
}
$sing = Singleton::getInstance();
$sing->test();
$sing2 = new Singleton(); //Fatal error: Uncaught Error: Call to private Singleton::__construct() from invalid context in
$sing3 = clone $sing; //Fatal error: Uncaught Error: Call to private Singleton::__clone() from context

PHP がシングルトン モードを実装することの重要性は何ですか:

意味がありません。PHP にはスレッドの概念がありません。コードはメモリ内に常駐せず、すべての変更を自分で制御できます。クラスのインスタンスが 1 つだけであることを保証する必要はありません。何がポイントですか?データベース接続クラスでシングルトン モードを使用する必要があります。一部のページが 2 つのデータベースに接続する必要がある場合はどうすればよいでしょうか?

本当に無意味なのでしょうか? ######もちろん違います。

コードを見てください:

class A
{
    public function show()
    {
        echo "我是A类函数,要调用B类函数和C类函数<br/>";
        $b = new B();
        $b->show();
        $c = new C();
        $c->show(&#39;A&#39;);
    }
}
class B
{
    public function show()
    {
        echo "我是B类函数,要调用C类函数<br/>";
        $c = new C();
        $c->show(&#39;B&#39;);
    }
}
class C
{
    public function show($parm)
    {
        echo "我是C类函数,现在被{$parm}类函数调用<br/>";
    }
}
$a = new A();
$a->show();

ここでの呼び出し中に、2 つのクラス C オブジェクトが作成されます。new は非常にリソースを消費する操作であることがわかります。ここでのクラス C が単一の In である場合、サンプル モードでは、new 1 回だけで十分です。このアイデアは問題ありませんが、通常は別のメソッドを使用してそれを実行します:

class A
{
    public function show()
    {
        echo "我是A类函数,要调用B类函数和C类函数<br/>";
        $b = Unit::getInstance(&#39;B&#39;);
        $b->show();
        $c = Unit::getInstance(&#39;C&#39;);
        $c->show(&#39;A&#39;);
    }
}
class B
{
    public function show()
    {
        echo "我是B类函数,要调用C类函数<br/>";
        $c = Unit::getInstance(&#39;C&#39;);
        $c->show(&#39;B&#39;);
    }
}
class C
{
    public function __construct()
    {
        echo "C类对象被创建<br/>";
    }
    public function show($parm)
    {
        echo "我是C类函数,现在被{$parm}类函数调用<br/>";
    }
}
class Unit
{
    static public function getInstance($class)
    {
        static $arr = null;
        if (!isset($arr[$class]) || !$arr[$class] instanceof $class) {
            $arr[$class] = new $class();
        }
        return $arr[$class];
    }
}
$a = new A();
$a->show();

コードを実行すると、C クラスが 1 回だけインスタンス化され、その後インスタンス化されることがわかります。実際、動作中は通常、静的変数を使用してオブジェクトを保存し、シングルトン モードを偽装して実装します。

シングルトン モードと静的変数を使用してシングルトンを実装する場合の違い:

シングルトン モードでは、クラスに 1 つのオブジェクトのみの作成が強制されます。安全なインターフェースまたは統一されたインターフェースで表示されることもあります。静的変数のシングルトンを実装する目的は、主に新しい操作を減らすことですが、新しい操作やクローン操作を妨げるものではありません。

関連する学習に関する推奨事項:
php プログラミング

(ビデオ)

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

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