目录
PHP面向对象之克隆
首页 后端开发 php教程 PHP面向对象之克隆_PHP教程

PHP面向对象之克隆_PHP教程

Jul 13, 2016 am 10:01 AM
对象

PHP面向对象之克隆

php4面向对象最大的缺点之一,是将对象视为另一种数据类型,这使得很多常见的OOP方法无法使用,如设计模式。这些OOP方法依赖于将对象作为引用传递给其他的类的方法,而不是作为值传递。幸好PHP解决了这个问题。现在所有对象在默认情况下都被视为引用。但是因为所有对象对被视为引用而不是值,所以现在复制对象显得更难了。如果尝试复制一个对象,这是会指向原对象的地址。为了解决复制问题,PHP提供了一种克隆显示对象的方法。

实例如下:

首先介绍使用clone关键字克隆对象:

 

<!--?php
    class TestClone
    {
    	public  $name;
    	public $num;
    	
    	function setName($na)
    	{
    		$this--->name = $na;
    	}
    	
    	function getName()
    	{
    		return $this->name;
    	}
    	
    	function setNum($nu)
    	{
    		$this->num = $nu;
    	}
    	function getNum()
    	{
    		return $this->num;
    	}
    }
    
    $test = new TestClone();
    $test->setName("tianxin");
    $test->setNum(123456);
    echo $test->getName();
    echo $test->getNum()."
";
    
    $test2 = clone $test;
    $test2->setName("liwei");
    echo $test->getName();
    echo $test->getNum()."
";
    
    echo $test2->getName();
    echo $test2->getNum();
    
?>
登录后复制
运行结果:

tian123456
tian123456
xia123456
登录后复制

从运行结果中我们看到,如果test2不对name进行修改。test与test2这两个对象的虽然是不同的对象但是却有相同的属性,而且改变test2对象的属性并不会影响test对象的属性,因此可以断定克隆是传值,而不是简单的引用。

PHP5定义了一个特殊的方法名“__clone()”方法,是在对象克隆时自动调用的方法,用“__clone()”方法将建立一个与原对象拥有相同属性和方法的对象,如果想在克隆后改变原对象的内容,需要在__clone()中重写原本的属性和方法, ”__clone()”方法可以没有参数,它自动包含$this和$that两个指针,$this指向复本,而$that指向原本

<!--?php
    class TestClone
    {
    	public  $name;
    	public $num;
    	
    	function setName($na)
    	{
    		$this--->name = $na;
    	}
    	
    	function getName()
    	{
    		return $this->name;
    	}
    	
    	function setNum($nu)
    	{
    		$this->num = $nu;
    	}
    	function getNum()
    	{
    		return $this->num;
    	}
    	
    	function __clone()
    	{
    		$this->name = "huang";
    	}
    }
    
    $test = new TestClone();
    $test->setName("tian");
    $test->setNum(123456);
    echo $test->getName();
    echo $test->getNum()."
";
    
    $test2 = clone $test;
//     $test2->setName("xia");
    echo $test->getName();
    echo $test->getNum()."
";
    
    echo $test2->getName();
    echo $test2->getNum();
    
?>
登录后复制

运行结果:

tian123456
tian123456
huang123456
登录后复制

<!--?php
class Person {
    // 下面是人的成员属性
    var $name; // 人的名字
    var $sex; // 人的性别
    var $age; // 人的年龄
              // 定义一个构造方法参数为属性姓名$name、性别$sex 和年龄$age 进行赋值
              // function __construct($name="", $sex="",$age="")
    function __construct($name, $sex, $age) {
        $this--->name = $name;
        $this->sex = $sex;
        $this->age = $age;
    }
    // 这个人可以说话的方法, 说出自己的属性
    function say() {
        echo "我的名字叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this
        ->age . "
";
    }
    // 对象克隆时自动调用的方法, 如果想在克隆后改变原对象的内容,需要在__clone()中重写原来的属性和方法。
    function __clone() {
        // $this 指的复本p2, 而$that 是指向原本p1,这样就在本方法里,改变了复本的属性。
        $this->name = "我是复制的张三$that->name";
        // $this->age = 30;
    }
}
$p1 = new Person ( "张三", "男", 20 );
$p2 = clone $p1;
$p1->say ();
$p2->say ();
?>
登录后复制

运行后的结果:

我的名字叫:张三 性别:男 我的年龄是:20
我的名字叫:我是复制的张三 性别:男 我的年龄是:20
登录后复制

 

 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/972221.htmlTechArticlePHP面向对象之克隆 php4面向对象最大的缺点之一,是将对象视为另一种数据类型,这使得很多常见的OOP方法无法使用,如设计模式。这些O...
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

使用PHP的json_encode()函数将数组或对象转换为JSON字符串 使用PHP的json_encode()函数将数组或对象转换为JSON字符串 Nov 03, 2023 pm 03:30 PM

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,已经成为Web应用程序之间数据交换的常用格式。PHP的json_encode()函数可以将数组或对象转换为JSON字符串。本文将介绍如何使用PHP的json_encode()函数,包括语法、参数、返回值以及具体的示例。语法json_encode()函数的语法如下:st

源码探秘:Python 中对象是如何被调用的? 源码探秘:Python 中对象是如何被调用的? May 11, 2023 am 11:46 AM

楔子我们知道对象被创建,主要有两种方式,一种是通过Python/CAPI,另一种是通过调用类型对象。对于内置类型的实例对象而言,这两种方式都是支持的,比如列表,我们即可以通过[]创建,也可以通过list(),前者是Python/CAPI,后者是调用类型对象。但对于自定义类的实例对象而言,我们只能通过调用类型对象的方式来创建。而一个对象如果可以被调用,那么这个对象就是callable,否则就不是callable。而决定一个对象是不是callable,就取决于其对应的类型对象中是否定义了某个方法。如

PHP中的Request对象是什么? PHP中的Request对象是什么? Feb 27, 2024 pm 09:06 PM

PHP中的Request对象是用于处理客户端发送到服务器的HTTP请求的对象。通过Request对象,我们可以获取客户端的请求信息,比如请求方法、请求头信息、请求参数等,从而实现对请求的处理和响应。在PHP中,可以使用$_REQUEST、$_GET、$_POST等全局变量来获取请求的信息,但是这些变量并不是对象,而是数组。为了更加灵活和方便地处理请求信息,可

如何将 MySQL 查询结果数组转换为对象? 如何将 MySQL 查询结果数组转换为对象? Apr 29, 2024 pm 01:09 PM

将MySQL查询结果数组转换为对象的方法如下:创建一个空对象数组。循环结果数组并为每一行创建一个新的对象。使用foreach循环将每一行的键值对赋给新对象的相应属性。将新对象添加到对象数组中。关闭数据库连接。

使用Python的__contains__()函数定义对象的包含操作 使用Python的__contains__()函数定义对象的包含操作 Aug 22, 2023 pm 04:23 PM

使用Python的__contains__()函数定义对象的包含操作Python是一种简洁而强大的编程语言,提供了许多强大的功能来处理各种类型的数据。其中之一是通过定义__contains__()函数来实现对象的包含操作。本文将介绍如何使用__contains__()函数来定义对象的包含操作,并且给出一些示例代码。__contains__()函数是Pytho

使用Python的__le__()函数定义两个对象的小于等于比较 使用Python的__le__()函数定义两个对象的小于等于比较 Aug 21, 2023 pm 09:29 PM

标题:使用Python的__le__()函数定义两个对象的小于等于比较在Python中,我们可以通过使用特殊方法来定义对象之间的比较操作。其中之一就是__le__()函数,它用于定义小于等于比较。__le__()函数是Python中的一个魔法方法,并且是一种用于实现“小于等于”操作的特殊函数。当我们使用小于等于运算符(&lt;=)比较两个对象时,Python

数组和对象在 PHP 中的区别是什么? 数组和对象在 PHP 中的区别是什么? Apr 29, 2024 pm 02:39 PM

PHP中,数组是有序序列,以索引访问元素;对象是具有属性和方法的实体,通过new关键字创建。数组访问通过索引,对象访问通过属性/方法。数组值传递,对象引用传递。

C++ 函数返回对象时有什么需要注意的? C++ 函数返回对象时有什么需要注意的? Apr 19, 2024 pm 12:15 PM

在C++中,函数返回对象需要注意三点:对象的生命周期由调用者负责管理,以防止内存泄漏。避免悬垂指针,通过动态分配内存或返回对象本身来确保对象在函数返回后仍然有效。编译器可能会优化返回对象的副本生成,以提高性能,但如果对象是值语义传递的,则无需副本生成。

See all articles