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

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

WBOY
풀어 주다: 2023-04-10 18:24:02
원래의
3219명이 탐색했습니다.

이전 글에서는 "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="max-width:90%">__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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿