こんなことってありませんか?
PHPを使って開発をするなら、必ず理解しておきたい$this。
今回は【徹底解説】PHPの$thisはこう使う!をご紹介します。
目次
まずクラスを理解する
$thisを理解するために、クラスという概念を理解せずには通れません。
まずは簡単なプログラムを使ってクラスという概念を解説していきます。
クラス=「誰がどんな能力を持っているか」
クラスという概念は、初学者にとってはつまづくポイントです。
難しいことは、シンプルに理解しましょう。
ずばり、クラスとは「誰がどんな能力を持っているか」を表現したもの、です。
例えば、ユーザをクラスとして表現するためにUserクラスをプログラムで定義してみます。
1 2 3 4 5 6 7 8 9 |
// これがクラス class User { // これがプロパティ public $name; public $email; public $address; } $user = new User(); print_r($user); |
ここでUserが持つ能力をまとめると、
メールアドレス($email)を持っている
住所($address)を持っている
です。
このようにクラスを使えば、誰がどんな能力を持っているか、という表現ができます。
ここで、$nameや$email、$addressのことをプロパティと呼ぶことも覚えておきましょう。
privateと$thisはセットで使う
ここからが本題の$thisの使い方について解説していきます。
まず結論から言うと、privateがあったら$thisを使う、と理解しておいてOKです。
では、実際にprivateを使ってプログラムを書いてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class User { private $name; private $email; private $address; public function setUser(string $name, string $email, string $address){ // $this->nameはprivate $nameを示す $this->name = $name; // $this->emailはprivate $emailを示す $this->email = $email; // $this->addressはprivate $addressを示す $this->address = $address; } } $user = new User(); $user->setUser('hoge', 'hoge@hoge.com', 'hoge city');<br> |
privateには大事なルールがあります。
それは、privateを使うなら必ず$thisを使ってプロパティの値を変更する、というルールです。
このプログラムの例では、privateとして指定したプロパティは、$this->nameのようにして値を変更しなければなりません。
これはパターンなので、そういうものとして理解しちゃいましょう。
privateはバグを減らすための仕組み
むしろ複雑になって、開発が面倒になっているのでは?
という疑問がありますよね。
では、先のプログラムをprivateを使わないようにしてみます。
1 2 3 4 5 6 7 8 9 10 11 12 |
class User { public $name; public $email; public $address; } $user = new User(); $user->name = 'hoge'; $user->email = 'hoge@hoge.com'; $user->address = 'hoge city'; print_r($user); |
このプログラムの場合、$name, $email, $addressは$userという変数が有効である限りどこからでも、書き換えることができます。
例えばもし、ここでバグが発見されたとしましょう。すると、
という事態が起きてしまいます。
つまり、どこからでも書き換えることができると、バグが発生したときに$userという変数が書かれた箇所をすべてチェックすることになります。
そこでprivateです。
例えば、privateなプロパティに$user->name = ‘hoge’として変更してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class User { private $name; private $email; private $address; public function setUser(string $name, string $email, string $address){ $this->name = $name; $this->email = $email; $this->address = $address; } } $user = new User(); //この書き方で値を更新すると、エラーになる $user->name = 'hoge'; |
すると、「Fatal error: Uncaught Error: Cannot access private property 」とエラーになります。
ここでprivateを使うときのルールを思い出します。
つまり、このプログラムではプロパティの書き換えるときは必ずsetUser関数を使う、というルールが出来上がります。
このようにprivateを使うと、どこからでも書き換えることはできない代わりに、チェックすべき箇所を絞ることができるようになります。
$thisと似ているself::の使いどころ
$thisについてある程度、理解している人でも
という人 も多いはず。
ここで$thisと併せてself::についても解説します。
そもそも$thisかself::の使い方で悩む最大の理由は、$thisもself::も使い方が似ているからです。
では、どんなときにself::を使うのでしょうか?
self::とconst/staticはセットで使う
結論から言うと、constかstaticがあればself::を使う、です。
百聞は一見にしかずです。プログラムで解説していきます。
例えば、商品情報をもつProductクラスがあるとします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
class Product { // constの変数は大文字で「$」はつかない const TAX = 0.1; public static $yen = '円'; public function getTax() { return self::TAX; } public static function getYen() { return self::$yen; } // constとして宣言されている変数は変更できない public function setTax(int $tax) { self::TAX = $tax; } // staticな変数は変更することができる public static function setYen(string $yen) { self::$yen = $yen; } } // constな値はこのように呼び出すことができる print_r(Product::TAX); // staticな値はこう呼び出せる print_r(Product::$yen); // staticな変数は変更することができる print_r(Product::setYen('$')); |
constでも、staticでもself::を使って変数を取得できます。
constとstaticの最大の違いは、
constな変数は大文字で宣言する
staticな変数は(同じクラスなら)変更することができる
このプログラムでは、商品の消費税(TAX)のような変わらない値はconst、値段の単位は同じProductクラスなら変更できる変数としてstaticを利用しています。
まとめ
いかがでしたか?
今回は、「徹底解説】PHPの$thisはこう使う!についてご紹介しました。
$thisを使って効率よく開発を進めることができます。
ぜひ参考にしてみてくださいね。