【问题标题】:Extending A PHP Class - Help Understanding扩展一个 PHP 类 - 帮助理解
【发布时间】:2016-04-09 22:46:13
【问题描述】:

我在理解一个类如何扩展另一个类时遇到了一些麻烦。我有我的模型课。

class model{
    public $db;

    public function __construct(){
        $this->db = $GLOBALS['db']; 
    }

    public function _sel($table, $where="", $order_by="", $limit="", $group_by="",$database = NULL){            
        if($database === NULL) {  $database = $this->db; }
        // Yada Yada Yada
        $results = $database->select($sql);
    }

我有一个分页类来扩展它:

    class pagination extends model {

        public $limit;
        public $page;
        public $criteria;
        private $_totalRecords;
        private $_totalPages;   

        public function __construct(){  

            // Initialize
            $arguments = func_get_args();
            if(!empty($arguments)){
                foreach($arguments[0] as $key => $property){
                    if(property_exists($this, $key)){
                        $this->{$key} = $property;
                    }
                }
            }

        }

        public function getPaginationPage(){
          // Yada Yada Yada
          // This next line causes the issue
          $records = $this->_sel($query['table'],$query['where'],$query['order_by'],$start." , ".$end,$query['group_by'],$query['database']);

为了保持这篇文章的简短,我尝试只包含必要的代码部分。我遇到的问题是,当我在扩展类中执行查询时它失败了,因为 $this->db 没有价值。由于我在构造函数中设置了它,在我看来,我需要用类似 $xx = new model() 的东西再次调用它,但是因为它只是一个应该已经存在的类的扩展,我很困惑为什么它不会已经有值了。诚然,我是自学成才,刚刚开始上课。我对它们的理解是错误的,还是我需要做一些事情来确保它“扩展”?

这也是我调用扩展类的方式:

$this->model->pagination = new pagination(array(
            'limit'     =>  10,
            'page'      =>  1,
            'criteria'  => array('projects','status_id > 0','name ASC',''),         
        ));

【问题讨论】:

    标签: php class oop extends


    【解决方案1】:

    您已经覆盖了pagination 类中的model 构造函数。只需从 child 的 构造函数中调用 parent 的 构造函数来保留两者:

    class pagination extends model {
        ...
    
        public function __construct() { 
            parent::__construct();
            ...
    

    【讨论】:

    • 谢谢你,效果很好。为了确保我完全理解我是否调用 parent::__construct();在扩展类中,它会重置父 __construct 中定义的任何变量吗?例如,如果有一个函数被调用并设置 $this->db = "Some new value" 然后我调用 parent::__construct();将 $this->db = "Some new value" 或 $GLOBALS['db'];因为这是 __construct 中定义的?
    • @user3167249 你的问题有点难以理解,但我想你明白了。链中定义的“最后一个”构造函数是运行的,所以如果你想同时运行父类中定义的构造函数,这就是你要做的。这几乎就像调用$this->someFunction() 一样,只是它恰好是构造函数,它与您所在的函数同名,所以您改为使用parent::__construct()。是的,事情的顺序确实很重要。
    • 很抱歉给您带来了困惑。因此,父构造中定义的所有变量都将设置为父构造中定义的“初始值”,并且不会保留在调用 parent::__construct() 之前可能已更改的任何值?
    • @user3167249 真实声明
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多