类引用传入在php4 php5碰到的问题

klggg 2005-07-12 02:47:32
<?

class GggWebApplication
{
var $mObjArray = array();


function GggWebApplication($modulePath='')
{

$obj_tmp = & new GggOopsModule($this);
$this->SetObj("module",$obj_tmp);
$this->SetObj("ggg","gggobj");

}

function SetObj($obj_name,$obj)
{
$this->mObjArray[$obj_name] = $obj;
}

function GetObj($obj_name)
{
return $this->mObjArray[$obj_name];
}

}

class GggOopsModule
{
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;
}

}



$app_tmp=new GggWebApplication();
$mod_tmp=$app_tmp->GetObj("module");
$mod_tmp->test();
/*
在php5下输出 gggobj
在php4下没有任何输出
问题:怎么样在php4下也可以输出 gggobj ?
*/
?>
...全文
210 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
klggg 2005-07-13
  • 打赏
  • 举报
回复
dualface:
php4 里面,除了参数要用引用,赋值也要是引用。

但我的问题还没真正解决。
先结另开帖.
谢谢.
-神仙- 2005-07-12
  • 打赏
  • 举报
回复
class GggOopsModule
{
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;
}

}
klggg 2005-07-12
  • 打赏
  • 举报
回复
哪们大侠能帮我详细分析下吗
哪一步我传递的不是指针呢?
klggg 2005-07-12
  • 打赏
  • 举报
回复
是我仔细看过的
为了说明问题例子里我特意把 $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] =>
)

)

)


也是得到两个不同的答案。小弟实在不明 :(
xuzuning 2005-07-12
  • 打赏
  • 举报
回复
呵呵,原来是你不会分析呀!

$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);

}
klggg 2005-07-12
  • 打赏
  • 举报
回复
php5更智能,现在的问题是怎么样在php下也可以实现php5下的效果
klggg 2005-07-12
  • 打赏
  • 举报
回复
感觉php对类的引用是不是有些问题
klggg 2005-07-12
  • 打赏
  • 举报
回复
好像没有明白我问的问题 :{


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
xuzuning 2005-07-12
  • 打赏
  • 举报
回复
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
)

)

21,893

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧