PHP7.4.1におけるゲッターとセッターについて。
declare(strict_types=1);
class Class1 { //Class1という名前のクラスを定義
public string $ca; //str型のプロパティcaの定義
private int $cb; //int型のプロパティcbの定義
//コンストラクター
public function __construct(string $ca, int $cb = 0) { //publicと__constructは固定
$this->ca = $ca; //インスタンス化したときのパラメータ1を$caに代入
$this->cb = $cb; //インスタンス化したときのパラメータ2を$cbに代入
//$cbプロパティへのアクセス(セッター)
public function setCb1(int $cb) {
if ($cb <= 0) {
return false; //もし引数に0以下の値がきたらその命令は無視する
}
$this->cb = $cb; //setCb1の引数を$cbプロパティに代入
return true; //いらないけどいる記述
}
//$cbプロパティの値をnumber_formatで処理して返す(ゲッター)
public function getCb1() { //パラメータなし
return number_format($this->cb); //cbの値をnumber_formatで処理して返す
}
//$cbプロパティの値をnumber_formatで処理して返す(ゲッター)
public function getCb2(string $cba = '円') { //パラメータとデフォルト引数あり
return number_format($this->cb) . $cba; //cbを関数で処理した値に$cbaを連結して返す
}
}
$ca = new Class1('グラタン', 1100); //class1クラスのインスタンスを作成
//$ca->ca = 'グラタン:'; //コンストラクターのパラメータがあるので不要
//$ca->cb = 1100; //privateなので$cbにアクセスできない(Uncaught Error)
$ca->setCb1(1180); //メソッドを通して$cbにアクセス
//echo $ca->ca, $ca->cb, "円\n"; //privateなので$cbにアクセスできない(Uncaught Error)
echo $ca->ca, $ca->getCb1(), "円\n"; //グラタン:1,100円
$cb = new Class1('ピザ', 1400); //class1クラスのインスタンスを作成
//$cb->ca = 'ピザ:'; //コンストラクターのパラメータがあるので不要
//$cb->cb = 1400; //privateなので$cbにアクセスできない(Uncaught Error)
//echo $cb->ca, $cb->cb, "円\n"; //privateなので$cbにアクセスできない(Uncaught Error)
echo $cb->ca, $cb->getCb2(), "\n"; //ピザ:1,200円
echo $cb->ca, $cb->getCb2('ドル'); //ピザ:1,200ドル
クラスを定義するということは、プロパティとメソッドを定義するということです。
そしてプロパティとメソッドにはアクセス修飾子というものがありますが、プロパティにおいては、このアクセス修飾子がpublicの状態というのはあまり好ましくないようです。
なので通常のクラス宣言においては、プロパティのアクセス修飾子はprotectedやprivateを使うことがほとんどのようです。
しかしこの2つのアクセス修飾子では、publicのときのように安易に $aa->ab = 123; みたいな感じで値を代入することができなくなってしまいます。
もちろんこの状況では、echo $aa->ab; みたいな感じでプロパティの値を取得することもできません。
ではどうやってプロパティにアクセスするのかというと、ここで使うのがセッターとゲッターという2種類のメソッドです。
セッターは、プロパティに値を代入するためのメソッドです。
上記スクリプトのようにプロパティに引数を代入するメソッドを定義してやって、そのメソッドを呼び出してプロパティにアクセスするのが推奨される手順のようです。
ゲッターは、プロパティの値を取得するためのメソッドです。
上記スクリプトのようにプロパティの値を返すメソッドを定義してやって、そのメソッドを呼び出してプロパティの値を取得することが推奨される手順らしいです。
ですから、protectedやprivateを使って宣言したプロパティにアクセスするときは、セッターとゲッターを定義していないと、そのプロパティに値を代入することも値を取得することもできません。
PHPのプロパティは、通常はこのようなセッターおよびゲッターを介さないとアクセスできない状態にしておくことが好ましいとされています。
あとこれは余談ですが、ゲッターもセッターもPSRのコーディング規約ではcamelCase記法が推奨されています。
つまり2つ以上の単語であり、単語間の空白はなしであり、なおかつ2つ目以降の単語の頭文字を大文字にする表記法が好ましいとされているようです。
例:getCb1 → 〇
例:get Cb1 → ×
例:getcb1 → ×
以上です。