php5
gggobjGggWebApplication Object
(
[mObjArray] => Array
(
[bbb] => xxxaaaaa
[111] => 2222
[module] => GggOopsModule Object
(
[mApp] => GggWebApplication Object
*RECURSION*
) [ggg] => gggobj
))php4
gggwebapplication Object
(
[mObjArray] => Array
(
[module] => gggoopsmodule Object
(
[mApp] => gggwebapplication Object
(
[mObjArray] => Array
(
[bbb] => xxxaaaaa
[111] => 2222
) ) ) [ggg] => gggobj
))
gggobjGggWebApplication Object
(
[mObjArray] => Array
(
[bbb] => xxxaaaaa
[111] => 2222
[module] => GggOopsModule Object
(
[mApp] => GggWebApplication Object
*RECURSION*
) [ggg] => gggobj
))php4
gggwebapplication Object
(
[mObjArray] => Array
(
[module] => gggoopsmodule Object
(
[mApp] => gggwebapplication Object
(
[mObjArray] => Array
(
[bbb] => xxxaaaaa
[111] => 2222
) ) ) [ggg] => gggobj
))
1.$obj_tmp = & new GggOopsModule($this);
2.$this->SetObj("module",$obj_tmp);
3.$this->SetObj("ggg","gggobj"); 第一行 传给 GggOopsModule类GggWebApplication 当前的对象(注意是引用方式)
第二行,第三行 增加一个变量或常量然后在 GggOopsModule内部调用传递过来的 GggWebApplication 对像来得到GggWebApplication 定义的变量,如果不是用引用方式,那
$this->SetObj("module",$obj_tmp);
$this->SetObj("ggg","gggobj");
以上两行对 GggOopsModule 类内部是无效的
由于我传递的是 GggWebApplication 对像的地址,所以在 GggWebApplication 内容设定的值应该可以影响到 GggOopsModule 类.
就像以下
<?
function xxx(&$aaa)
{
$aaa="123";
}$aaa="ggg";$tmp=&$aaa;
xxx($tmp);
echo $tmp;
?>
会输出 123而不是 ggg
你
$mod_tmp=$app_tmp->GetObj("module");
后
$mod_tmp是一个GggWebApplication对象请注意到php4与php5的差异(php5是传引用的)
php5中mApp对象是指向自己的,而php4中的mApp指向一个副本自己有一个mObjArray
其中并没有ggg项,自然就无输出了你改成这样就有了
function GggWebApplication($modulePath='')
{ $this->SetObj("ggg","gggobj");
$obj_tmp = & new GggOopsModule($this);
$this->SetObj("module",$obj_tmp); }
为了说明问题例子里我特意把 $this->SetObj("ggg","gggobj");
放在 $obj_tmp = & new GggOopsModule($this); 的后面
否则大家都知道在php5或php4里输出的肯定是 gggobj另我也特意传递的是mApp 指的地址
这样在php4中的也不会是mApp指向一个副本,而是调用的是自身
否则 &没有起作用。
我把例子简化。
<?
class class1
{
var $mString = null;
var $mObj = null;
function class1()
{
$this->mString="default";
$this->mObj = & new class2($this);
}
}class class2
{
var $mClass1 = null;
function class2(&$tClass1)
{
$this->mClass1=$tClass1;
$tClass1->mString="class2->class2";
}
function test()
{
$this->mClass1->mString="class2->test";
}
}$app_tmp=new class1();
$app_tmp->mObj->test();
echo $app_tmp->mString;
echo "<br>\n";
print_r($app_tmp);
?>
结果
php5:
class2->test<br>
class1 Object
(
[mString] => class2->test
[mObj] => class2 Object
(
[mClass1] => class1 Object
*RECURSION*
))php4:
class2->class2<br>
class1 Object
(
[mString] => class2->class2
[mObj] => class2 Object
(
[mClass1] => class1 Object
(
[mString] => class2->test
[mObj] =>
) ))
也是得到两个不同的答案。小弟实在不明 :(
{
var $mApp;
function GggOopsModule(&$app)
{
$this->mApp = &$app;//****************************
$this->mApp->SetObj("bbb","xxxaaaaa");
$this->mApp->SetObj("111","2222");
}
function test()
{
$mod_tmp=$this->mApp->GetObj("ggg");
echo $mod_tmp;
}}
php4 里面,除了参数要用引用,赋值也要是引用。但我的问题还没真正解决。
先结另开帖.
谢谢.