>  기사  >  백엔드 개발  >  PHP 객체 지향 - 객체 복제 clone 및 매직 메소드 __clone()에 대한 자세한 설명

PHP 객체 지향 - 객체 복제 clone 및 매직 메소드 __clone()에 대한 자세한 설명

黄舟
黄舟원래의
2017-03-25 10:15:201638검색

1.객체clone

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()

위 프로그램에서는 총 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

3. 싱글톤 클래스 강화: 복제 금지

클래스 객체의 경우, "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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.