<?php
class Person
{
//下面是人的成员属性
var $name; //人的名子
var $sex; //人的性别
var $age; //人的年龄
//定义一个构造方法参数为属性姓名$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."<br>";
}
//对象克隆时自动调用的方法, 如果想在克隆后改变原对象的内容,需要在__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
我的名子叫:我是假的张三 性别:男 我的年龄是:30我的结果是:
我的名子叫:张三 性别:男 我的年龄是:20
我的名子叫:我是假的 性别:男 我的年龄是:30没有“张三”,而我把$that改成$this的时候就出正确结果了,但我不懂是我下的电子书上是这么解释的:PHP5 定义了一个特殊的方法名“__clone()”方法,是在对象克隆时自动调用的
方法,用“__clone()”方法将建立一个与原对象拥有相同属性和方法的对象,如果想
在克隆后改变原对象的内容,需要在__clone()中重写原本的属性和方法, ”
__clone()”方法可以没有参数,它自动包含$this 和$that 两个指针,$this 指向复
本,而$that 指向原本;求讲解
class Person
{
//下面是人的成员属性
var $name; //人的名子
var $sex; //人的性别
var $age; //人的年龄
//定义一个构造方法参数为属性姓名$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."<br>";
}
//对象克隆时自动调用的方法, 如果想在克隆后改变原对象的内容,需要在__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
我的名子叫:我是假的张三 性别:男 我的年龄是:30我的结果是:
我的名子叫:张三 性别:男 我的年龄是:20
我的名子叫:我是假的 性别:男 我的年龄是:30没有“张三”,而我把$that改成$this的时候就出正确结果了,但我不懂是我下的电子书上是这么解释的:PHP5 定义了一个特殊的方法名“__clone()”方法,是在对象克隆时自动调用的
方法,用“__clone()”方法将建立一个与原对象拥有相同属性和方法的对象,如果想
在克隆后改变原对象的内容,需要在__clone()中重写原本的属性和方法, ”
__clone()”方法可以没有参数,它自动包含$this 和$that 两个指针,$this 指向复
本,而$that 指向原本;求讲解
进而达到修改副本$p2
例 : $p1=new Person("张三", "男", 20);
$p2=clone $p1;
<?php class person
{
public $name;
public $color; public function display()
{
echo $this->name;
echo $this->color;
} public function person()
{
$this->name='ligen';
$this->color='black';
echo '######';
} public function __construct($name,$color,$dion)
{
$this->name=$name;
$this->color=$color;
} public function __clone()
{ echo $this->name='%%%%%'; //这个就是修改复本的属性 也就是CLONE出来的那个对象
echo $that->name='&&&&&&&'; //这个是修改原本的
}
} $p=new person('xuxin','red','$$$$'); // $p->display(); echo '<br />';
$p1=clone $p; echo $p->name; //输出 %%%%% 说明修改复本成功!! echo '<br />',$p1->name; // 输出xuxin 说明$that->name='&&&&&&&' 没有修改成功
这个就是PHP $that 指针 有问题
?>
发现$that指针 的的确确是存在的
public function __clone()
{ echo $this->name='%%%%%';
$that->name='&&&&&&&'; echo $that->name;
var_dump($this);//object(person)#2 (2) { ["name"]=> string(5) "%%%%%" ["color"]=> string(3) "red" }
var_dump($that); //输出 object(stdClass)#3 (1) { ["name"]=> string(7) "&&&&&&&" } 没有证明的情况不能说没有,,,误导人家!!!!!!!!!!!!
}
你代码中本身就将$that变量初始化成一个object了,打印的时候当然是对象
$std=new stdclassstdclass 有个特点:可以随意的添加属性,但不能添加方法而stdclass派生类 也一样不能添加方法,只能是属性网上也有这么讲的 :stdclass是所有变量的内部基类
我个人不这么认为;因为变量是存储在栈中,而对象的属性是存储在堆中....
$that=new stdclass;
$that->name;所以他是空的
讲的很好!!!!!!
说明stdclass会自动实例化
这也说明 $that指针,并不是指向clone的原本
你还是没明白$that只是个变量,他之所有是个stdclass,是因为你之前的代码已经对他初始化了$that->name='&&&&&&&';