1. ホーム
  2. Web プログラミング
  3. PHP プログラミング
  4. phpのヒント

PHP クラス self と static の類似点と相違点、使い方の詳細

2022-01-15 10:25:45

PHP のキーワード self と static は、ほとんどの PHP ユーザーにとって目新しいものではありません。を使うことを学びました。 self::xxxx これは、現在のクラスの静的なプロパティやメソッドを呼び出す方法です。そして、staticはどうでしょうか?静的なメソッドやクラスのプロパティを定義するキーワードとしてしか知らない人も多いのではないでしょうか。

それは以前から知っていたことです。

では、この2つのキーワードの一般的な使い方をおさらいしてみましょう。

// self Usage 1: Calling static member properties


class Person

{

    protected static $maxAddressCount = 5; // Harvest the maximum number of addresses created.

 

    public function test()

    {

        echo self::$maxAddressCount;

    }

}

 

$person = new Person();

$person->test();

// self Usage 2: Call static methods


class Person

{

    protected static $maxAddressCount = 5; // Harvest the maximum number of addresses to create.

 

    protected static function getMaxAddressCount()

    {

        return self::$maxAddressCount;

    }

 

    public function test()

    {

        echo self::getMaxAddressCount();

    }

}

 

$person = new Person();

$person->test();

// self Usage 3: Create a current object


// singleton example

class Person

private

    private static $instance = null;

 

    private function __construct() {}

 

    final public static function getInstance()

    {

        if (self::$instance == null) {

            self::$instance = new self;

        }

        return self::$instance;

    }

 

    public function test()

    {

        echo "hello world!";

    }

}

 

$person = Person::getInstance();

$person->test();

静的キーワードの一般的な使用法は、上記の3つの例でも組み合わされています。

上記の使い方は、PHPの初心者の方なら誰でも知っていることだと思います。では、次の2つの方法についてお話します。

new self() new static() そして

の違いはご存知の方も多いかと思います。 new self() は現在のクラスのオブジェクトを作成しますが、そのことを知らずに new static() は、現在のクラスのオブジェクトも作成できます。

について new static() この使い方はどうかというと、公式ドキュメントに説明があります。アドレスは https://www.php.net/manual/zh/language.oop5.late-static-bindings.php

PHP では、この手法を公式に遅延静的バインディングと呼んでいます。

公式の例1です。

class A {

    public static function who() {

        echo __CLASS__;

    }

    public static function test() {

        self::who();

    }

}

 

class B extends A {

    public static function who() {

        echo __CLASS__;

    }

}

 

B::test();

クラスBはクラスAを継承しているので、AとBは共にスタティックメソッドを持ちます。 who() . この場合 B::test() は、実際にはクラス A の who() メソッドを使用します。

サブクラスClass Bのスタティックメソッドであるため who() はクラス A より後のサブクラスで定義されています。PHP のデフォルト機能では、最初に定義されたものだけを呼び出すことができます。

これがレイトスタティックバインドの概念につながる。

公式の例2です。

class A {

    public static function who() {

        echo __CLASS__;

    }

    public static function test() {

        static::who(); // later static binding starts here

    }

}

 

class B extends A {

    public static function who() {

        echo __CLASS__;

    }

}

 

B::test();

を取ります。 test() メソッド本体を self に変更されます。 static それ以降、staticは常に呼び出し元のクラスを参照するようになります。つまり、Aクラスの親クラスで定義されたメソッドと、子クラスで定義された同名のメソッドが競合するものの、Aクラスの親クラスで定義されたメソッドが競合しないことを意味します。しかし、サブクラスがそれを呼び出すと、その後、自動的に同じ名前のサブクラスのstaticメソッドに切り替わります。呼び出し元による

上の2つの例を実行すれば理解できるはずです。

この小さな部分の理由。この問題の原因となったシングルトン・メソッドを実運用で継承することになったからです。そのため、この機能が関わってくるわけです。

PHP Class selfとstaticの類似点と相違点、記事の使い方について紹介するこの記事は、より関連するPHP Class selfとstaticの内容は、BinaryDevelopの過去の記事を検索するか、以下の関連記事を引き続き閲覧してくださいBinaryDevelopをよりサポートしてくれることを願っています!