嗯,上面的第一种情况的确报错:
Call to a member function on a non-object
真的无法解释...我在www.php.net看到的都是采用数组的用法,但不知道在那里有解释
Call to a member function on a non-object
真的无法解释...我在www.php.net看到的都是采用数组的用法,但不知道在那里有解释
解决方案 »
- 谁能给一个简单的PHP读取数据库的例子啊?
- PHP smarty的一个问题
- 求助:1005:Can't create table 'vote.voteradd' (errno: 150)外键连接的表创建错误。
- 急!这样的 .htaccess 重写规则怎么写?
- php文件测试时,出现这一段话,请高手们帮忙看看,谢谢 !
- Linux下PHP问题,急!!!!
- 来,讨论一个遇到的实际问题,关于逻辑表达式的简化
- 各位高手,请问关于PHP中MYSQL3个函数的问题
- phpMyadmin的错误返回问题
- PHP中如何增加一个系统用户
- 高分求一个分页函数或类,象google上的那种
- 请问如何避免别人用自己的程序在本机上传文件?
当用 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"]进行调用.
不知道解释得对不对.大家讨论一下
我的c可能学得不好,但是你也不用带这种污辱性的语气吧,大家都是来讨论问题的,没有必要进行这样的攻击吧.如果您觉得有错,请您解释一下错在哪?既然都来参加讨论了,不要丢下一句错了就走吧?我所说的与c++的区别是指在对全局变量的使用上不同,你觉得这个有错么?
如果你把代码写成
<?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() ;
?>
就可以正确运行了