ホームページ  >  記事  >  バックエンド開発  >  PHP のシングルトン モードと静的変数について話しましょう

PHP のシングルトン モードと静的変数について話しましょう

青灯夜游
青灯夜游転載
2020-07-24 17:06:352732ブラウズ

PHP のシングルトン モードと静的変数について話しましょう

PHP には、一般的な意味での静的変数はありません。 JavaやCとは異なり、PHPにおける静的変数の生存期間は各PHPのセッション期間のみなので、JavaやCのような静的変数は存在しない運命です。

PHP の静的変数

PHP では、静的変数の意味は特定の構造 (メソッドまたはクラス)、そのスコープ内でのみ存在します。はこのファイル内にあります。

function test(){
    static $var = 1; 
    echo $var++.'';
}
test();
test();
test();
//OutPut
//1
//2
//3

関数 test の 3 回の呼び出しでは、変数 $var が 3 回の呼び出しに存在し、クリアまたはリセットされることなく、毎回 1 ずつ増分されます。
したがって、静的な結論を導き出すことができます。変数は、現在の構造のライフサイクルに常に存在します。現在の例では、テスト関数のライフサイクルは現在の PHP スクリプトであり、プログラムがリリースされない限り有効です。

静的変数はクラスにあります

そしてクラスでは、コードはおそらく次のようになります

class A
{
    private static $a = 1; 
    private $b = 2;
    public function add()
    {
        echo self::$a++.'';
        echo $this->b++.'';
    }
}
$class1 = new A();
$class1->add();
$class1->add();
$class2 = new A();
$class2->add();
$class2->add();
//Output
//1
//2
//2
//3
//3
//2
//4
//3

から上記のクラスの実行結果から判断すると、関数でも同じ結果が得られました。

つまり、要約すると、

PHP の静的変数は、対応する構造体のライフサイクル内にあります。永続的に存在し、構造体が何度呼び出されたりインスタンス化されたりしても、値は一貫したままです。

実際には、これが動的変数と静的変数の違いです。詳細については、この記事を参照してください。動的変数はクラス内でのみ有効ですが、静的変数は現在の PHP スクリプト内で有効です。

静的変数はシングルトン モードです

シングルトン モードをもう一度見てください

class A
{
    private static $instance = null;
    private $b = 1;
    public static function get_instance()
    {
        if(self::$instance == null){
            $classname = __CLASS__;
            self::$instance = new $classname(); 
        }
        return self::$instance;
    }
    public function add()
    {
        $this->b++;
    }
    public function show()
    {
        echo $this->b;
    }
}
$a = A::get_instance();
$b = A::get_instance();
//此处$a和$b变量完全相同!
$a->add();
$a->show();
echo '';
$b->show();
//output
//2
//2

現時点では、 singleton サンプル モードが存在し、$a と $b をまったく同じオブジェクトにするため、それらの間でデータを共有する必要がある場合、静的変数は必要ありません (ナンセンスです。自分自身だけです。いつでもこれしか存在しないからです)アプリケーション内のクラス。インスタンスが存在します。シングルトンを何度呼び出しても、内部のデータは再インスタンス化されません。)

したがって、シングルトン モードでは、静的変数はまったく意味を持ちません。 。もちろん、何もすることがなく、新しいメソッドを使用してオブジェクトを初期化することに固執する場合は問題ありませんが、この時点でシングルトン モードは壊れて、シングルトン モードのない状態に戻ります。

オブジェクトのインスタンス化に new を使用したくない場合は、クラスの __construct 関数をプライベート属性として設定することを検討できます。

class A
{
    private static $instance = null;
    private $b = 1;
    private function __construct()
    {
    //Code in this function
    //could not be get out of the class
    }
    public static function get_instance()
    {
        if(self::$instance == null){
            $classname = __CLASS__;
            self::$instance = new $classname();
        }
        return self::$instance;
    }
    public function add()
    {
        $this->b++;
    }
    public function show()
    {
        echo $this->b;
    }
}
$a = A::get_instance();
$b = A::get_instance();
//此处$a和$b 变量完全相同!
$a->add();
$a->show();
echo '
';
$b->show();
//output
//2
//2
  
//如果尝试用new来实例化的话
$c = new A();
//output
//Fatal error: Call to private A::__construct() from invalid context in
//如果需要A类的实例化对象,只能通过开放的get_instance静态方法进行初始化

利点: シングルトン モードでは、大量の new を回避できます。新しい操作はそれぞれメモリ リソースとシステム リソースを消費するためです。

欠点: PHP では、グローバル変数であろうとクラスの静的メンバーであろうと、すべての変数はページ レベルです。実行されると更新されます。作成された新しいオブジェクトは、ページの実行後にクリアされます。PHP シングルトン モードは意味がないようなので、PHP シングルトン モードは、単一のページ レベルのリクエストが発生した場合の複数のアプリケーション シナリオにのみ使用されると思います同じオブジェクト リソースを共有する必要があることは非常に意味があります

関連チュートリアルの推奨事項: "PHP チュートリアル"

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

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。