PHPメモ②(プロパティの隠蔽)

hoge.php

<?php

class Triangle {

  public float $base;
  public float $height;

  public function __construct()
  {
    $this->base = 1;
    $this->height = 1;
  }

  public function getArea(): float {
    return $this->base * $this->height / 2;
  }
}


$triangle = new Triangle;
$triangle->base = -8;

echo $triangle->getArea()
//=> -4

三角形の面積を求めるgetArea()メソッドを作成したが、引数には正の数しか入れてほしくない。
にもかかわらず、負の数を入れても値が出てしまう。

そこで、プロパティをpublicからprivateに包み隠し、外部からアクセスできないようにする。その代わりにプロパティにアクセスできるメソッドを提供し、正の数しか代入できないようにそのメソッドでフィルタリングする(絞る)。 下記コード。

hoge.php

<?php

class Triangle {

//プロパティに対する外部からのアクセス不可能にする(private)
  private float $base;
  private float $height;

  public function __construct()
  {
    $this->setBase(1);
    $this->height = 1;
  }

  public function getArea(): float {
    return $this->base * $this->height / 2;
  }

  public function getBase() : float{
    return $this->base;
  }

  public function setBase(float $base) : void{
    if ($base <= 0){
      throw new Exception('エラー文:負の数はだめだよ〜');
    }
    $this->base = $base;
  }
}
fuga.php

<?php
require_once 'hoge.php';

$triangle = new Triangle;


print $triangle->setBase(-8);
//=> 返り値はなし。プロパティに値をセットできる。セットできる値を正の数に限定している(負の数をセットした場合はエラー文を返すようにしている)。

print $triangle->getBase();
//=> 
// setBase(8)の場合:getBase() => 8
// setBase(-8)の場合:getBase() => エラー

print $triangle->getArea();
//=>
// setBase(8)の場合:getArea() => 4
// setBase(-8)の場合:getArea() => エラー

作成者は「setBaseメソッド」と「getAreaメソッド」のみを提供することでメソッドを安全に使ってもらえる。