嗯,上面的第一种情况的确报错:
 Call to a member function on a non-object 
真的无法解释...我在www.php.net看到的都是采用数组的用法,但不知道在那里有解释

解决方案 »

  1.   

    看了PHP手册对引用的说明,有其中中一句:
    当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用,即:
    $var =& $GLOBALS["var"];
    根据这个解释,$var变量被绑定到了$GLOBALS["var"]上.
    而根据楼主第一个类的定义,当调用
    global $g
    的时候,变量$g已经被绑定到了$GLOBALS["g"]上,然而紧接下来的这一句:
    $g = &$this ;
    变量$g又重新被绑定给了实例$o,但是注意,这时候$g已经与$GLOBALS["g"]失去了联系,他的作用范围已经被局限于test类的成员函数foo()内了,不再是一个全局变量,这就是与c++语言的区别.那么就可以说明:
    $o = new Test() ;
    $o -> foo() ;
    $g -> foo() ;
    最后调用的那一句,$g等于是一个新的变量,解释器无法判断他的类型.再看第二个类:
    $g[] = &$this;
    这一句并没有解除$g与$GLOBALS["g"]的绑定,他只是给全局数组$GLOBALS["g"]添加了一个单元$GLOBALS["g"][0],并把这个新单元与实例$o进行绑定.所以:
    $o = new Test() ;
    $o -> foo() ;
    $g[0] -> foo() ;
    最后一句还可以通过全局变量$GLOBALS["g"]进行调用.
    不知道解释得对不对.大家讨论一下
      

  2.   

    to songsong2008
    我的c可能学得不好,但是你也不用带这种污辱性的语气吧,大家都是来讨论问题的,没有必要进行这样的攻击吧.如果您觉得有错,请您解释一下错在哪?既然都来参加讨论了,不要丢下一句错了就走吧?我所说的与c++的区别是指在对全局变量的使用上不同,你觉得这个有错么?
      

  3.   

    magicsnake(北极狐) 的解释是正确的
    如果你把代码写成
    <?php
    class Test
    {
    var $val = "123" ;
    function foo()
    {
    // global $g ;
    // $g = &$this ;
    $GLOBALS['g'] =& $this;
    echo $this->val ;
    }
    }
    $o = new Test() ;
    $o -> foo() ;
    $g -> foo() ;
    ?>
    就可以正确运行了
      

  4.   

    谢谢各位!songsong2008() >> 恶心~~~~~