カプセル化

クラスとオブジェクト

クラスのデータはプロパティで管理していますが、これまで学んできた中ではプロパティのアクセス修飾子をpublicにしていましたね。これでは外部から自由にアクセスできてしまい、値を書き換えられてしまう恐れがあります。例えば人インスタンスを生成してプロパティでデータを保持している場合、勝手に年齢などを書き換えられてしまっては困りますね。プログラムが正常に動作しなくなってしまうこともあります。
そこで、今回はプロパティの保護のためのカプセル化を説明します。

クラスをカプセル化する

カプセル化とは外部からのプロパティへのアクセスを遮断し、プロパティに間接的にアクセスするためのメソッドを用意してメソッド経由でアクセスできるようにすることです。以下の手順でカプセル化します。

  • プライベートなプロパティを定義する
  • プロパティの値を取得するゲッターメソッドを定義する
  • プロパティの値を設定するセッターメソッドを定義する

円柱の体積を求めるクラスをカプセル化

見出し通り円柱の体積を求めるクラスをカプセル化してみましょう。

<?php
class Cylinder{
  const PI = 3.14;//const 名前で定数を設定する。名前に$は付けない。
  private $radius; //privateを付ける
  private $height;

  public function setRadius($radius){
    $this->radius = $radius;
  }

  public function setHeight($height){
    $this->height = $height;
  }

  public function getRadius(){
    return $this->radius;
  }

  public function getHeight(){
    return $this->height;
  }

  public function getVolume(){
    $area = pow($this->radius, 2) * self::PI;//半径×半径×円周率
    return $area * $this->height;
  }
}
?>

プライベートプロパティとアクセサーメソッド、体積を求めるメソッドを定義しました。

<html>
<head>
<meta charset="utf-8">
<title>カプセル化</title>
</head>
<body>
<?php
  require_once 'Cylinder.php';
  $vol = new Cylinder();
  $vol->setRadius(10);
  $vol->setHeight(30);

  print "底面の半径は{$vol->getRadius()}"."<br>";
  print "円柱の高さは{$vol->getHeight()}"."<br>";

  print "円柱の体積は{$vol->getVolume()}";
?>
</body>
</html>

ページを表示すると半径と高さ、体積が出力されてますね。このように直接値を変えずにメソッドを経由して値を設定するようにしてプロパティを保護するようにしましょう。

コメント

タイトルとURLをコピーしました