PHP の self キーワードの分析
PHP グループの誰かが self キーワードの使用法について質問しました。答えは比較でしたメンバー関数は、self を使用して静的メンバー関数と非静的メンバー関数を呼び出すことができます。
議論が深まるにつれて、自分というものはそれほど単純なものではないことが分かりました。このことを考慮して、この記事では、まずいくつかのキーワードを比較および区別し、次に self の使い方をまとめます。
自己を完全に理解したい場合は、それを親、静的、およびこれから区別する必要があります。
以下は比較ですparent
self とparent の区別は比較的簡単です。parent は親を指します。 class/base class 隠しメソッド (または変数)、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 コンストラクター!Child コンストラクター!
Base Foo!Child Foo!Child Foo!
parent、self、static という 3 つのキーワードは、組み合わせると非常に興味深いものになります。これらはそれぞれ、親クラス、現在のクラス、サブクラスを指し、少し「過去、現在、未来」を持っています。風味。
関数参照に関して、self と static の違いは次のとおりです: 静的メンバー関数の場合、self はコードの現在のクラスを指します。 static は呼び出しクラスを指します。非静的メンバー Function の場合、ポリモーフィズムを自己抑制し、現在のクラスのメンバー関数を指します。static はこれに相当し、dynamic は呼び出しクラスの関数を指します。
this
self と this は最もよく議論される組み合わせであり、最も誤用される可能性が高い組み合わせでもあります。
両者の主な違いは次のとおりです:
これは静的メンバーでは使用できません関数、自己 はい;静的メンバー関数/変数にアクセスするには、$this:: または $this-> の代わりに self を使用することをお勧めします。;
非静的メンバー変数、self は使用できません、これのみ;
これはオブジェクトがインスタンス化されているときに使用する必要がありますが、self にはそのような制限はありません;
非静的メンバー関数内で使用する場合、自己抑制ポリモーフィズム 動作は現在のクラスの関数を参照し、これは呼び出しクラス (存在する場合) のオーバーライド関数を参照します。
自己の目的
上記の 3 つのキーワードの違いを読んだ後、自己の目的はすぐにわかりますか?一文で要約すると、self は常に「現在のクラス (およびクラス インスタンス)」を指します。
詳細:クラス名を置換し、現在のクラスの静的メンバー変数と静的関数を参照します。多態性の動作と参照を抑制します。サブクラスでカバーされる実装ではなく、現在のクラスの機能;
slot
これらのキーワードのうち、This のみが必要です。強迫性障害は、非常に不快であることを意味します;
静的メンバー関数では、$this-> を介して非静的メンバー関数を呼び出すことはできませんが、呼び出すことはできます。 self:: を通じて呼び出され、関数を呼び出す前に $this-> を使用しなくてもスムーズに実行できます。この動作は PHP バージョンによって動作が異なるようですが、現在の 7.3;
では問題ありません。在静态函数和非静态函数中输出self,猜猜结果是什么?都是string(4) "self",迷之输出;
return $this instanceof static::class;会有语法错误,但是以下两种写法就正常: $class = static::class; return $this instanceof $class; // 或者这样: return $this instanceof static;
所以这是为什么啊?!
$class = static::class;
return $this instanceof $class;
// 或者这样:
return $this instanceof static;
推荐教程:《PHP视频教程》
以上がPHPのselfキーワードの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。