php: シングルトンクラスを簡単に作成する方法

  • -

    シェア
  • ---

    LINEで送る
  • -

    はてなブックマーク
    ブックマーク
  • -

    pocket
  • -

    rss
他言語サイト
us us

phpのクラスを簡単にシングルトンにするtraitを作成しました。

これをuseで実装するだけでシングルトンクラスになります。

シングルトンとは何か?

シングルトンは、クラスのインスタンスを1つしか作成できないように制限することです。具体的にはクラスのインスタンス生成(new 演算子)を使えないようにします。

シングルトンはメモリの消費量を抑える目的や、プログラム内で共通データを保持したい場合などに使います。

そのクラスをシングルトンクラスにするtraitを作成しました。サンプルを見てみましょう。

  • シングルトンは作成できるインスタンスが1つ
  • メモリの消費量を抑える
  • プログラムで共通データを保持する

シングルトンクラスの作成方法

<?php
namespace Test;

trait Singleton {
    private static $instance;

    protected function __construct() {
    }

    public static function get_instance() {
        if ( empty( self::$instance ) ) {
            self::$instance = new self();
        }
        return self::$instance;
    }
}

5行目

$instanceは、traitを実装したシングルトンクラスのインスタンスを唯一保持するプロパティです。staticを付けます。

7行目

protectedにすることで、シングルトンクラスのインスタンスが生成できないようにします。これでシングルトンクラスはnew演算子を使えません。ここではprotectedを使っていますがprivateでもかまいません。

外部からnew演算子を使えないので、インスタンスを取得するメソッド(get_instance())を用意します。get_instance()はstaticです。

唯一インスタンスを参照できるのは、get_instance()をコールしたときです。このfunctionで保持しているシングルトンクラスのインスタンスを返します。

このtraitをクラスでuseすることでシングルトンクラスにします。クラスをシングルトンクラスにする方法は次の通りです。

<?php
namespace Test\Classes

use Test\Singleton

class Sample {
    use Singleton;

    ....
}
traitの使い方はphpの公式ドキュメントに詳しく書いてあります。
trait
use

Sample::get_instance()でシングルトンクラスのインスタンスを取得します。

シングルトンの機能をtraitに収めることで簡単にシングルトンクラスをいくつでも作成することができます。

おまけ

スーパークラスでシングルトンの機能を実装すればtraitじゃなくてもいいじゃないか?と思われるかもしれません。

しかし、スーパークラスではシングルトンの機能を実装することはできません。new self は、スーパークラスのインスタンスであって子クラスのインスタンスではないからです。

また、今回のtraitを実装したシングルトンクラスを継承した子クラスは、シングルトンにはなりません。理由は同じです。

今回の方法ではシングルトンクラスに必ずtraitをuseする必要があります。

他にもいい方法があるような気がしているのですが、説明できるほどの内容は今のところこれがベストです。また、いい方法が思いついたら内容を更新します。

 

最近Webカテゴリでよく読まれている記事です。
post-cta-image
blog image

ドメイン取得の意味が分からない人へ。王道の方法を紹介します。

ドメインの登録業者を選ぶのに悩む必要はないです。サイトを簡単に早く公開するには全くいらないことで、むしろ邪魔です。『お名前.com』というサービスは必ず耳にします。そのお名前.comのメリットとデメリットと一緒に、ドメインの意味が分からない人が一番失敗しないドメインの取得方法を紹介します。

tadtadya.com

_

SNSでも記事を配信しています。
コメントを残す

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

この記事を気に入ったらぜひシェアも!!