PHP オブジェクト指向プログラミングでは、オブジェクトを作成するために使用される従来のコンストラクター (__construct) に加えて、「マジック関数」と呼ばれるオブジェクト操作のための特別な関数も多数あります。その中でも非常に重要なマジック関数が __clone() です。この記事では、これについて説明します。
1. __clone() とは
#__clone() は、オブジェクトがコピーされるときに呼び出される PHP の特別な関数です。その機能はオブジェクトの複製、つまりオブジェクトを別の新しいオブジェクトにコピーすることと同等です。
__clone() 関数を使用するときは、いくつかの点に注意する必要があります。
__clone() 関数はパブリック型として定義する必要があります。そうしないと、クローン操作が実行されません。失敗。 - __clone() で割り当てられる属性は、元の値ではなく、新しい値である必要があります。そうしないと、元のオブジェクトが変更されます。
- 一部のクローン作成ロジックは __clone() 関数で処理できます。
-
以下は __clone() 関数を示す例です:
class MyClass{
public $name;
public $age;
public function __clone(){
$this->age = 30;
}
}
$obj1 = new MyClass();
$obj1->name = '小明';
$obj1->age = 20;
$obj2 = clone $obj1;
echo $obj1->name,$obj1->age."<br>"; //输出:小明20
echo $obj2->name,$obj2->age; //输出:小明30
ログイン後にコピー
上記のコードからわかるように、名前と年齢を含む MyClass クラスを定義しました。属性。 __clone() 関数では、$age 属性を 30 に設定します。 MyClass クラスをインスタンス化するオブジェクト $obj1 では、$name を「Xiao Ming」に、$age を 20 に設定します。クローン操作を通じて新しいオブジェクト $obj2 を作成すると、$name と $age の値が新しいオブジェクトにコピーされます。ただし、$age のクローン関数で値を再割り当てしたため、$obj2 オブジェクトの $age の値は 30 になります。
2. __clone() の使用シナリオ
__clone() の使用シナリオは比較的特殊であり、実際の状況に基づいて判断する必要があります。
オブジェクトのクローン作成
オブジェクトのクローンを作成するのは、通常、特定の操作中に元のオブジェクトが変更されることを避けるためです。コピーできない一部のオブジェクトについては、クローン作成操作を使用すると新しいオブジェクトを作成できます。 __clone() 関数を使用してオブジェクトの複製操作を処理するのが一般的な方法です。以下に示すように:
class Person{
public $name;
public $age;
public $class;
public function __clone(){
$this->class = clone $this->class;
}
}
class ClassRoom{
public $name;
public $roomNo;
}
$classObj = new ClassRoom();
$classObj->name = '一班';
$classObj->roomNo = 101;
$person1 = new Person();
$person1->name = '张三';
$person1->age = 18;
$person1->class = $classObj;
$person2 = clone $person1;
$person2->name = '李四';
$person2->age = 20;
$person2->class->name = '二班';
print_r($person1); //输出Person对象信息
print_r($person2); //输出Person对象信息
ログイン後にコピー
この例では、Person クラスと ClassRoom クラスの 2 つのクラスを定義します。 Person クラスには、$name、$age、$class の 3 つの属性が含まれています。このうち $name 属性と $age 属性は比較的単純で、$class は ClassRoom クラスからインスタンス化されたオブジェクトです。 Person クラスの __clone() 関数では、$person1 オブジェクトと $person2 オブジェクトの $class 属性が相互に干渉せずに異なるオブジェクトを指すように、$class 属性のクローンを作成します。
オブジェクトのコピー
開発では、元のオブジェクトの値に影響を与えずに操作中にオブジェクトを変更するために、オブジェクトをコピーする必要がある場合があります。 __clone() 関数を使用してオブジェクトのコピー操作を処理すると、開発がより迅速かつ便利になります。以下に示すように:
class Data{
public $data = [];
public function __clone(){
$this->data = [];
}
}
$data1 = new Data();
$data1->data = [1,2,3];
$data2 = clone $data1;
array_push($data2->data,4);
echo implode(',',$data1->data)."<br>"; //输出:1,2,3
echo implode(',',$data2->data)."<br>"; //输出:1,2,3,4
ログイン後にコピー
この例では、$data 属性を含む Data クラスを定義します。 $data1 オブジェクトをインスタンス化した後、$data 属性を [1,2,3] に設定します。クローン操作により、$data2 オブジェクトを取得し、$data2 属性に 4 を追加しました。 __clone() 関数で $data 属性を空の配列に設定したため、複製された $data2 オブジェクトは $data1 の $data 属性とは何の関係もなくなり、2 つの異なる配列になります。
3. 概要
__clone() 関数は PHP の重要な関数であり、オブジェクトのクローン作成やオブジェクトのコピーによく使用されます。これを使用するには、クローン オブジェクトが実際に新しいオブジェクトであることを確認するために、クローン オブジェクトのロジックと属性のコピーに注意する必要があります。開発中にオブジェクトのクローンを作成またはコピーする必要がある場合、__clone() 関数を使用すると開発効率が大幅に向上します。
以上がPHP マジック関数の探索: __clone()の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。