3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

カプセル化とは

3
Last updated at Posted at 2019-04-06

オブジェクト指向は「カプセル化」「継承」「ポリモーフィズム」の3つの要素で成り立つと言われます。

https://qiita.com/tutinoco/items/6952b01e5fc38914ec4e

オブジェクト指向では必須らしい、カプセル化。

カプセル化とは何か。

例えばiPhoneは液晶部分は操作できますが、本体の中身は基本的に特別な器具がないと開けることはできないですよね。iPhone内部にあるパーツなどはユーザーがいじれないように隠すことで、予期せぬ故障を未然に防いでいることになります。この隠すことを、プログラミングの専門用語でカプセル化と言います。

https://qiita.com/yuta-ushijima/items/d6b656618c10f47a6c32

ということ。

カプセル化を可能にするpublicとprivate

public.php
<?php
class Menu {
    public $name;
    public function __construct($name) {
        $this->name = $name;
    }
}

$curry = new Menu("カレー");
echo $curry->name;
?> 

<!--出力結果-->
<!--カレー-->

プロパティ(public $hogeやprivate $hogeの部分)をprivateにすると、classの外からは参照できなくなる。

priavte.php
<?php
class Menu {
    private $name;
    public function __construct($name) {
        $this->name = $name;
    }
}

$curry = new Menu("カレー");
echo $curry->name;

?>
<!--エラー発生-->

では、privateプロパティを参照し、値を取得、更新したいときはどうすればいいのか。

privageの場合はゲッターを使い、メソッド経由で値を返す

プロパティを返すだけのメソッドを作りそのメソッド経由で、プロパティの値を参照する。
このときそのメソッド(プロパティがhogeのとき、名前は通常getHoge()メソッド)はclassの中にあるため、
プロパティがprivateでも値を返すことができる。

private.php
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の場合は以下のようにできる。

public.php
<?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()メソッド)を作成し、セッター経由で、値を更新する。

private.php
<?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-->

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?