<?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 指向原本;求讲解

解决方案 »

  1.   

    __clone()方法是在该对象被 CLONE时自动调用,因为这个类中的成员方法,肯定也是这个对象一个方法,,,所以该对象被CLONE时 会自动调用这个方法这个方法的作用就是可以修改已经CLONE出来的那个对象的属性,,,因为CLONE出来的那个对象 $p2是不能在修改的,如果要修改也只能在类中修改成员属性和方法,从而原本$p1
    进而达到修改副本$p2
    例 :  $p1=new Person("张三", "男", 20);
          $p2=clone $p1; 
      

  2.   


         <?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 指针 有问题
           
    ?>
      

  3.   

    我也刚学PHP 几天,, 听听 别人解释,以前是学ASP 的 学了 一年多了吧
      

  4.   

    恭喜你给php发明了关键字that,请去php.net联系管理员。
      

  5.   

     你们没有见过 也不能没有啊,,,, 凡是一门语言,即便你已经很精通了,, 可能你都没有学到原本来语言40%,,,  就拿PHP 函数来讲,,虽然说不要你每个知道 , 但1000多个函数 你记得几个???即便有些函数可以自已写,,但每个函数你都能写出来吗 在说这个$that指针 ,用起来没有效果 ,,但不代表 就不存在,, 如果不存在为何不报错??,,有些情况不一定会报错,,,, 但绝大多数情况都报错,语言本身按规定来的 解释器认识的就通过,不认识的就否定,也就是报错 ,PHP还不一样是C写的吗 关键字,结构是不能变的, 
      

  6.   

    哥第一次听说有that指针,你把that改成this试下。
      

  7.   

    通过我自已证明 
     发现$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) "&&&&&&&" } 没有证明的情况不能说没有,,,误导人家!!!!!!!!!!!!
           
         }
         
      

  8.   

    不过也有问题     从打印的情况来看,$that指针 所指的对象 已经不是 person的实例了。 而是属于 stdClass的实例 至于 stdClass 是一个什么类 网上也有,,不过很少。具体是什么 我也不清楚。    
       
      

  9.   

    - -   stdClass 相当于object$that->name='&&&&&&&';
    你代码中本身就将$that变量初始化成一个object了,打印的时候当然是对象
      

  10.   

      通过网上查阅资料  : stdclassstdclass 是PHP 预定义的一个基类
     
    $std=new stdclassstdclass 有个特点:可以随意的添加属性,但不能添加方法而stdclass派生类 也一样不能添加方法,只能是属性网上也有这么讲的 :stdclass是所有变量的内部基类
    我个人不这么认为;因为变量是存储在栈中,而对象的属性是存储在堆中....
      

  11.   

    stdclass 是内建类当你$that->name的时候其实php已经,php的规则很松散
    $that=new stdclass;
    $that->name;所以他是空的
      

  12.   


    讲的很好!!!!!!
     说明stdclass会自动实例化
     这也说明 $that指针,并不是指向clone的原本
     
      

  13.   


    你还是没明白$that只是个变量,他之所有是个stdclass,是因为你之前的代码已经对他初始化了$that->name='&&&&&&&';