最後更新:2016-06-06
來源:互聯網
上載者:User
關鍵字
php
yii2
laravel
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