很多架構都提供了前置後後置操作,比如__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中就有調用
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中文網,轉載請注明出處,感謝您的尊重!