ここでは、オブジェクト指向プログラミングのデザインパターンの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 キーワードには注意が必要です。メンバ変数がスカラ型変数ではなく、オブジェクト変数の場合は参照コピーとなってしまいます。参照コピーではなく、ディープコピーを行いたい場合は、次のリンクも確認ください。