とても基本的なことなのにいつも迷ってしまうので、備忘録。
parameterの間違った扱い方
いつもの流れでは、面倒なのでできる限り簡単にやりたいと思う。phpには何でも屋的な配列さんがいるので、取り敢えず配列に入れてしまう。
配列に格納してしまう
$properties = ['id' => 1];
echo $properties['id']; // 1
1箇所でだけ使うのならこれでも良いかもしれない。
しかし、同じものを2箇所以上で使うようになると、後々絶対に後悔する。名前も持たせようとか、段々と中身が膨らんでしまい、やがては膨張した訳のわからない配列になってしまう。
なのでせめて名前をつけようとクラスにする。getter/setterなどは面倒なのでできるだけ簡潔にしてみる。
getter/setterの無い簡単なクラスに格納してしまう
class DynamicProperty
{
private $properties = [];
public function prop($key, $value=null)
{
if (func_num_args() <= 1) {
return $this->properties[$key] ?? null;
}
$this->properties[$key] = $value;
return $this;
}
}
$pp = new DynamicProperty();
echo $pp->prop('id', 1)->prop('id'); // 1
しかしこれではどんなプロパティでも設定できてしまい、結局配列と変わらない。やはり名前が付いているだけ。
設定できるkeyを定義して、それ以外を設定しようとしてもエラーにして…などと考え始めると地獄。絶対にやってはいけない。
そういえば、PHPにはgetter/setterの代わりにマジックメソッドがある。一応こちらを使うとこうなる。
マジックメソッドを使ったクラスに格納してしまう
class DynamicProperty
{
private $properties = [];
public function __set($key, $value)
{
$this->properties[$key] = $value;
}
public function __get($key)
{
return $this->properties[$key] ?? null;
}
}
$pp = new DynamicProperty();
$pp->id = 1;
echo $pp->id; // 1
PHP的には正しいけど、メソッドチェーンが使えなくなった。まあいい、結局このやり方ではダメなので。
parameterの正しい扱い方
楽をしようとすると逆に苦労することになる。結局きちんと使うプロパティを定義することにする。
役割を固定しセッターを無くしたクラスに格納する
class HogeProperty
{
private $id = 1;
public function __construct(int $id)
{
if ($id <= 0) {
throw new Exception('invalid id');
}
$this->id = $id;
}
public function getId(): int
{
return $this->id;
}
}
$pp = new HogeProperty(1);
echo $pp->getId(); // 1
きちんとプロパティとして、名前をつけて定義する。
セッターは後から値を変えてしまいバグの元になる。プロパティの値はコンストラクタの引数にして、後から変更させないようにする。と、バリデーションもコンストラクタで定義できてシンプルになる。
一番面倒で地味な方法が、結局は楽でわかりやすいということになる。
まとめ
ある程度役割があるまとまったパラメータができた時点で、クラスとそのプロパティをきちんと定義する。面倒くさがってはいけない。
PHPの勉強には、以下の書籍がとても参考になります。
詳細 : 著者: 小川 雄大 / 出版社: 技術評論社 / ページ数: 592ページ / 発売日: 2010/11/12
テキストよりも動画で集中して学びたい方はこちら。
コメント