PHP 理解のパート 1: this、self、parent の 3 つのキーワードの違い [転送]
転載元: http://hi.baidu.com/sneidar/blog/item/4c0015ecd4da9d38269791d3.html
?
PHP5 は、オブジェクト指向言語のほとんどの機能を備えた言語です。PHP4 よりも多くのオブジェクト指向機能を備えていますが、ここで主に説明しているのは、いくつかの概念です。 この、self、parentという3つのキーワードの違い。これ、私、父をそれぞれ参照すると、文字通り理解するのが簡単です。まず、これら 3 つのキーワードは何に使用されるのかをいくつか説明します。 場所はどこですか?
これを表現するのにこれより適切な言語がないため、ここでの説明にはポインタを頻繁に使用します。
?
1. これ: 現在のオブジェクト ポインター
class UserName { private $name; function __construct($name){ $this->name = $name; } function __destruct(){ } function printName(){ print($this->name); } } $no1 = new UserName('thomas.chen'); $no1->printName(); print('<br/>'); $no2 = new UserName('berry.chen'); $no2->printName();
?
見てみましょう。上のクラスはそれぞれ 5 行目と 13 行目でこのポインタを使用しています。では、その時点でこれは誰を指しているのでしょうか?実際、これにより、オブジェクトが初めてインスタンス化されるときなど、インスタンス化の際に誰を指すかが決まります。 (17 行目)、これは $no1t オブジェクトを指しています。18 行目で印刷するときは、print( $this->name ) は print( $nameObject->name になります) ) とすると、もちろん「thomas.chen」が出力されます。 2 番目のインスタンスでは、 print( $this->name ) は print( $no2->name )、「berry.chen」が出力されます。したがって、これは現在のオブジェクト インスタンスへのポインターであり、他のオブジェクトやクラスを指すものではありません。
?
?
2. self: 現在のクラスポインタ
class Counter { private static $firstCount = 0; private $lastCount; function __construct() { $this->lastCount = ++self :: $firstCount; } function printLastCount(){ print($this->lastCount); } } $c1 = new Counter(); $c1->printLastCount(); print('<br/>'); $c2 = new Counter(); $c2->printLastCount();
?
ここで注意する必要があるのは、2 行目と 6 行目の 2 か所だけです。 2 行目で静的変数 $firstCount を定義し、初期値は 0 で、6 行目でこの値を呼び出しました。 self を使って呼び出し、途中で接続するのに「::」を使います。これをドメイン演算子と呼びます。このとき呼び出すのは、クラス自体が定義した静的変数 $frestCount です。 私たちの静的変数は、次のオブジェクトのインスタンスとは何の関係もありません。クラス自体に関連付けられているだけなので、self が参照するために self を使用することはできません。オブジェクトとは異なり、クラス自体は無関係です。言い換えれば、クラスに静的メンバーがある場合は、それらを呼び出すために self も使用する必要があります。
?
?
3. 親: 親ポインタ。通常、親クラスのコンストラクターを呼び出すにはparentを使用します。
class Animal { public $name; function __construct($name){ $this->name = $name; } } class Person extends Animal { public $sex; public $age; function __construct($name,$sex,$age){ parent::__construct($name); $this->sex = $sex; $this->age = $age; } function printPerson(){ print('[name:'.$this->name.', sex:'.$this->sex.', age:'.$this->age.']'); } } $person = new Person('thomas.chen','Male','25'); $person->printPerson();
?
私たちは以下の詳細に注意を払っています: メンバー属性、特に親クラスの属性はすべてパブリックであり、継承されたクラスがこれを通じてアクセスできます。重要なポイントである 15 行目に注目します。 parent::__construct($name)、このとき、parent を使用して親クラスのコンストラクターを呼び出し、親クラスを初期化します。親クラスのメンバーはパブリックであるため、継承されたクラスで直接使用できます。 これを呼び出すために。
?
?