ホームページ >php教程 >php手册 >PHP5 の this、self、parent キーワードの詳細な説明

PHP5 の this、self、parent キーワードの詳細な説明

WBOY
WBOYオリジナル
2016-06-21 09:05:05807ブラウズ

php5|关键字|详解

PHP5是一具备了大部分面向对象语言的特性的语言,比PHP4有了很多的面向对象的特性,但是有部分概念也比较绕人,所以今天拿出来说说,说的不好,请高手见谅. (阅读本文,需要了解PHP5的面向对象的知识)

首先我们来明白上面三个关键字: this,self,parent,从字面上比较好理解,是指这,自己,父亲,呵呵,比较好玩了,我们先建立几个概念,这三个关键字分别是用在什么地方呢?我们初步解释一下,this是指向当前对象的指针(我们姑且用C里面的指针来看吧),self是指向当前类的指针,parent是指向父类的指针。我们这里频繁使用指针来描述,是因为没有更好的语言来表达,呵呵,语文没学好。 -_-#

这么说还不能很了解,那我们就根据实际的例子结合来讲讲。


(1) this

1 2
3 class UserName
4 {
5 //定义属性
6 private $name;
7
8 //定义构造函数
9 function __construct( $name )
10 {
11 $this->name = $name; //这里已经使用了this指针
12     }
13
14     //析构函数
15     function __destruct(){}
16
17     //打印用户名成员函数
18     function printName()
19     {
20          print( $this->name ); //又使用了this指针
21     }
22 }
23
24 //实例化对象
25 $nameObject = new UserName( "heiyeluren" );
26
27 //执行打印
28 $nameObject->printName(); //输出: heiyeluren
29
30 //第二次实例化对象
31 $nameObject2 = new UserName( "PHP5" );
32
33 //执行打印
34 $nameObject2->printName(); //输出:PHP5
35 ?>

我们看,上面的类分别在11行和20行使用了this指针,那么当时this是指向谁呢?其实this是在实例化的时候来确定指向谁,比如第一次实例化对象的时候(25行),那么当时this就是指向$nameObject对象,那么执行18行的打印的时候就把print( $this->name ),那么当然就输出了"heiyeluren"。第二个实例的时候,print( $this->name )变成了print( $nameObject2->name ),于是就输出了"PHP5"。所以说,this就是指向当前对象实例的指针,不指向任何其他对象或类。

(2)self

首先我们要明确一点,self是指向类本身,也就是self是不指向任何已经实例化的对象,一般self使用来指向类中的静态变量。

1 2
3 class Counter
4 {
5 //定义属性,包括一个静态变量
6 private static $firstCount = 0;
7 private $lastCount;
8
9 //构造函数
10 function __construct()
11 {
12 $this->lastCount = ++selft::$firstCount; //使用self来调用静态变量,使用self调用必须使用::(域运算符号)
13         }
14
15         //打印最次数值
16         function printLastCount()
17         {
18              print( $this->lastCount );
19         }
20     }
21
22 //实例化对象
23 $countObject = new Counter();
24
25 $countObject->printLastCount(); //输出 1
26
27 ?>

ここで注意する必要があるのは、6 行目と 12 行目の 2 か所だけです。 2 行目で静的変数 $firstCount を定義し、初期値は 0 です。次に、12 行目でこの値を呼び出し、self を使用して呼び出し、途中で接続するために "::" を使用しました。ドメイン演算子を呼び出すと、この時点で呼び出すのはクラス自体によって定義された静的変数 $frestCount です。静的変数は次のオブジェクトのインスタンスとは関係がなく、クラスにのみ関連します。クラス自体の場合、this を使用して参照することはできません。self はクラス自体を指しており、オブジェクト インスタンスとは何の関係もないため、self を使用して参照できます。言い換えれば、クラスに静的メンバーがある場合は、それらを呼び出すために self も使用する必要があります。


(3)parent

一般に、parent は親クラスへのポインタであることがわかっています。親クラスのコンストラクタを呼び出すには、parent を使用します。

1 2
3 //基本クラス
4 class Animal
5 {
6 //基本クラスの属性
7 public $name //名前
8
9 //コンストラクター基本クラスの
10 Public function __construct( $name )
11 {
12 $this->name = $name;
13 }
14 }
15
16 // 派生クラス
17 クラス person は Animal を拡張します // person クラスは Animal クラスを継承します
18 {
19 public $personSex; //Gender
20 public $personAge; //Age
21
22 //継承されたクラスのコンストラクター
23 function __construct( $personSex, $personAge )
24 {
25parent::__construct( "heiyeluren" ); //親クラスのコンストラクターはparentを使用して呼び出されます
26 $this->personSex = $personSex;
27人
30 関数 printperson()
31 {
32 Print( $this->name. " is " .$this->personSex. ",今年 " .$this->personAge ); }
35
36 //人物オブジェクトをインスタンス化します
37 $personObject = new Person( "male", "21");
38
39 //印刷を実行
40 $personObject->printperson(); //出力:heiyelurenは今年21
41
42 ?>


私たちはこれらの詳細に注意を払っています: メンバー属性、特に親クラスの属性はすべてパブリックであり、継承されたクラスがこれを通じてアクセスできます。重要な点である 25 行目:parent::__construct( "heiyeluren" ) に注目してください。このとき、親クラスのメンバーは次のとおりであるため、parent を使用して親クラスのコンストラクターを呼び出し、親クラスを初期化します。すべて public なので、これを直接使用して継承されたクラスを呼び出すことができます。

概要:

this はオブジェクト インスタンスへのポインター、self はクラス自体への参照、parent は親クラスへの参照です。


基本的に、私が知っているのはこれだけです。いくつかの誤解があるはずです。専門家に指摘してください。

私のメールアドレス: heiyeluren@163.com

書き込み時間: 2004-11-3 18:30


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。