クラス A{
プライベート $ハンドル;
パブリック関数 __construct(){
}
パブリック関数 Say($word){
if(!isset($handle)){
$this->__construct();
}
echo $word;
}
}
クラス B は A を拡張します{
プライベート $word;
public function __construct($word){
$this->word = $word;
}
pulbi 関数 call(){
$this->say($this->word);
}
}
$b = 新しい B('hello');
$b->call();
このコードを実行すると、「hello」が出力されないことがわかります。
詳しく見てみると、クラス A の Say メソッドの $this->__contruct() に問題があることがわかりました。当初はクラス A のコンストラクターを呼びたかったのですが、実際には B
を呼び出していました。
これには self
を使用する必要があります
このキーワード変更の意味は「静的」という意味で、PHP マニュアルではキーワード self、parent、static が記載されていますが、実際にはキーワードである static を除いて、他の 2 つはマニュアルではキーワードではありません。 2 つのキーワードもキーワード リストにありません。これを確認するのは簡単です。
var_dump(self); // -> string(4) "self"
上記のコードはエラーを報告しません。error_reporting(E_ALL) をオンにすると、実際に何が起こっているかを確認できます。このコードを実行すると、「注意: 未定義の定数 self の使用 - 'self' を想定しています」と表示されます。たとえば、PHP は self を通常の定数として扱います。未定義の定数を実行しようとすると、出力自体は上記の例の "self" のように文字列として扱われますが、同時に NOTICE が出力されます。これは特別なことは何もないことを意味します。自己識別子について。
self は現在のクラスを指す特別なクラスですが、クラス定義内でのみ有効です。これは、クラス定義内にある必要があるだけでなく、new などのクラスのコンテキスト内にあることも必要です。 self() このとき、self は現在のクラスを指します。
したがって、クラスAのsayメソッドはself::__parent()