アクセス権、プロパティ、ゲッタとセッタ

アクセス修飾子

public、pivate、protected

アクセス修飾子は、クラス、メソッド、メンバーのアクセシビリティ(どこからアクセス可能なのか)を設定する。publicはファイル内外どこからでもアクセス可能で、protectedクラス自身と継承クラスからアクセスできる。そしてprivateは同じクラス内でしかアクセスできないという違いがある。

使い分ける

では、どのように使い分けるのか。
一言でいえば「安全性」。公開/非公開のクラスを分けることで、見せて良いものと悪いものを区別でき、チーム開発のときなどに、保守の意図を明確にすることができる。
アクセス修飾子を付けない場合には、基本、publicとみなされる。安全性を考慮するのであれば、privateから考えていく方が良いということになる。

継承とは

ここで、protectedを使うケースを考える。protectedがprivateと違うのは、継承先でも使えるという点。
じゃあ、継承とは何なのか。
継承とは、参照元のクラスのプロパティやメソッドを別のクラスが引き継ぐことを指す。別のクラスでも、プロパティやメソッドが使えるようになる状態。
こちらの記事を参照させていただこう。
cf, PHPにおける継承とextends、オーバーライドとparent、final、protected (1/3)
(最終閲覧2020/06/12)

<?php
class Isekai
{
    //名前のプロパティ
    private $name = "";
    //名前のゲッタ
    public function getName(): string
    {
        return $this->name;
    }
    //名前のセッタ
    public function setName(string $name): void
    {
        $this->name = $name;
    }
}

プロパティとgetter、setter

プロパティとは

プロパティとは何なんだ?マニュアルによれば、「メンバ変数」のことを指す。

class Isekai(クラス名){
    public(アクセス修飾子) $name(メンバ変数名);
}

メンバ変数

このメンバ変数、どういった役割を果たしているか。変数なのに、なんでアクセス修飾子がついてくるのか。
メンバ変数を見ていくと、「それ本体の情報」といった理解で、その下のセッタ、ゲッタは「メンバ関数(メソッド)でその本体の動作を表している」、というような説明が多い気がする。ちょっと古いが、以下の記事を参照する。
【php】$thisとかnewとかなんだそれ!な人向けメモ(最終閲覧2020/06/14)

class Desk
{
    //メンバ変数(プロパティ)
     public $color    =    "brown" ;
     public $material    =    "wood" ;
     public $height    =    800 ;    //単位:ミリメートル
     public $weight    =    5000 ;    //単位:ミリグラム
     public $sound    =    "コン ";

    //メンバ関数
     function knock($times){
        for($i = 0; $i <= $times; $i++){
            echo $this -> sound ;   
        }
        return;
    }
}
//ここまでがクラスの定義

$desk    =    new Desk() ;    // new <クラス名>で、クラスの中身を使用できる状態にする
echo $desk -> material ; //wood
$desk -> knock(1) ; //コン コン
?>

実行結果
//woodコン コン

コードは誤植があったので一部直した。変数ということだから、$color = “brown" ;でいけないのかと思ったのだが、以下のように怒られた。

PHP Parse error:  syntax error, unexpected '$color' (T_VARIABLE), expecting function (T_FUNCTION) or const (T_CONST)

アクセス修飾子かconst、varなどで定義しないと通らない。varはpublicと同じとみなされるので、アクセス修飾子かconstかという理解なのだろう。クラス内で変数を定義するには、アクセス修飾子がいるが、メンバ関数内では、不要。クラス自体はメンバ変数とメンバ関数とでできてて、そのうちのメンバ関数にも勿論変数は指定できるが、アクセス修飾子は不要。

クラス
—メンバ変数(アクセス修飾子必要)
—メンバ関数
 -変数(アクセス修飾子不要)

変数についてよく理解してなかった。
ところで、ゲッタとセッタって何?

ゲッタとセッタ

アクセサメソッド

ゲッタとセッタは、「classの構成要素であるフィールドのアクセスを仲介する目的で用意されるメソッド」。これを、アクセサメソッドという。あんまり意識せずに、Getter/Setter共通型でコード書いてることがある。
ゲッタとセッタはとりあえずこれ。なんかよく見るよね。

  // getter
    public function getName() {
        return $this->name;
    }
    // setter
    public function setName($name) {
        $this->name = $name;
    }

ゲッタは値返すからなんとなく分かるけど、セッタがなんだかよくわからん。クラスにメンバ変数を与えたと思うが、あれは初期なので、実際に値を変更したりする場合にはセッタ、ゲッタを使うということだ。
根本の操作対象であるプロパティはprivateにしておいて、それをいじるときにゲッタとセッタを使うイメージ。セッタは本体の意味を変えて、ゲッタは本体の動作を変えるっていう感じ。
コード改修が多いとコードの基本的な意味を理解するのが疎かになるから、こういうことはその都度振り返って使えるようにしていきたい。

参考

PHPのアクセス修飾子: public, private, protected の使い分け(最終閲覧2020/06/10)
PHPのGetter/Setterについて本気出して考えてみた(最終閲覧2020/06/14)

basic, php

Posted by 異世界攻略班