用户
 找回密码
 入住 CI 中国社区
搜索
查看: 3126|回复: 12
收起左侧

[HELP] 为什么实例化模型类之后先执行父类的构造函数?

[复制链接]
发表于 2013-6-24 01:20:57 | 显示全部楼层 |阅读模式
我写了个自己的模型类  所有模型类都基于这个模型
PHP复制代码
class MY_Model extends CI_Model
public $table;
public function __construct()
{
   $this->table = '456';
   echo $this->table;
   parent::__construct();
}
 
class User_model extends MY_Model
{
public function __construct()
{
    $this->table = '123';
    echo $this->table;
    parent::__construct();
}
}
 
$this->load->model('user_model');
 
复制代码


为什么执行结果是“456123”而不是"123456"?
发表于 2013-6-24 08:54:28 | 显示全部楼层
虽然小的学艺不精,入门级别,但是看这个代码,第一个构造函数里已经输出了456,第二个构造函数又输出了123,那连起来不是456123吗,程序不是按照逐行语句执行的吗?
发表于 2013-6-24 10:26:18 | 显示全部楼层
因為你使用了繼承,且你把它放在建構子裏,繼承後當然是先執行建構子,所以456就跑出來了.
 楼主| 发表于 2013-6-24 11:27:31 | 显示全部楼层
Raphael 发表于 2013-6-24 10:26
因為你使用了繼承,且你把它放在建構子裏,繼承後當然是先執行建構子,所以456就跑出來了. ...

我知道我使用了继承啊    但是继承的意义是用父类来实例化类的吗?
发表于 2013-6-24 11:41:52 | 显示全部楼层
注意:parent::__construct();

你手动执行了父类构造函数,否则 PHP 是不会自动帮你执行的。
 楼主| 发表于 2013-6-24 15:00:27 | 显示全部楼层
Hex 发表于 2013-6-24 11:41
注意:parent::__construct();

你手动执行了父类构造函数,否则 PHP 是不会自动帮你执行的。 ...

是啊  不过我是先把成员变量赋值为123之后才执行父类的构造函数把它变成456的啊   为什么实际情况是先执行了父类的构造函数然后才执行子类的构造函数?


发表于 2013-6-24 16:00:26 | 显示全部楼层
stalkerru 发表于 2013-6-24 15:00
是啊  不过我是先把成员变量赋值为123之后才执行父类的构造函数把它变成456的啊   为什么实际情况是先执行 ...

这个貌似是有点奇怪,你的 PHP 版本是?

 楼主| 发表于 2013-6-25 09:30:51 | 显示全部楼层
php版本是5.4   
发表于 2013-6-25 10:20:47 | 显示全部楼层
PHP复制代码
class MY_Model {
        public $table;
        public function __construct()
        {
           $this->table = '456';
           echo $this->table;
           parent::__construct();
        }
}
class User_model extends MY_Model
{
        public function __construct()
        {
                $this->table = '123';
                echo $this->table;
                parent::__construct();
        }
}
 
$obj =  new User_model;
 
复制代码
2013-06-25_101709.png
发表于 2013-6-25 10:29:07 | 显示全部楼层
看起来应该是 123456

本版积分规则