先上代码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重复执行了.
不知道说的清楚不,请大家给个解决方案.
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重复执行了.
不知道说的清楚不,请大家给个解决方案.
你用debug检测,我更相信直接在 check_member() 方法里加一句 echo "hello ".__CLASS__; ,看结果
hello foregroundhello foreground
执行时间 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的变量.
在代码里重点搜寻 check_member() , new foreground , new share
看看是否有逻辑没理对的地方
<?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楼主实例化的代码有问题吧
所以讨论是没有意义的
class share extends foreground {
function __construct() {
parent::__construct();
}
这个 __construct 根本没必要存在
你的问题是,在引用 foreground 类的时候new了一次,
然后在share 类里双加了 parent::__construct();就会出现你说的重复执行问题我猜你调的是PHPCMS的代码,出现的问题应该是因为:
foreground类,你是通过pc_base::load_app_class('foreground'); 这样引用的。
你只需要改成
pc_base::load_app_class('foreground','',0); 这样就可以解决重复执行的问题了。