ホームページ >バックエンド開発 >PHPチュートリアル >PHPのselfキーワードを解析する

PHPのselfキーワードを解析する

步履不停
步履不停オリジナル
2019-06-27 16:25:252689ブラウズ

PHPのselfキーワードを解析する

PHP グループの誰かが self キーワードの使用法について質問しました。答えは比較的明白です: this は静的では使用できませんメンバー関数は非メンバー関数を呼び出すことができますが、self を使用して静的メンバー関数/変数/定数を呼び出すことができます。他のメンバー関数は self を使用して静的メンバー関数や非メンバー関数を呼び出すことができます。静的メンバー関数。議論が深まるにつれて、self はそれほど単純ではないことがわかりました。これを考慮して、この記事では、まずいくつかのキーワードを比較および区別し、次に self の使用法をまとめます。

parentstaticthis

の違い self# を完全に理解したい場合# #、parentstaticthis と区別されます。以下に比較を示します。

parent

selfparent の区別は比較的簡単です。parent は、親クラス/ 基本クラスのメソッド (または変数) は隠蔽されており、self は独自のメソッド (または変数) を参照します。たとえば、コンストラクター内で親クラスのコンストラクターを呼び出します。

class Base {
    public function __construct() {
        echo "Base contructor!", PHP_EOL;
    }
}

class Child {
    public function __construct() {
        parent::__construct();
        echo "Child contructor!", PHP_EOL;
    }
}

new Child;
// 输出:
// Base contructor!
// Child contructor!

static

static一般的な目的は、関数または変数を次のように変更することです。これをクラス関数にすると、クラス変数は関数内の変数を変更して、そのライフサイクルをアプリケーション全体のライフサイクルに拡張することもできます。ただし、self との関連付けは、PHP 5.3 以降に導入された新しい使用法、つまり静的遅延バインディングです。

staticの静的遅延バインディング関数を使用すると、実行時に所属クラスを動的に決定できます。例:

class Base {
    public function __construct() {
        echo "Base constructor!", PHP_EOL;
    }

    public static function getSelf() {
        return new self();
    }

    public static function getInstance() {
        return new static();
    }

    public function selfFoo() {
        return self::foo();
    }

    public function staticFoo() {
        return static::foo();
    }

    public function thisFoo() {
        return $this->foo();
    }

    public function foo() {
        echo  "Base Foo!", PHP_EOL;
    }
}

class Child extends Base {
    public function __construct() {
        echo "Child constructor!", PHP_EOL;
    }

    public function foo() {
        echo "Child Foo!", PHP_EOL;
    }
}

$base = Child::getSelf();
$child = Child::getInstance();

$child->selfFoo();
$child->staticFoo();
$child->thisFoo();
プログラムの出力は次のとおりです:

Base constructor!
Child constructor!
Base Foo!
Child Foo!
Child Foo!
関数参照の観点から見ると、

selfstatic の違いは次のとおりです。静的メンバー関数の場合、self はコードの現在のクラスを指し、static は呼び出しクラスを指します。非静的メンバー関数の場合、self はポリモーフィズムを抑制します。 static は現在のクラスのメンバー関数を指します。 staticthis

と同等で、呼び出し側クラスの関数を動的に指します。 3 つのキーワード

parentselfstatic

は、親クラス、現在のクラス、とサブクラスはそれぞれ、「過去、現在、未来」に似ています。

this

selfthis

は最も議論され、悪用される可能性が最も高い組み合わせです。 2 つの主な違いは次のとおりです:
  1. this は静的メンバー関数では使用できませんが、self
  2. は使用できます。
  3. は静的メンバー関数では使用できません。静的メンバー関数に使用 / 変数アクセスの場合、$this:: または $this->## の代わりに self を使用することをお勧めします #;
  4. 非静的メンバー変数にアクセスするには、
  5. self は使用できません。this;
  6. this のみを使用する必要があります。インスタンス化時にオブジェクトがすでに使用されている場合に使用されます。self にはこの制限はありません。
  7. は非静的メンバー関数内で使用され、
  8. self は多態性の動作を抑制します。そして、現在のクラスの関数を参照し、this は、呼び出しクラスのオーバーライド関数 (存在する場合) を参照します。

self の目的

上記 3 つのキーワードの違いを読んだ後、

self の目的はすぐにわかりますか? ?一文で要約すると、self は常に「現在のクラス (およびクラス インスタンス)」を指します。詳細は、次のとおりです:

    クラス名を置き換えて、現在のクラスの静的メンバー変数と静的関数を参照します;
  1. ポリモーフィックな動作を抑制し、クラスの関数を参照しますサブクラスではなく現在のクラス カバレッジの実装; これらのキーワードのうち、
スロット

    のみ、
  1. this$ で追加する必要があります。 記号と追加が必要です。強迫性障害は、非常に不快であることを意味します。
  2. 静的メンバー関数は、
  3. $this-> を通じて非静的メンバー関数を呼び出すことはできませんが、 self:: Call を呼び出すことができ、呼び出し関数で $this-> を使用しなくてもスムーズに実行できます。この動作は、PHP のバージョンによって動作が異なるようです。現在の 7.3 では問題ありません。
  4. は静的関数と非静的関数で
  5. self を出力します。結果はどうなるでしょうか?これらはすべて string(4) "self" であり、混乱を招く出力です;
  6. return $thisinstanceof static::class;構文エラーが発生します。ただし、次の 2 つの書き方は正常です。

    $class = static::class;
    return $this instanceof $class;
    // 或者这样:
    return $this instanceof static;
    それでは、なぜこれなのでしょうか。 !

PHP 関連の技術記事の詳細については、

PHP チュートリアル 列にアクセスして学習してください。

以上がPHPのselfキーワードを解析するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

関連記事

続きを見る