PHP4의 객체지향 기능의 큰 단점은 다른 데이터 유형으로 처리되어 디자인 패턴과 같은 일반적인 OOP 방법을 사용할 수 없게 됩니다. 이러한 메소드는 PHP의 기본 방식인 값보다는 객체를 다른 클래스 메소드에 대한 참조로 전달하는 방식에 의존합니다. 다행스럽게도 PHP5는 이 문제를 해결했으며 이제 모든 객체는 기본적으로 참조로 처리됩니다. 그러나 모든 개체는 값이 아닌 참조로 처리되므로 이제 개체를 복사하기가 더 어렵습니다. 참조된 개체를 복사하려고 하면 원본 개체의 주소만 가리킵니다. 복사 문제를 해결하기 위해 PHP는 복제본(메서드가 아닌 키워드) 객체를 복제하는 명시적인 방법을 제공합니다.
다음과 같이 객체 앞에 clone 키워드를 추가하여 객체를 복제할 수 있습니다.
destinationObject = clone targetObject;
객체 복제:
<?phpclass Person{ var $name; var $sex; var $age; function construct($name, $sex, $age){ $this->name = $name; $this->sex = $sex; $this->age = $age; } function say(){ echo "我的名字:" . $this->name . ",性别:" . $this->sex . ",年龄:" .$this->age . "<br />"; } }$person1 = new Person("张三三", "男", 23); $person2 = clone $person1; //使用clone关键字克隆/复制对象,创建一个对象的副本 $person3 = $person1; //这不是复制对象,而是为对象多复制出一个访问该对象的引用 $person1->say(); //调用原对象中的说话方式,打印原对象中的全部属性值 $person2->say(); //调用副本对象中的说话方式,打印克隆对象中的全部属性值 $person3->say(); //调用原对象中的说话方式,打印原对象中的全部属性值?>
위 프로그램에서는 총 2개의 객체가 생성되는데, 그 중 하나가 clone 키워드를 통해 복제된 복사본이다. 두 개체는 완전히 독립적일 수 있지만 해당 개체의 구성원과 속성 값은 완전히 동일합니다. 복제 중에 복제된 복사본 객체의 멤버 속성에 초기값을 다시 할당해야 하는 경우 클래스에 매직 메서드 "clone()"을 선언하면 됩니다. 이 메소드는 객체가 복제될 때 자동으로 호출되므로 이 메소드를 통해 복제된 복사본을 다시 초기화할 수 있습니다. clone() 메소드에는 매개변수가 필요하지 않습니다. 위 예제의 코드를 다시 작성하고 매직 메서드 clone()을 클래스에 추가하여 복사 개체의 멤버 속성을 다시 초기화합니다.
<?phpclass Person{ var $name; var $sex; var $age; function construct($name, $sex, $age){ $this->name = $name; $this->sex = $sex; $this->age = $age; } function say(){ echo "我的名字:" . $this->name . ",性别:" . $this->sex . ",年龄:" .$this->age . "<br />"; } function clone(){ $this->name = "李四四"; //为副本对象中的name属性重新赋值 $this->age = 10; //为副本对象中的age属性重新赋值 } }$person1 = new Person("张三三", "男", 23); $person2 = clone $person1; //创建一个对象的副本,并自动调用类中的clone()方法 $person1->say(); //调用原对象中的说话方式,打印原对象中的全部属性值 $person2->say(); //调用副本对象中的说话方式,打印克隆对象中的全部属性值?>
실행 결과:
我的名字:张三三,性别:男,年龄:23 我的名字:李四四,性别:男,年龄:10
클래스 객체의 경우, "cloneoperator"를 사용하면 현재 객체와 정확히 동일한 새 객체가 복사되고 이때 이 클래스의 매직 메서드인 clone()이 자동으로 호출됩니다. 클래스에 이 메서드가 있는 한).
싱글톤 클래스를 구현하려면 이 싱글톤 클래스의 개체에 대해 "복제를 비활성화"해야 합니다. PHP에서는 싱글톤 클래스 객체의 복제가 위의 싱글톤 클래스 구현 형태를 깨뜨리는 것을 방지하기 위해 일반적으로 빈 private(개인 수정) 클론을 제공합니다. ()방법.
먼저 “복제 금지” 의 효과를 살펴보겠습니다.
<?php class SingetonBasic { private static $instance; //静态变量要私有化,防止类外修改 private function construct() { //构造函数私有化,类外不能直接新建对象} // private function clone() {} //在clone()前用private修饰,用来禁止克隆 public static function getInstance() { //公共的静态方法, public——外部的接口,static——不使用对象而是通过类名访问 if (!(self::$instance instanceof self)) { //私有静态变量$instance为空 self::$instance = new self(); //新建为自身的对象,并赋值给私有变量$instance } return self::$instance; //返回私有变量$instance} }$a = SingetonBasic::getInstance();$b = SingetonBasic::getInstance(); var_dump($a === $b); //结果为:boolean true a和b指向的是同一个对象$c = clone $a; var_dump($a === $c); //结果为:boolean false a和c指向的不是同一个对象?>실행 결과는
boolean trueboolean false“복제를 금지합니다”, 위 코드의
private function clone() {} //在clone()前用private修饰,用来禁止克隆줄에서 주석 을 제거하세요. 실행 결과는
boolean trueFatal error: Call to private SingetonBasic::clone()입니다. 즉, 복제 시 clone()이 자동으로 호출되지만 메소드가 비공개로 수정되어 클래스 외부에서 직접 호출할 수 없어 오류가 발생합니다. .
위 내용은 PHP 객체 지향 - 객체 복제 clone 및 매직 메소드 __clone()에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!