先上代码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重复执行了.
不知道说的清楚不,请大家给个解决方案.

解决方案 »

  1.   

    不存在你的说的重复执行的情况,一定是你在没贴到的代码里多调用了一次
    你用debug检测,我更相信直接在 check_member() 方法里加一句 echo "hello ".__CLASS__; ,看结果
      

  2.   

    感谢楼上的回复,测试输出如下:
    hello foregroundhello foreground
      

  3.   

    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的变量.
      

  4.   

    肯定是你哪里写错了。
    在代码里重点搜寻 check_member() , new foreground , new share
    看看是否有逻辑没理对的地方
      

  5.   

    你有两个类继承自foreground实例化吧或者父类也实例化了吧如此可借助点小技巧开关,控制仅执行一次check_member
      

  6.   


    <?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楼主实例化的代码有问题吧
      

  7.   

    从 #3、#4 看,楼主给出了不该给出的代码,而省略了应该给出的代码
    所以讨论是没有意义的
    class share extends foreground {
        function __construct() {
            parent::__construct();
        }
    这个 __construct 根本没必要存在
      

  8.   

    感谢7楼提醒,确实被加载后自动new了.sorry.请教8楼,第几个__construct 没必要呢?
      

  9.   

    share 类不需要声明 __construct,因为他只是调用父类的 __construct
      

  10.   

    share类里有一些其他公用的变量,这里示例代码没写出来.谢谢指教.
      

  11.   


    你的问题是,在引用 foreground 类的时候new了一次,
    然后在share 类里双加了 parent::__construct();就会出现你说的重复执行问题我猜你调的是PHPCMS的代码,出现的问题应该是因为:
    foreground类,你是通过pc_base::load_app_class('foreground'); 这样引用的。
    你只需要改成
    pc_base::load_app_class('foreground','',0); 这样就可以解决重复执行的问题了。