天天看點

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中就有調用

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中文網,轉載請注明出處,感謝您的尊重!