ホームページ >バックエンド開発 >PHPチュートリアル >this、self、parent、および PHP の二重コロンの使用法の違いは次のとおりです。

this、self、parent、および PHP の二重コロンの使用法の違いは次のとおりです。

WBOY
WBOYオリジナル
2016-06-13 12:01:53950ブラウズ

this、self、parent、および PHP の二重コロンの使用法の違い::

PHP5 は、オブジェクト指向言語のほとんどの機能を備えた言語です。さらに多くのオブジェクト指向機能を備えています。 PHP4 よりも少しわかりにくい概念もありますので、説明が苦手な方はご容赦ください (この記事を読むには、PHP5 のオブジェクト指向の知識が必要です。 )
まず、3 つのキーワードを理解しましょう: this、self、parent、文字通り理解するのが簡単です。これは、this、self、father、haha を指します。最初にいくつかの概念を確立しましょう。これら 3 つのキーワードが使用されていますか? 予備的な説明をしましょう。これは現在のオブジェクトへのポインター (ここでは C のポインターを使用しましょう)、self は現在のクラスへのポインター、parent は親クラスへのポインターです。

まだよくわかっていないので、実例をもとにお話していきます。
(1) this
class UserName
{
??? // 属性を定義します???
???
???? // コンストラクター
??? 関数 __construct( $name )
???? {
name = $name ; //このポインタ
???? }
???? //デストラクタ
????関数__destruct(){}
???? / /ユーザー名メンバー関数
???? function printName()
???? {
????????? print( $this->name ); // このポインターを再度使用します?? ?? }
}
//オブジェクトをインスタンス化します
$nameObject = new UserName( "heiyeluren" );
//印刷を実行します
$nameObject ->printName();出力: heiyeluren
//オブジェクトの 2 番目のインスタンス化
$nameObject2 = new UserName( "PHP5" );
//印刷を実行します
$nameObject2- >printName(); //出力: PHP5
?>
上記のクラスがそれぞれ 11 行目と 20 行目でこのポインターを使用していることがわかりますが、その時点でこれは誰を指しているのでしょうか?実際、これはオブジェクトをインスタンス化するときに誰を指すかを決定します。たとえば、オブジェクトが初めてインスタンス化されるとき (25 行目)、this は $nameObject オブジェクトを指します。その後、18 行目で print( $this. ->name ) になると、当然 "heiyeluren" が出力されます。 2 番目のインスタンスでは、 print( $this->name ) は print( $nameObject2->name ) になるため、「PHP5」が出力されます。したがって、これは現在のオブジェクト インスタンスへのポインターであり、他のオブジェクトやクラスを指すものではありません。
?
?
(2)self
まず第一に、self がクラス自体を指していること、つまり self がインスタンス化されたオブジェクトを指していないことを明確にする必要があります。 self は静的変数を指すために使用されます。
???? class Counter
???? //静的変数を含む属性を定義します。 ???? private static $firstCount = 0;
??????? private $lastCount;
?????? __construct()
????????? {
????????? $this->lastCount = selft::$firstCount;静的変数を呼び出すには、次を使用する必要があります:: (フィールド操作記号)
?????????? }
???????値
???????関数 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 は親クラスへのポインタであることがわかっています。通常、親クラスのコンストラクタを呼び出すにはparentを使用します。
//基本クラス
class Animal
{
??? //基本クラス
の属性???? public $name;
??? // 基本クラスのコンストラクター関数
??? public function __construct( $name )
???? $this->name = $name;
????? }
}
//派生クラス
クラス person 拡張 Animal クラス
{
??? personSex; //Gender
??? public $personAge; //Age
???? 関数 __construct( $personSex, $personAge ) ??? {
?????????parent::__construct( "heiyeluren" ); //親クラスのコンストラクターを呼び出します。 ? $this->personSex = $personSex;
???? $this->personAge = $personAge;
??? }
???? >???? {
????????? print( $this->name. " は " .$this->personSex. "、今年は " .$ this-> personAge );
?????? }
}
// Person オブジェクトをインスタンス化します
$personObject = new Person( "male", "21");
// 実行print
$personObject->printperson(); //出力: heiyeluren は今年 21 歳です
?>

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


一般に、これは現在のオブジェクトのインスタンス、静的変数、const 定数、およびコンストラクターです。オブジェクトのインスタンスとは何の関係もありません。したがって、これを使用します。 ::

プログラム リスト: クラス定義の外部にアクセスするには変数を使用します

???
??? class Fruit {

??? ? const CONST_VALUE = 'フルーツの色' ;

??? $classname = 'フルーツ';
??? / PHP 5.3.0以降
????
??? echo Fruit::CONST_VALUE;
??? ?>
プログラムリスト: クラス定義の外で使用されます。 >??? ??? クラス フルーツ {
????? const CONST_VALUE = 'フルーツの色';
??? 🎜>??? クラス Apple は Fruit
??? {
??????? public static $color = 'Red';
????
??? ?? public static function doubleColon() {
????????? echoparent::CONST_VALUE . "n";
????????? . "n";
???
??? >

プログラムの実行結果:
1??? フルーツの色 赤
プログラム リスト: 親メソッド
???
クラス Fruit
??? {
????????? 保護された関数 showColor() {
????????? echo "Fruit::showColor()n";
? ???? ? }
???
??? クラス Apple は Fruit
??? //親の定義をオーバーライドします

???????? public function showColor()

????????? // ただし、親関数を呼び出します
?????親::showColor();
?????????エコー "Apple::showColor()n";
??? ??? ? }
??? }
??? $apple = new Apple();
??
??? ?>

プログラムの実行結果:
1??? Fruit::showColor()
プログラム リスト: スコープ修飾子
???
??????? クラスを使用します。 function showColor()
???????????? {
???????????? return $this->color;
???? ??????? }
?????? }
?????? クラス バナナ{
????????? public $color;
????????? パブリック関数 __construct()
???? ?????{
????????????$this->color = "バナナは黄色です";
?????? }
??????

???????????? パブリック関数 GetColor()

?????????{
????????? ???? return Apple::showColor();///スコープ修飾子を使用します
????????????}
?????? }
?? ????
?????? $banana = 新しいバナナ;
????? echo $banana->GetColor( );
??? 🎜>

プログラムの実行結果:
1??? バナナは黄色です
プログラム リスト: 基本クラスのメソッドの呼び出し
???
?? ? クラス フルーツ
??? {
??????? 戻り値color";
????????? }
????
??????? 静的関数 showColor()
????????? {
?????????? エコー " . self::color();
??? }
???
??? クラス Apple は Fruit
??? {
??????? {
?????? ?????? "赤" を返します;
???? }
????
??? 🎜 >??? // 出力は「カラーを表示」です!
????
プログラムの実行結果:
1??? 🎜 >
?

?

?


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