オブジェクト指向は「カプセル化」「継承」「ポリモーフィズム」の3つの要素で成り立つと言われます。
オブジェクト指向では必須らしい、カプセル化。
カプセル化とは何か。
例えばiPhoneは液晶部分は操作できますが、本体の中身は基本的に特別な器具がないと開けることはできないですよね。iPhone内部にあるパーツなどはユーザーがいじれないように隠すことで、予期せぬ故障を未然に防いでいることになります。この隠すことを、プログラミングの専門用語でカプセル化と言います。
ということ。
カプセル化を可能にするpublicとprivate
<?php
class Menu {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
$curry = new Menu("カレー");
echo $curry->name;
?>
<!--出力結果-->
<!--カレー-->
プロパティ(public $hogeやprivate $hogeの部分)をprivateにすると、classの外からは参照できなくなる。
<?php
class Menu {
private $name;
public function __construct($name) {
$this->name = $name;
}
}
$curry = new Menu("カレー");
echo $curry->name;
?>
<!--エラー発生-->
では、privateプロパティを参照し、値を取得、更新したいときはどうすればいいのか。
privageの場合はゲッターを使い、メソッド経由で値を返す
プロパティを返すだけのメソッドを作りそのメソッド経由で、プロパティの値を参照する。
このときそのメソッド(プロパティがhogeのとき、名前は通常getHoge()メソッド)はclassの中にあるため、
プロパティがprivateでも値を返すことができる。
class Menu {
private $name;
public function __construct($name) {
$this->name = $name;
}
//nameを返すだけのメソッド(ゲッター)
public function getName(){
return $this->name;
}
}
$curry = new Menu("カレー");
//「$curry->name」という風には呼べないので、代わりにgetName()メソッド経由で呼び出す。
echo $curry->getName();
?>
<!--出力結果-->
<!--カレー-->
プロパティの値の変更はセッターを使う
pblicの場合は以下のようにできる。
<?php
class Menu {
private $name;
public $price = 1000;
public function __construct($name) {
$this->name = $name;
}
public function getName(){
return $this->name;
}
public function setPrice(){
}
}
$curry = new Menu("カレー");
echo $curry->getName()."\n";
echo $curry->price."\n";
//値を更新
$curry->price = 1200;
echo $curry->price."\n";
?>
<!--カレー-->
<!--1000-->
<!--1200-->
しかし、privateだとエラーが出るため、セッター(プロパティがhogeのとき、名前は通常setHoge()メソッド)を作成し、セッター経由で、値を更新する。
<?php
class Menu {
private $name;
private $price = 1000;
public function __construct($name) {
$this->name = $name;
}
public function getName(){
return $this->name;
}
public function getPrice(){
return $this->price;
}
//セッター
public function setPrice($price){
//更新したい値を引数にとり、$this->priceに代入し、privateプロパティを更新
$this->price = $price;
return $this->$price;
}
}
$curry = new Menu("カレー");
echo $curry->getName()."\n";
//更新前
echo $curry->getPrice()."\n";
//セッター経由で値を更新
$curry->setPrice(1200)."\n";
//更新後
echo $curry->getPrice()."\n";
?>
<!--カレー-->
<!--1000-->
<!--1200-->