PHPオブジェクト向けプログラミングオブジェクトクローンcloneとマジックメソッド_clone()用法分析

4406 ワード

この例では、PHPがオブジェクト向けプログラム設計のオブジェクトクローンcloneとマジックメソッドについて説明します.clone()の使い方.皆さんの参考にしてください.具体的には以下の通りです.
1.オブジェクトクローンclone
PHP 4のオブジェクト向け機能の大きな欠点は、オブジェクトを別のデータ型と見なすことであり、設計モードなど、多くの一般的なOOPメソッドが使用できないことである.これらのメソッドは、オブジェクトを参照として他のクラスメソッドに渡すことに依存し、値として渡すのではなく、値によって渡すのがPHPのデフォルトの方法です.幸いなことに、PHP 5はこの問題を解決し、現在はすべてのオブジェクトがデフォルトで参照されています.ただし、すべてのオブジェクトは値ではなく参照として扱われるため、オブジェクトのコピーが難しくなりました.参照されたオブジェクトをコピーしようとすると、元のオブジェクトのアドレス位置のみが表示されます.レプリケーションの問題を解決するために、PHPはクローンclone(キーワード、メソッドではない)オブジェクトの明示的な方法を提供する.
オブジェクトの前にcloneキーワードを付けて、以下のようにオブジェクトをクローンできます.

destinationObject = clone targetObject;


クローンオブジェクト:

name = $name;
    $this->sex = $sex;
    $this->age = $age;
  }
  function say(){
    echo "    :" . $this->name . ",  :" . $this->sex . ",  :" .$this->age . "
"; } } $person1 = new Person(" ", " ", 23); $person2 = clone $person1; // clone / , $person3 = $person1; // , $person1->say(); // , $person2->say(); // , $person3->say(); // , ?>

2.マジックメソッド_clone()
上記のプログラムでは、2つのオブジェクトが作成されており、そのうちの1つはcloneキーワードでクローンされたコピーです.2つのオブジェクトは完全に独立していますが、メンバーと属性の値は完全に同じです.クローンされたレプリカオブジェクトをクローン時にメンバー属性に初期値を再付与する必要がある場合は、クラスにマジックメソッド「_clone()」を宣言できます.このメソッドは、オブジェクトのクローン時に自動的に呼び出されるので、クローン後のコピーを再初期化できます.__clone()メソッドにはパラメータは一切必要ありません.前例のコードを書き換え、クラスにマジックメソッドを追加__clone()コピーオブジェクトのメンバー属性を再初期化します.

name = $name;
    $this->sex = $sex;
    $this->age = $age;
  }
  function say(){
    echo "    :" . $this->name . ",  :" . $this->sex . ",  :" .$this->age . "
"; } function __clone(){ $this->name = " "; // name $this->age = 10; // age } } $person1 = new Person(" ", " ", 23); $person2 = clone $person1; // , __clone() $person1->say(); // , $person2->say(); // , ?>

実行結果:
私の名前:張三三、性別:男、年齢:23私の名前:李四四、性別:男、年齢:10
3.単一クラスの強化:クローンの禁止
クラスのオブジェクトについて、「clone演算子」を使用すると、現在のオブジェクトとまったく同じ新しいオブジェクトがコピーされ、そのクラスのマジックメソッドが自動的に呼び出されます.__clone()(クラスにメソッドがある限り).
単一クラスを実装するには、この単一クラスのオブジェクトを「クローン禁止」する必要があります.PHPでは、一例クラスオブジェクトのクローンによる一例クラスの上記の実装形態の打破を防止するために、通常、空のプライベート(private修飾)__clone()方法を提供する.
まず、[クローンを作成していません]の効果を見てみましょう.




実行結果は
boolean true
boolean false
我々は「クローン禁止」処理を行い、上のコードの

private function __clone() {}  // __clone()  private  ,      


この行のコードはコメントを削除します.
実行結果は
boolean true
Fatal error: Call to private SingetonBasic::__clone()
すなわち,クローン化の際には自動的に呼び出された__clone()が,この方法はprivateに修飾され,クラスの外部から直接呼び出すことができず,結果としてエラーが報告される.
PHPについてもっと兴味のある読者は、「phpオブジェクト向けプログラミング入門チュートリアル」、「PHP配列(Array)操作テクニック大全」、「PHP基本文法入門チュートリアル」、「PHP演算と演算子用法総括」、「php文字列(string)用法総括」、「php+mysqlデータベース操作入門チュートリアル」および「php一般データベース操作テクニック要約」
ここで述べたことが皆さんのPHPプログラム設計に役立つことを願っています.