>  기사  >  백엔드 개발  >  PHP에서 clone 키워드와 __clone() 메소드 사용(자세한 예)

PHP에서 clone 키워드와 __clone() 메소드 사용(자세한 예)

WBOY
WBOY원래의
2021-10-25 16:33:573176검색

이전 글에서는 "PHP에서 네임스페이스의 정의와 사용법(상세 예시)"을 가져왔는데, 이번 글에서는 계속해서 PHP에서 네임스페이스의 정의와 사용법을 자세히 소개하겠습니다. clone 키워드 사용에 관한 PHP입니다. 모두에게 도움이 되기를 바랍니다!

PHP에서 clone 키워드와 __clone() 메소드 사용(자세한 예)

이전 연구에서는 $this, $new 등과 같은 많은 키워드가 있었습니다. 오늘은 PHP에서 계속해서 살펴보겠습니다. code>clone도 비교적 일반적으로 사용되는 키워드입니다. clone 키워드를 배우기 전에, PHP의 객체 모델이 객체를 참조로 호출한다는 것을 알아야 하지만, 객체의 복사본도 생성해야 합니다. 목적은 원본 객체가 변경될 때 객체 복사본에 영향을 주지 않는 것입니다.
$this$new之类的,今天我们继续来看一下在PHP中也算比较常用到的关键字clone克隆关键字。在学习克隆关键字之前,我们需要知道PHP中的对象模型是通过引用来调用对象的,但是又是偶需要建议一个对象的副本,目的就是想再原有对象改变的时候能够不影响到对象副本。

这时候如果使用new关键字是可以重新创建对象,然后再给属性赋上相同的值,也是可以起到新建副本的作用,但是这种方法不仅麻烦而且容易出错,这时候就希望PHP能有一个完全一样的对象,而且这两个还不是互相干扰的,也就是我们想的克隆。那应该怎样去实现呢?不慌,接着看。

<strong><span style="font-size: 20px;">clone</span></strong>关键字

我们希望有一个能够和原本对象互不干扰的副本,在PHP中通过clone关键字就可以实现克隆对象了。

clone关键字的语法格式如下:

克隆对象名称 = clone 原对象名称;

你可以把克隆这个动作理解为,把对象的内存区域进行复制,赋值后的对象与原对象之间是相互独立的。并且他们之间的成员方法、属性和值都是完全相同的。

接下来我们通过一个简单的实例来看一下clone的能力吧,示例如下:

<?php
    class father{
        public $study1, $study2;
        public function __construct($study1, $study2){
            $this -> study1 = $study1;
            $this -> study2 = $study2;
        }
        public function output(){
            echo $this -> study1.&#39;,&#39;. $this -> study2.&#39;<br>&#39;;
        }
    }
    $obj  = new father(&#39;好好学习&#39;, &#39;天天向上&#39;);
    $obj2 = clone $obj;//克隆$obj
    $obj  -> output();
    $obj2 -> output();
    echo &#39;<pre class="brush:php;toolbar:false">&#39;;
    var_dump($obj);
    var_dump($obj2);
?>

输出结果:

PHP에서 clone 키워드와 __clone() 메소드 사용(자세한 예)

其中我们需要注意的是,如果使用=将一个对象赋值给一个变量,那么这时得到的将是一个对象的引用,通过这个变量更改属性的值将会影响原来的对象。所以还是得用clone,更改属性值不会影响到原来的对象。

通过上述实例,我们已经知道应该如何去克隆一个对象来为我们所用了,但是对象克隆成功后,他的属性、成员方法以及值都是和原对象一模一样完全相同的,那这时候我们光说更改属性不会影响到原来的对象,但是应该怎样去给克隆后的副本成员属性重新赋值呢?这时候我们就要用到PHP魔术方法中的__clone()方法。

<strong><span style="font-size: 20px;">__clone()</span></strong>方法

PHP中__clone()方法是不能够直接调用的,有clone才有__clone(),只有通过clone关键字克隆了一个对象的时候,才能够通过这个克隆出来的对象来调用__clone()方法。

这时候再用到clone创建副本的时候,就需要注意了,PHP会检查__clone()是否存在。

要是不存在的话,PHP会默认赋值对象的全部属性;如果__clone()存在,也就是定义过了,那么也就会负责了新对象的属性。

加下来我们通过一个实例来看一下,实例如下:

<?php
    class father{
        public $name, $url;
        public function __construct($name, $url){
            $this -> name = $name;
            $this -> url  = $url;
        }
        public function output(){
            echo $this -> name.&#39;,&#39;.$this -> url.&#39;<br>&#39;;
        }
        public function __clone(){//通过__clone()来更改新对象的属性
            $this -> name = &#39;福如东海&#39;;
            $this -> url  = &#39;寿比南山&#39;;
        }
    }
    $obj  = new father(&#39;好好学习&#39;, &#39;天天向上&#39;);
    $obj2 = clone $obj;
    $obj  -> output();
    $obj2 -> output();
?>

输出结果:

PHP에서 clone 키워드와 __clone() 메소드 사용(자세한 예)

由上述实例,可以看出__clone() 方法不需要任何参数。其中我们还有一点可以知道的就是,想要禁止克隆的话,只需要在类中设置一个空的,访问权限为 private(私有的)的 __clone()

이때 new 키워드를 사용하면 객체를 다시 생성한 후 속성에 동일한 값을 할당할 수 있는데, 이는 새로운 복사본을 생성하는 역할도 할 수 있습니다. 메소드는 번거로울 뿐만 아니라 오류가 발생하기 쉽습니다. 우리는 PHP가 동일한 객체를 가질 수 있고 두 객체가 서로 간섭하지 않기를 바랄 뿐입니다. 이것이 바로 우리가 복제본이라고 생각하는 것입니다. 이를 어떻게 달성해야 합니까? 당황하지 말고 계속 지켜보세요.

<strong><span style="font-size: 20px;">복제</span></strong> 키워드

원본 객체를 방해하지 않는 복사본이 있기를 바랍니다. PHP에서는 clone 키워드를 통해 객체를 복제할 수 있습니다. 🎜🎜clone 키워드의 구문 형식은 다음과 같습니다. 🎜rrreee🎜복제 작업은 개체의 메모리 영역을 복사하는 것으로 이해하면 할당된 개체는 원본 개체와 독립적입니다. . 그리고 그 사이의 멤버 메소드, 속성, 값은 완전히 동일합니다.
🎜🎜다음으로 간단한 예시를 통해 clone의 기능을 살펴보겠습니다. 🎜rrreee🎜출력 결과:
🎜🎜PHP에서 clone 키워드와 __clone() 메소드 사용(자세한 예)🎜🎜주의해야 할 것은 다음과 같습니다. 객체를 변수에 할당하면 이때 얻는 것은 객체에 대한 참조가 됩니다. 이 변수를 통해 속성 값을 변경하면 원래 객체에 영향을 미칩니다. 따라서 여전히 복제를 사용해야 하며 속성 값을 변경해도 원본 객체에는 영향을 미치지 않습니다. 🎜🎜위의 예를 통해 우리는 객체를 복제하여 사용하는 방법을 이미 알고 있습니다. 그러나 객체가 성공적으로 복제된 후에는 해당 속성, 멤버 메서드 및 값이 원본 객체와 정확히 동일합니다. 시간, 우리는 단지 속성을 변경해도 원본 객체에는 영향을 미치지 않는다고 하는데 복제된 복사본 구성원의 속성을 어떻게 다시 할당해야 할까요? 이번에는 PHP 매직 메소드에서 __clone() 메소드를 사용하겠습니다.
🎜🎜<strong><span style="max-width:90%">__clone()</span></strong>메서드🎜🎜PHP의 __clone() 메서드는 직접 호출할 수 없습니다. clone __clone(), clone 키워드를 통해 객체가 복제된 경우에만 복제된 객체를 통해 __clone() 메서드를 호출할 수 있습니다.
🎜🎜이때 clone을 사용하여 복사본을 생성할 때 PHP는 __clone()이 존재하는지 확인해야 합니다. 🎜🎜존재하지 않으면 PHP는 기본적으로 객체의 모든 속성을 할당합니다. __clone()이 존재하면 즉, 정의된 경우 새 객체의 속성도 담당합니다. 🎜🎜예제를 통해 살펴보겠습니다. 🎜rrreee🎜출력 결과:
🎜🎜PHP에서 clone 키워드와 __clone() 메소드 사용(자세한 예)🎜🎜위의 예에서 __clone() 메서드에는 매개 변수가 필요하지 않음을 알 수 있습니다. 우리가 알 수 있는 또 다른 사실은 복제를 비활성화하려면 액세스 권한이 private(비공개)인 클래스에 빈 __clone() 만 설정하면 된다는 것입니다. code> 메소드를 사용하면 복제 금지 목적을 달성할 수 있습니다. 🎜🎜관심이 있으시면 "🎜PHP 비디오 튜토리얼🎜"을 클릭하여 PHP 지식에 대해 자세히 알아볼 수 있습니다. 🎜

위 내용은 PHP에서 clone 키워드와 __clone() 메소드 사용(자세한 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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