ホームページ  >  記事  >  バックエンド開発  >  php オブジェクト指向のクローンとシリアル化

php オブジェクト指向のクローンとシリアル化

WBOY
WBOYオリジナル
2016-08-08 09:22:48957ブラウズ

オブジェクトのコピーには 3 つのオプションがあります:

1、直接コピー $a = $b

これは浅いコピーです。$a が変更されると、$b も変更されます。同じヒープ領域を指しています

2、clone copy $a = clone $b

このコピーは、$a が変更されると、$b は追随しません。同時に、PHP には、クローン レプリケーションをカスタマイズするためのマジック メソッド __Clone() が用意されており、コピーしたくない属性やレプリケーション プロセス中に必要な変更は __clone() メソッドでカスタマイズできます。

ただし、このコピー方法には欠陥があります。クラス内の特定の属性の型が別のクラスである場合、この属性は Clone 中にディープコピーされないことに注意してください。もちろん、この欠点は __clone() メソッドでこの属性に新しい 新しいクラス を作成するだけで補えます。

	class test{
		private $name;
		private $sex;
		private $demo;
		public function __construct($name,$sex,$demo){
			$this->name = $name;
			$this->sex  = $sex;
			$this->demo = $demo;
		}
		public function __set($key,$value){
			$this->{$key} = $value;
		}
		public function __get($key){
			return $this->{$key};
		}
		public function __clone(){
			$this->name='null';  //这里可以自定义clone
		}
	}
	class demo{
		private $name;
		public function __construct($name='demo01'){
			$this->name = $name;
		}
		
		public function __set($key,$value){
			$this->{$key} = $value;
		}
		
		public function __get($key){
			return $this->{$key};
		}
	}
	$t = new test('aa', 'bb',new demo('d01'));
	$d = clone $t;
	//$d->name='nihao';
	$d->demo->name = 'd02';
	var_dump($t);   //结果 $t->demo->name   d02

クローンを使って補ってください

		public function __clone(){
			$this->name='null';
			$this->demo = new demo('init');
		}

3、シリアル化されたコピー

$b = unserialize(serialize($t));
この方法では、クローンマジックを使用せずに属性を実装できますメソッド 参照型のディープコピーが作成されました。 以上、PHP のオブジェクト指向 Clone とシリアル化について、内容も含めて紹介しましたが、PHP チュートリアルに興味のある方の参考になれば幸いです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。