LoginSignup
3
2

More than 5 years have passed since last update.

static なメソッドはいつ使うのか

Posted at

https://qiita.com/ndxbn/items/4997d1e9400c03f6ea59 を編集しようと思ったのだけれど、422 になって更新できなかったので、新しく投稿し直すことにした。

発端

(過去の自分が書いた)神クラス化したUtilityクラスとか見てイラっ☆としたので、ベタープラクティス的なやつをまとめようかなって気持ちになった。
名前空間を切って普通に関数作れば良いので、ユーティリティクラスはアンチパターン。

static なメソッドを使うパターン

そのクラスの「特定のインスタンス」が欲しいとき(Factory パターン系)

実装例

こんな感じのDBから、IDが欲しい。
ただし、1期間に同時開催されるのは1つまで。
INSERTするときに重複チェックをしている。

CREATE TABLE event_master(
    id INT NOT NULL AUTO INCREMENT PRIMARY KEY,
    start DATE,
    end DATE
);

アプリケーション側では、こう使う。
この時の、php public static function current() が、staticなメソッドの使いどきの例。

<?php
/**
 * イベントは、同時に1つまで開催可能。
 * DBにINSERTするときに、期間で重複がないかをチェックされる。
 * 
 */
class EventId
{
    /**
     * @var int id
     */
    private $id;
    public function __construct(int $id)
    {
        $this->id = $id;
    }

    /**
     * 現在実施中のイベントのIDを取得する
     * @return EventId
     */
    public static function current()
    {
        // 現在のゲームIDを特定する処理を書く
        // 大抵、DBとかから検索するよな。
        $dbh = (new DatabaseHandler)->get();
        $now = $date('Y-m-d h:i:s');
        $rows = $dbh->select(
            'SELECT * FROM evemnt_master
            WHERE start < ? AND ? < end
            ',
            [$now, $now]
        );
        return new self($rows[0]['id']);
    }
}
3
2
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
2