PHP グループの誰かが self
キーワードの使用法について質問しました。答えは比較的明白です: this
は静的では使用できませんメンバー関数は非メンバー関数を呼び出すことができますが、self
を使用して静的メンバー関数/変数/定数を呼び出すことができます。他のメンバー関数は self
を使用して静的メンバー関数や非メンバー関数を呼び出すことができます。静的メンバー関数。議論が深まるにつれて、self
はそれほど単純ではないことがわかりました。これを考慮して、この記事では、まずいくつかのキーワードを比較および区別し、次に self
の使用法をまとめます。
parent
、static
と this
の違い self# を完全に理解したい場合# #、
parent、
static、
this と区別されます。以下に比較を示します。
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一般的な目的は、関数または変数を次のように変更することです。これをクラス関数にすると、クラス変数は関数内の変数を変更して、そのライフサイクルをアプリケーション全体のライフサイクルに拡張することもできます。ただし、
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!
self と
static の違いは次のとおりです。静的メンバー関数の場合、
self はコードの現在のクラスを指し、
static は呼び出しクラスを指します。非静的メンバー関数の場合、
self はポリモーフィズムを抑制します。
static は現在のクラスのメンバー関数を指します。
static は
this
parent
、
self、
static
thisself
と
this
this は静的メンバー関数では使用できませんが、
self または
$this->## の代わりに self
を使用することをお勧めします #;
は使用できません。
this;
のみを使用する必要があります。インスタンス化時にオブジェクトがすでに使用されている場合に使用されます。
self にはこの制限はありません。
は多態性の動作を抑制します。そして、現在のクラスの関数を参照し、
this は、呼び出しクラスのオーバーライド関数 (存在する場合) を参照します。
self の目的はすぐにわかりますか? ?一文で要約すると、
self は常に「現在のクラス (およびクラス インスタンス)」を指します。詳細は、次のとおりです:
を
$ で追加する必要があります。 記号と追加が必要です。強迫性障害は、非常に不快であることを意味します。
を通じて非静的メンバー関数を呼び出すことはできませんが、
self:: Call を呼び出すことができ、呼び出し関数で
$this-> を使用しなくてもスムーズに実行できます。この動作は、PHP のバージョンによって動作が異なるようです。現在の 7.3 では問題ありません。
を出力します。結果はどうなるでしょうか?これらはすべて
string(4) "self" であり、混乱を招く出力です;
return $thisinstanceof static::class;構文エラーが発生します。ただし、次の 2 つの書き方は正常です。
$class = static::class; return $this instanceof $class; // 或者这样: return $this instanceof static;
PHP チュートリアル 列にアクセスして学習してください。
以上がPHPのselfキーワードを解析するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。