Kintarou'sBlog

プログラミング学習中。学習内容のアウトプットや読書で学んだことなど随時投稿!

【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...

以上、どなたかの参考になれば幸いです😊