class person{
  public $name;
  public $age;
  public $height;
 }
 $p1=new person;
  $p1->name="小明";
 function text2($p){
  $p1->name="最哈哈";
  echo $p1->name;
 }
 function text1($p){
  $p1->name="哈哈";
  echo $p1->name."<br/>";
  echo $p->name."<br/>";
   text2($p);
 }
 text1($p1);
以上代码输出结果为:
哈哈
小明
最哈哈我不懂得是函数中调用类时,内存中栈区和堆区地址和值的变化情况,比如基础变量的值一般是放在栈区的,类的值一般是放在堆区的,我所理解的,函数中调用类应该是先调用栈区类的地址,然后根据栈区类的地址去堆区找值,然后直接变更堆区类中对象的值,如果是的话,不管用函数调用几次这个类,这个类也只有堆区的一个值,不会在内存中同时存在两个一样的类,可是echo $p1->name;echo $p->name证明中间在调用的时候进行了一次类复制,这个地方不懂了。。$p->为什么还是小明,这个小明的值的地址在哪里?

解决方案 »

  1.   

    php也需要研究堆和栈?你搞清楚对象是引用, 基本类型是赋值就行了。
      

  2.   

    现在就是想弄明白引用和赋值的问题,可是上面的例子的echo $p1->name."<br/>";
      echo $p->name."<br/>";
    这两句显示,引用并修改完值,居然出现不一样的对象值!那就说明对象在函数中修改值不只是单纯的寻址修改。
      

  3.   

     function text1($p){
      $p1->name="哈哈";你这怎么能访问到全局变量, global都没有。
      

  4.   

    如果你打开各种级别的错误提示,就会看到 Creating default object from empty value
    PHP不同与java等,它对变量作用域要求严格,函数体内的变量如果希望是全局变量,就必须global $p1;
    java就不同了,如果没有局部变量覆盖它,那么$p1默认就是全局变量喽。PHP是门简单浅显的语言,不需要你去了解什么stack
      

  5.   

    变量作用域没搞灵清函数内部的$p1与全局的$p1,及别的函数内的$p1没关系的,如你说的说法寻址,但这个寻址空间是分开的