PHP面向对象之克隆

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

实例如下:

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

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指向原本

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

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索对象
, echo
, 方法
, function
, this
, test
, 对象克隆
, 克隆对象
, 克隆方法
__clone()
php面向对象、php面向对象编程、php面向对象教程、php是面向对象的吗、php clone对象克隆,以便于您获取更多的相关知识。

时间: 2024-09-15 20:12:45

PHP面向对象之克隆的相关文章

PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)_php技巧

本文实例讲述了PHP面向对象程序设计高级特性.分享给大家供大家参考,具体如下: 静态属性 <?php class StaticExample { static public $aNum = 0; // 静态共有属性 static public function sayHello() { // 静态共有方法 print "hello"; } } print StaticExample::$aNum; StaticExample::sayHello(); ?> 输出:0   

php面向对象抽象方法和抽象类 __call 克隆对象详细教程

抽象方法和抽象类 在OOP语言中,一个类可以有一个或多个子类,而每个类都有至少一个公有方法做为外部代码访问其的接口.而抽象方法就是为了方便继承而引入的,我们先来看一下抽象类和抽象方法的定义再说明它的用途. 什么是抽象方法?我们在类里面定义的没有方法体的方法就是抽象方法,所谓的没有方法体指的是,在方法声明的时候没有大括号以及其中的内容,而是直接在声明时在方法名后加上分号结束,另外在声明抽象方法时还要加一个关键字"abstract"来修饰:例如:  代码如下 复制代码 abstract f

php面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误_php基础

16.__toString()方法 我们前面说过在类里面声明"- "开始的方法名的方法(PHP 给我们提供的),都是在 某一时刻不同情况下自动调用执行的方法,"__toString()"方法也是一样自动被调用的,是在 直接输出对象引用时自动调用的, 前面我们讲过对象引用是一个指针,比如说:"$p=new Person()"中,$p 就是一个引用,我们不能使用echo 直接输出$p,这样会输出"Catchable fatal error:

PHP面向对象精要总结

 1 使用extends实现继承以及重载.魔术方法的含义 class B extends A 声明的时候B里可以没有A里的方法 调用的时候: $b=new B(); $b->A里的方法(); $b->A里的属性=1; $b->B里的方法(); $b->B里的方法(); 如果$a=new A(); 可以 $a->A里的方法(); $a->A里的属性=1; 不可以 $a->B里的方法(); $a->B里的方法();   重载:B继承A ,B里实现和A同名的方法属

php面向对象(基础)

最近重新学习了php面向对象这一部分的知识,做了下笔记,分享给大家,其中一部分为自己的简介,加色部分一般为自己认为比较重点或需要注意的地方,分享给大家,还希望大家多提意见共同学习. 1. 析构函数:__destruct ( ) //这是一个析构函数,在对象销毁前调用 function __destruct() { echo "再见".$this->name.""; } 2. 构造函数:__construct( ) PHP子类能否继承父类的构造方法? 如果没有定

Php面向对象 – 单例模式

Php面向对象 – 单例模式 保证类只有一个实例 1. 如何可以解决一个类可以被无限地实例化? New,就能实例化一次,怎么去限制,用户不能无限次地new? 将构造方法私有化.所有外部的new都操作失败 class MySQLDB { private function __construct() { } } 2. 一旦构造方法私有化,意味着类不能再类外实例化.但可以在类内实例化. 增加一个公共的静态方法,通过类来调用该方法,在方法内可以执行new操作. class MySQLDB { priva

PHP中实现面向对象编程(下)

编程|对象 多态性 多态性被定义为当在运行时刻一个对象作为参数传递时,对象能决定调用那个方法的能力.例如,用一个类定义了方法 "draw",继承类重定义 "draw" 的行为来画圆或正方形,这样你就有一个参数为 x 的函数,在函数里可以调用$x->draw(). 如果支持多态性,那么 "draw" 方法的调用就取决于对象 x 的类型.多态性在PHP中很自然被支持(想一想这种情况在C++编译器中如果编译,那一个方法被调用?然而你不知道对象的类

Php5.0说明 ------为面向对象而生的php5

php5|对象 Php5.0说明 ------为面向对象而生的php5 为面向对象而生的PHP5--------------------------------------------- [摘要]目前开发中的PHP5,其面向对象的机能已经被大幅度的强化了.下一代的PHP将会是怎样的一种语言呢?下面我们来详细讲解一下目前发布的PHP5的beta release. (一) Zend 2.0的诞生现在的PHP4所使用的基本文法是被称之为Zend 引擎的脚本编译引擎.这个就是PHP4的优良机能的原因之一

PHP的面向对象编程:开发大型PHP项目的方法(五)(转载)

编程|对象|项目 PHP的面向对象编程:开发大型PHP项目的方法(五) 作者:Luis Argerich 译者:limodou 使用类进行数据存储 对于PHP和OOP一件非常好的事情就是,你可以很容易地定义一个类来操作某件事情,并且无论何时你想 用的时候都可以调用相应的类.假设你有一个HTML表单,用户可以通过选择产品ID号来选择一个产品.在数 据库中有产品的信息,你想把产品显示出来,显示它的价格等等.你拥有不同类型的产品,并且同一个动作 可能对不同的产品具有不同的意思.例如,显示一个声音可能意