【PHP】アクセス修飾子でクラスに制限をかける
こんにちは😊Kintarouです。
現在エンジニア転職を目指してTECH CAMPにてプログラミング学習中です👨🎓
夢はフリーランスエンジニアになって働く人が働きやすいシステムを作ること!
と、愛する妻と海外移住すること🗽
プログラミングや読んでいる本のことなど、ブログに書いていきます!
twitter : https://twitter.com/ryosuke_angry
今回参考にさせて頂いたサイト様🙇♂️
dotinstall.com
アクセス修飾子とは
クラス内の変数やメソッドがどこからアクセス出来るようにするかを指定するものです。
何も表記が無いとpublicとなります。
アクセス修飾子 | アクセス権限 |
---|---|
public | どこからでもアクセス可能 |
private | 同じクラス内のみアクセス可能 |
public | 同じクラス・子クラスのみアクセス可能 |
privateやpublicは、アクセスに制限をかけるイメージです。
なぜ制限をする必要があるかというと、クラス外の操作で意図せぬ動作を起こさないようにするためです。
昨日の記事と同じUserクラスを使って例を出します。
<?php class User { #followerは最初0で、フォローされる事に1ずつ増えるという動きしか想定しません。 public $name; public $age; public $follower = 0; public function __construct($name, $age) { $this->name = $name; $this->age = $age; } public function profile() { printf('%s (%d)(%d)' . PHP_EOL, $this->name, $this->age, $this->follower ); } } $users = []; $users[0] = new User('Kintarou', 30); $users[1] = new User('Kinjirou', 35); #通常はこの動作で1ずつ増やす事しか想定していません。 $users[0]->follower++; $users[0]->profile(); #=>Kintarou (30)(1) #制限が無いと意図しない数字になる恐れがあります。 $status = -15; $users[1]->follower = $status; $users[1]->profile(); #=>Kinjirou (35)(-15)
上記のように、$followerをクラス外で操作されると意図しない動作をする可能性があります。
privateで制限をかける
この場合、$followerのアクセス権限をクラス内のみにしてfollower++のメソッドもクラス内に記述します。
<?php class User { #$followerをprivateにする事でクラス外で直接アクセスする事を制限します。 public $name; public $age; private $follower = 0; public function __construct($name, $age) { $this->name = $name; $this->age = $age; } public function profile() { printf('%s (%d)(%d)' . PHP_EOL, $this->name, $this->age, $this->follower ); } #$followerを1ずつ増やす動作をfollowメソッドとします。 public function follow() { $this->follower++; } } $users = []; $users[0] = new User('Kintarou', 30); $users[1] = new User('Kinjirou', 35); #followメソッドでfollowerを1増やします。 $users[0]->follow(); $users[0]->profile(); #=>Kintarou (30)(1) #アクセス権限のある変数に直接アクセスしようとするとエラーとなります。 $status = -15; $users[1]->follower = $status; $users[1]->profile(); #=>Fatal error: Uncaught Error: Cannot access private property User::$follower in /home/dotinstall/main.php:41...
以上、どなたかの参考になれば幸いです😊