php 调用子类方法,框架中是如何调用子类方法的?

很多框架都提供了前置后后置操作,比如__init()方法,会在__construct()后首先被调用。

YII2中会有beforeFind(),afterFind()。

这些都是自定义方法,比如在UserModel,但是UserModel extends Model。

我发现这些方法的调用都是在Model这个父类中调用的,为什么父类能调用子类的方法?

还是通过其他方法调用的?

补充一下:

框架中类似的__init()、beforeFind(),afterFind()等等这些前置后置方法,是如何被调用的。

回复内容:

很多框架都提供了前置后后置操作,比如__init()方法,会在__construct()后首先被调用。

YII2中会有beforeFind(),afterFind()。

这些都是自定义方法,比如在UserModel,但是UserModel extends Model。

我发现这些方法的调用都是在Model这个父类中调用的,为什么父类能调用子类的方法?

还是通过其他方法调用的?

补充一下:

框架中类似的__init()、beforeFind(),afterFind()等等这些前置后置方法,是如何被调用的。

后期静态绑定

不知道是不是你需要的东西,用于静态方法的。

PHP:后期静态绑定

没太明白你的意思, 我想父类在定义的时候都不知道会有什么子类方法,怎么可能会调用子类的方法。

你说的自定义方法是重写的父类的方法还是完全属于子类的方法,

好纠结O.O

贴下代码吧

我明白你的意思了。

我没有安装YII2 ,我找了下TP的相同功能函数,比如说控制器的初始化方法_initialize。其实在实例化控制器类的时候在__construct中就有调用

/**

* 架构函数 取得模板对象实例

* @access public

*/

public function __construct() {

Hook::listen('action_begin',$this->config);

//实例化视图类

$this->view = Think::instance('Think\View');

//控制器初始化

if(method_exists($this,'_initialize'))

$this->_initialize();

}

这是TP的控制器基类中的代码,调用了_initialize 大概你的意思是为什么就调用了子类的这个初始化方法吧。

子类对于public修饰的方法和成员变量都是可以继承的。

你实例化子类的时候调用肯定是子类重写的方法,如果没有重写,就调用从父类继承过来的方法。这里不是父类调用的,而是子类调用的。

你可以测试下。

class MyParent

{

function __construct(){

if(method_exists($this, 'test')){

$this->test();

}

}

function test(){

echo "this is parent's test\n";

}

}

class MyChild extends MyParent

{

function test(){

echo "this is child's test\n";

}

}

$object1 = new MyChild();

$object2 = new MyParent();

个人的理解哈。O.O

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值