PHP グループの誰かが self キーワードの使用法について質問しました。答えは比較的明白です:
これを使用して非メンバー関数を呼び出すことはできません。静的メンバー関数ですが、静的メンバー関数/変数/定数を呼び出す self を使用できます。
他のメンバー関数は、self を使用して静的メンバー関数および非静的メンバー関数を呼び出すことができます。
議論が深まるにつれて、自分というものはそれほど単純なものではないことが分かりました。このことを考慮して、この記事では、まずいくつかのキーワードを比較および区別し、次に self の使い方をまとめます。
親、静的、およびこれとの違い
自己を完全に理解したい場合は、親、静的、およびこれを区別する必要があります。
以下は比較です
parent
self とparent の区別は比較的簡単です。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の静的遅延バインディング機能を使用すると、実行時に所属クラスを動的に決定することができます。推奨: "PHP Tutorial"
例:
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!
関数リファレンスでは、 self と static 違いは次のとおりです: 静的メンバー関数の場合、self はコードの現在のクラスを指し、static は呼び出しクラスを指します。非静的メンバー関数の場合、self はポリモーフィズムを抑制し、現在のクラスのメンバー関数を指します。 、static はこれに相当し、dynamic は呼び出しクラスの関数を指します。
parent、self、static という 3 つのキーワードは、組み合わせると非常に興味深いものになります。これらはそれぞれ、親クラス、現在のクラス、サブクラスを指し、少し「過去、現在、未来」を持っています。風味。
this
self と this は最もよく議論される組み合わせであり、最も誤用される可能性が高い組み合わせでもあります。
この 2 つの主な違いは次のとおりです:
これは静的メンバー関数では使用できませんが、自身では使用できます;
静的メンバー関数の場合/variables アクセスするには、$this:: または $this-> の代わりに self を使用することをお勧めします。;
非静的メンバー変数へのアクセスには、self は使用できません。this のみを使用します。;
これはオブジェクトがインスタンス化されている場合に使用する必要があり、self にはこの制限はありません。
は非静的メンバー関数で使用され、self はポリモーフィックな動作を抑制し、現在のクラスの関数を参照します。これは呼び出し側クラスの重い関数を参照しますが、関数 (存在する場合) をオーバーライドします。
自己の目的
上記の 3 つのキーワードの違いを読んだ後、自己の目的はすぐにわかりますか?一文で要約すると、次のようになります。 self は常に「現在のクラス (およびクラス インスタンス) 」を指します。
詳細:
クラス名を置換し、現在のクラスの静的メンバー変数と静的関数を参照します。
多態性の動作を抑制し、クラスの関数を参照します。サブクラスでカバーされる実装ではなく、現在のクラス;
スロット
これらのキーワードのうち、これだけ $ 記号を付けて追加する必要があります。 ;
非静的メンバー関数は、静的メンバー関数の $this-> を通じて呼び出すことはできませんが、self:: を通じて呼び出すことができ、静的メンバー関数で $this-> を使用しなくてもスムーズに実行できます。呼び出し関数。この動作は、PHP のバージョンによって動作が異なるようです。現在の 7.3 では問題ありません。
静的関数と非静的関数で self を出力します。結果はどうなるでしょうか?これらはすべて、謎の出力である string(4) "self" です;
return $thisinstanceof static::class; 構文エラーはありますが、次の 2 つの書き方は正常です:
$class = static::class; return $this instanceof $class; // 或者这样: return $this instanceof static;
だから、ああ? !
$class = static::class; return $this instanceof $class; // 或者这样: return $this instanceof static;
PHP 関連の知識の詳細については、PHP 中国語 Web サイト をご覧ください。
以上がPHPのselfキーワードを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。