[ PHP ] オブジェクト指向デザインパターン(Prototypeパターンの実装例)

Pocket

ここでは、オブジェクト指向プログラミングのデザインパターンの1つである Prototype パターンの PHP における実装サンプルを掲載しています。

Prototype パターン

ガッツリ要約すると、Prototype パターンとは、現在のクラスインスタンスから、別のクラスインスタンスを生成するパターンです(間違いあればご指摘ください)。

スポンサーリンク

PHP による Prototype パターンの実装例

PHP における Prototype パターンの実装例は次の通りです。詳細はサンプル内のコメントを確認ください。

// 人クラス
class person
{
    protected $_name; // 名前
    protected $_age;  // 年齢

    // コンストラクタ
    public function __construct($name, $age)
    {
        $this->_name = $name;
        $this->_age  = $age;    
    }
    
    // 名前を取得
    public function getName()
    {
        return $this->_name;
    }
    
    // 年齢を取得
    public function getAge()
    {
        return $this->_age;
    }
    
    // インスタンスのコピー取得 その1
    public function getCopiedInstance()
    {
        return clone $this;
    }

    // インスタンスのコピー取得 その2
    public function getCopiedInstance2()
    {
        // 新規インスタンスを生成しリターン(属性も設定)
        return new person($this->_name, $this->_age);
    }
    
    // 外部から clone メソッドの呼び出しを禁止するために protected で修飾する
    // (今回のケースでは private でも問題なし)
    protected function __clone() { }
}

上記で示したクラスの使用例は次の通りです。コピーされたクラスのインスタンスを取得しています。

// まさおの気分は18歳 インスタンス生成
$org = new person('まさお', 18);

// インスタンスのコピーを取得 方法その1
$copied1 = $org->getCopiedInstance();

// インスタンスのコピーを取得 方法その2
$copied2 = $org->getCopiedInstance2();

Prototype パターンと呼ばれてますが、独自で実装するにしても、PHP がサポートしている __clone キーワードを使用するにしても、コピーの取得が できれば問題なしです。

__clone キーワードの注意点

なお、__clone キーワードには注意が必要です。メンバ変数がスカラ型変数ではなく、オブジェクト変数の場合は参照コピーとなってしまいます。参照コピーではなく、ディープコピーを行いたい場合は、次のリンクも確認ください。

[ PHP ] クラスのディープコピー(オブジェクト変数の参照コピーを回避する)

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *