PHP this、self、parent キーワード
?
まず、いくつかの概念を確立しましょう。これら 3 つのキーワードはどこで使用されますか? これが現在のオブジェクトへのポインターであることを簡単に説明します (C のポインターを使用して見てみましょう)。self はへのポインターです。現在のクラス、parent は親クラスへのポインタです。
まだよくわかっていないので、実例をもとにお話していきます。
(1) これ
?
<?php class UserName { //定义属性 private $name; //定义构造函数 function __construct( $name ) { $this->name = $name; //这里已经使用了this指针 } //析构函数 function __destruct(){} //打印用户名成员函数 function printName() { print( $this->name ); //又使用了this指针 } } //实例化对象 $nameObject = new UserName( "heiyeluren" ); //执行打印 $nameObject->printName(); //输出: heiyeluren //第二次实例化对象 $nameObject2 = new UserName( "PHP5" ); //执行打印 $nameObject2->printName(); //输出:PHP5 ?>
上のクラスがそれぞれ 10 行目と 18 行目でこのポインターを使用していることを見てみましょう。では、この時点でこれは誰を指しているのでしょうか。実際、これはオブジェクトをインスタンス化するときに誰を指すかを決定します。たとえば、オブジェクトが初めてインスタンス化されるとき (22 行目)、this は $nameObject オブジェクトを指します。その後、18 行目で print( $this. ->
?
(2)自分
まず、self がクラス自体を指すこと、つまり self がインスタンス化されたオブジェクトを指すことはないことを明確にする必要があります。一般に、self はクラス内の静的変数を指すために使用されます。
?
<?php class Counter { //定义属性,包括一个静态变量 private static $firstCount = 0; private $lastCount; //构造函数 function __construct() { $this->lastCount = ++selft::$firstCount; //使用self来调用静态变量,使用self调用必须使用::(域运算符号) } //打印最次数值 function printLastCount() { print( $this->lastCount ); } } //实例化对象 $countObject = new Counter(); $countObject->printLastCount(); //输出 1 ?>
?ここで注意する必要があるのは、6 行目と 12 行目の 2 か所だけです。 2 行目で静的変数 $firstCount を定義し、初期値は 0 です。次に、12 行目でこの値を呼び出し、self を使用して呼び出し、途中で接続するために "::" を使用しました。ドメイン演算子を呼び出すと、この時点で呼び出すのはクラス自体によって定義された静的変数 $frestCount です。静的変数は次のオブジェクトのインスタンスとは関係がなく、クラスにのみ関連します。クラス自体の場合、this を使用して参照することはできません。self はクラス自体を指しており、オブジェクト インスタンスとは何の関係もないため、self を使用して参照できます。言い換えれば、クラスに静的メンバーがある場合は、それらを呼び出すために self も使用する必要があります。
?
(3)親
parent は親クラスへのポインタであることがわかっています。通常、parent を使用して親クラスのコンストラクタを呼び出します。
?
<?php //基类 class Animal { //基类的属性 public $name; //名字 //基类的构造函数 public function __construct( $name ) { $this->name = $name; } } //派生类 class Person extends Animal //Person类继承了Animal类 { public $personSex; //性别 public $personAge; //年龄 //继承类的构造函数 function __construct( $personSex, $personAge ) { parent::__construct( "heiyeluren" ); //使用parent调用了父类的构造函数 $this->personSex = $personSex; $this->personAge = $personAge; } function printPerson() { print( $this->name. " is " .$this->personSex. ",this year " .$this->personAge ); } } //实例化Person对象 $personObject = new Person( "male", "21"); //执行打印 $personObject->printPerson(); //输出:heiyeluren is male,this year 21 ?>
?我们注意这么几个细节:成员属性都是public的,特别是父类的,是为了供继承类通过this来访问。我们注意关键的地方,第25行:parent:: __construct( "heiyeluren" ),这时候我们就使用parent来调用父类的构造函数进行对父类的初始化,因为父类的成员都是public的,于是我们就能够在继承类中直接使用 this来调用。
?
?
?