请教关于php extends 以及 parent::__construct();重复执行问题

化蝶自在飞 2012-05-01 04:05:46
先上代码1:

class foreground {
public $db, $memberinfo;
private $_member_modelinfo;

public function __construct() {
$this->db = pc_base::load_model('member_model');
if(substr(ROUTE_A, 0, 7) != 'public_') {
self::check_member();//请注意这里1
}
}

/**
* 判断用户是否已经登陆
*/
final public function check_member() {
//此处省略若干语句,包括sql执行等
}
}



代码2:

class share extends foreground {

function __construct() {
parent::__construct();//请注意这里,如果没有这句,代码1里的 $memberinfo 变量值无法获取.
}

function init(){
//省略若干
}


代码1是判断检查用户登陆状态,被代码2继承,现在问题就是 代码1的 check_member 被执行两次,也就是debug监测到里面的sql重复执行了.
不知道说的清楚不,请大家给个解决方案.
...全文
815 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
aren_ng 2013-06-30
  • 打赏
  • 举报
回复
你的问题是,在引用 foreground 类的时候new了一次, 然后在share 类里双加了 parent::__construct();就会出现你说的重复执行问题 我猜你调的是PHPCMS的代码,出现的问题应该是因为: foreground类,你是通过pc_base::load_app_class('foreground'); 这样引用的。 你只需要改成 pc_base::load_app_class('foreground','',0); 这样就可以解决重复执行的问题了。
_-_--___ 2012-05-02
  • 打赏
  • 举报
回复

<?php
class foreground {
//public $db, $memberinfo;
//private $_member_modelinfo;

public function __construct() {
//$this->db = pc_base::load_model('member_model');
//if(substr(ROUTE_A, 0, 7) != 'public_') {
echo __CLASS__." construct start\n";
self::check_member();//请注意这里1
echo __CLASS__."share construct end\n";
//}
}

/**
* 判断用户是否已经登陆
*/
final public function check_member() {
echo "check_member called!\n";
//此处省略若干语句,包括sql执行等
}
}

class share extends foreground {
function __construct() {
echo __CLASS__." construct start\n";
parent::__construct();//请注意这里,如果没有这句,代码1里的 $memberinfo 变量值无法获取.
echo __CLASS__."share construct end\n";
}
}
$test = new share();
?>

输出:
share construct start
foreground construct start
check_member called!
foregroundshare construct end
shareshare construct end

楼主实例化的代码有问题吧
化蝶自在飞 2012-05-02
  • 打赏
  • 举报
回复
share类里有一些其他公用的变量,这里示例代码没写出来.谢谢指教.
xuzuning 2012-05-02
  • 打赏
  • 举报
回复
share 类不需要声明 __construct,因为他只是调用父类的 __construct
化蝶自在飞 2012-05-02
  • 打赏
  • 举报
回复
感谢7楼提醒,确实被加载后自动new了.sorry.

请教8楼,第几个__construct 没必要呢?
xuzuning 2012-05-02
  • 打赏
  • 举报
回复
从 #3、#4 看,楼主给出了不该给出的代码,而省略了应该给出的代码
所以讨论是没有意义的


class share extends foreground {
function __construct() {
parent::__construct();
}
这个 __construct 根本没必要存在
amani11 2012-05-01
  • 打赏
  • 举报
回复
你有两个类继承自foreground实例化吧或者父类也实例化了吧

如此可借助点小技巧开关,控制仅执行一次check_member
改一下昵称 2012-05-01
  • 打赏
  • 举报
回复
肯定是你哪里写错了。
在代码里重点搜寻 check_member() , new foreground , new share
看看是否有逻辑没理对的地方
化蝶自在飞 2012-05-01
  • 打赏
  • 举报
回复
debug返回内容如下
执行时间 0.050467
sql执行概况 default:6;news:0;h:0;bbs:0;bk:0;video:0;pic:0;zx:0;mr:0
sql执行列表 default:
SELECT * FROM `bddb`.`pre_hy` WHERE `userid` = '133' LIMIT 1;
SELECT * FROM `bddb`.`pre_hy_detail` WHERE `userid` = '133' LIMIT 1;
SELECT `ucuserid`,`avatar` FROM `bddb`.`pre_hy1` WHERE `uid` = '133' LIMIT 1;
SELECT * FROM `bddb`.`pre_hy` WHERE `userid` = '133' LIMIT 1;
SELECT * FROM `bddb`.`pre_hy_detail` WHERE `userid` = '133' LIMIT 1;
SELECT `ucuserid`,`avatar` FROM `bddb`.`pre_hy1` WHERE `uid` = '133' LIMIT 1;

当如注释代码2的 parent::__construct(); ,debug就只显示1次也就是3个查询,而这里是6个,重复执行了一次.注释后无法获取代码1的变量.
化蝶自在飞 2012-05-01
  • 打赏
  • 举报
回复
感谢楼上的回复,测试输出如下:
hello foregroundhello foreground
_-_--___ 2012-05-01
  • 打赏
  • 举报
回复
测试过不存在在构造函数里多次执行的情况
改一下昵称 2012-05-01
  • 打赏
  • 举报
回复
不存在你的说的重复执行的情况,一定是你在没贴到的代码里多调用了一次
你用debug检测,我更相信直接在 check_member() 方法里加一句 echo "hello ".__CLASS__; ,看结果

21,886

社区成员

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

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