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