5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHPでのstaticなメソッドの使いどき

Last updated at Posted at 2016-05-23

概要

(過去の自分が書いた)神クラス化したUtilityクラスとか見てイラっ☆とした。

個人的には、PHPでユーティリティクラスを作るくらいなら、普通に関数作れって感じする。 関数名の衝突が怖いのなら、名前空間を使えば良いでしょう。ユーティリティクラスが必要になるのは、完全にオブジェクト指向だけで関数宣言ができない言語くらいだと思います。

例で使うテーブル構造

どのようなときに使うかの例を示すのに、PHPでコードを書く。その時に使うテーブル構造を、先に示しておきます。

  • イベントの開催期間のマスタデータを保存する。
  • 1期間に同時開催されるのは1つまで。
  • INSERTするときに重複チェックをしている。(当然、同一トランザクションで。)

まぁ、実務だと先々仕様変更するかもしれないから、テーブルはこんなもんでしょう。

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

特定の状態で初期化された、そのクラス自身の「インスタンス」が欲しいとき

インスタンスを作りたい時に、前提となる情報を特定できない場合とかありますよね。
例えば、上記のDBから、"現在開催中の"「イベントID」のインスタンスがほしい場合とか。そういうときに使うといいんじゃないかと思います。

event_idのクラス

<?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を特定する処理を書く
        $dbh = DatabaseHandlerFactory->getInstance()->getHandler();
        $now = $date('Y-m-d h:i:s');
        $rows = $dbh->select(
            'SELECT * FROM event_master
            WHERE start < ? AND ? < end
            ',
            [$now, $now]
        );
        return new self($rows[0]['id']);
    }
}

ちなみに、(Abstract Factoryパターンな)EventIdManagerがいれば、そっちに問い合わせてもいいやつです。

Singletonのget_instanceメソッド

言うまでもないですね。
Singletonを乱用されても困るので、Singletonパターンはどのようなときに使うのか?を見てほしいです。

他なんかあったら、追記します。

5
5
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
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?