PHPもオブジェクト志向言語であり、クラスやインスタンスが利用できます。
オブジェクトやクラスについて勉強を始めたときに、まず、悩むのは以下のような記述でしょう。
1 2 3 4 5 6 7 8 9 |
<?php class Foo { private $name = ""; ・・・ public function setName($name) { $this->name = $name; } ・・・ } |
setNameというメソッド(関数)の定義の中の「$this->name = $name;」という式では、式の両辺にnameがあって、どういう動きをするのか、ぱっと見には迷ってしまいますね。
ここでは、PHPでクラスを定義する際によく使う擬似変数thisの使い方や留意点について説明します。あわせて、self::との違いも説明します。
PHPプログラミングに興味のある方は、プログラミング学習の参考として、ぜひ読んでみてください。
目次
オブジェクトとクラス
オブジェクトとは
オブジェクトは自分自身の状態についての情報を持っており、与えられた刺激に反応する方法を知っているものといえます。
自分自身の状態についての情報をプロパティ(属性)とよびます。プロパティは名前と値のペアであり、定数や変数を用いて定義します。
与えられた刺激に反応する方法をメソッドと呼びます。メソッドは関数で定義します。
クラスとは
クラスはよくオブジェクトを作るための設計図にたとえられます。
オブジェクトには、自身が持つプロパティ名が全て同じで、値のみが異なるものがあります。こうした場合、個々のオブジェクトごとに構成も含めて定義するのでは手間がかかります。
そこで、各オブジェクトに共通のプロパティとメソッドを集めてオブジェクトの構造を定義したものをクラスといいます。
逆に言えば、クラス定義にしたがって、プロパティの値などを具体化したものがオブジェクト(インスタンス)なのです。
オブジェクトとクラスについては、こちらも参考に。
【初心者向け】PHPのオブジェクトとクラスを解説!擬似変数this
擬似変数thisとは
擬似変数thisは、オブジェクト(インスタンス)を指します。
クラス定義の際に、クラス内のプロパティやメソッドにアクセスしたい場合に使用します。
使い方:冒頭でご紹介したクラスFooの場合
1 2 3 4 5 6 7 8 9 10 |
<?php class Foo { private $name = ""; //①プロパティnameを定義、 //privateなのでクラス外からはアクセスできない ・・・ public function setName($name) { //②プロパティnameのセッター関数 $this->name = $name; //③プロパティnameに引数値を格納 } ・・・ } |
①プロパティとしてnameを定義しています。
②メソッド(関数)setaNameの引数にもnameを使用しています。
③プロパティnameにsetNameの引数の値を代入しています。
使い方:プロパティと変数の違い
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php class Foo { private $name = ""; ・・・ public function getName() { return $name; //①プロパティnameの値を戻すつもりだが・・・ } } $foo = new Foo(); echo $foo->getName(); //プロパティFooの値を参照 ?> |
実行結果
1 |
・・・ Undefined variable $name・・・ |
getName関数の①では、疑似変数$thisを使用していないため、プロパティ$nameへのアクセスではなく、関数内のローカル変数$nameを参照しようとしますが、未定義のためエラーとなります。
正しくは、以下のように疑似変数$thisを使用します。
記述例
1 2 3 4 5 6 7 8 9 10 |
<?php class Foo { private $name = ""; ・・・ public function getName() { return $foo->$name; //②擬似変数thisを使用! } } ・・・ ?> |
擬似変数thisはインスタンスを指す
擬似変数thisはインスタンスを指し、クラス定義自身を指すものではないことに留意してください。
例えば、クラスが継承されている場合などにその違いが現れます。
記述例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php class ParentOfFoo { function who() { //①メソッドwhoを定義 echo ' ParentOfFoo '; } function test() { // ②メソッドtestを定義してwhoを呼び出し $this->who(); } } class Foo extends ParentOfFoo { function who() { //③メソッドwhoをオーバーライト echo 'Foo '; } } $obj1 = new ParentOfFoo(); $obj1->test(); //④ $obj2 = new Foo(); $obj2->test(); //⑤ ?> |
上記の例では、
②:メソッドtestはクラスParentOfFoo内で定義されており、メソッドwhoを呼び出しています。
③:メソッドwhoは子クラスFooでオーバーライトされています。
④では、クラスParentOfFooのインスタンスが生成されており、メソッドwhoはクラスParentOfFooで定義されたメソッドが呼び出されています。
⑤では、子クラスFooのインスタンスが生成されており、メソッドtestは子クラスFooで定義したメソッドが呼び出されています。
クラスとインスタンスの関係はこちらも参考に。
【php】クラスとインスタンスの特徴から関係性まで解説self::
self::とは
クラス定数やstatic変数は、インスタンス化せずに使用します。すなわち、クラス定義を参照します。
そのため、擬似変数$thisは使用できず、代わりに擬似変数selfを使用します。
擬似変数thisとの違い
self::はクラス自体を表し、$thisはインスタンスを表します。
self::はクラス定数やstatic変数など静的なプロパティにアクセスできるのに対し、$thisは静的なプロパティにはアクセスできません。
静的なプロパティにアクセスする際は、self::を使用し、動的なプロパティやメソッドにアクセスする際は$thisを使用するなどの使い分けをするといいでしょう。
記述例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php class ParentOfFoo { function who() { // ①メソッドwhoを定義 echo ' ParentOfFoo '.PHP_EOL; } function test() { // self::who(); //② self:: $this->who(); //③ 擬似変数this } } class Foo extends ParentOfFoo { function who() { //④メソッドwhoをオーバーライト echo ' Foo '.PHP_EOL; } } $obj = new Foo(); $obj->test(); //⑤ ?> |
⑤では子クラスFooのインスタンスを呼び出していますが、メソッドtest内の②ではself::を使用していますので、①で定義したメソッドwhoが呼び出されます。
静的なプロパティやメソッドについては、こちらも参考に。
【初心者向け】PHPのクラス変数を解説!まとめ
いかがでしたか? 今回は、PHPの擬似変数thisの使い方などを紹介しました。
- クラス定義において、自クラス内のプロパティやメソッドを参照する際は、擬似変数thisを利用する。
- static宣言されているクラス変数やクラスメソッドを参照する際は、self::を利用する。
PHPにかぎらず、オブジェクトの扱いはプログラミングでは重要になっています。クラス定義をはじめ、オブジェクトの扱い方をきちんと理解しておきましょう。
この記事が、PHPプログラミングの学習の参考としてお役に立てば幸いです。