PHPでパラメータを扱うならクラスを定義する

Code Html Computer Internet It  - RoonZ-nl / Pixabay プログラミング
RoonZ-nl / Pixabay

とても基本的なことなのにいつも迷ってしまうので、備忘録。

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の勉強には、以下の書籍がとても参考になります。

テキストよりも動画で集中して学びたい方はこちら。

Udemyホームページ

コメント

タイトルとURLをコピーしました