<code>class A{ public $son_function; public function __construct() { $this->son_function = ? //这里获取到子类的方法名 } } class B extends A{ public function test() { } public function XML() { } } $b = new B(); $b->test(); echo $b->son_function; //这里应该是test $b->XML(); echo $b->son_function; //这里应该是XML </code>
描述:比如說實例化$b
呼叫了自身的test
方法,這個時候父類中的初始化方法son_function
便保存了$b
中調用方法的名字,這個應該如何實現?這種方式叫什麼?
————————————————分割線——————————————————
補充一下我的使用場景:我要記錄登陸用戶每一步的操作和數據,例如他使用了刪除方法,然後就保存這個控制器和這個方法的名字,還有他接收到的post和get數據。 暫不提實現這個功能有什麼意義之說。 我的思路是這樣的,每個控制器都繼承一個公共控制器,在公共控制器裡的初始化方法中實作這個操作。類似下圖這樣的,我已經寫好了偽代碼:
<code>class A{ public $son_function; public function __construct() { $this->son_function = ? //这里获取到子类的方法名 } } class B extends A{ public function test() { } public function XML() { } } $b = new B(); $b->test(); echo $b->son_function; //这里应该是test $b->XML(); echo $b->son_function; //这里应该是XML </code>
描述:比如說實例化$b
呼叫了自身的test
方法,這個時候父類中的初始化方法son_function
便保存了$b
中調用方法的名字,這個應該如何實現?這種方式叫什麼?
————————————————分割線——————————————————
補充一下我的使用場景:我要記錄登陸用戶每一步的操作和數據,例如他使用了刪除方法,然後就保存這個控制器和這個方法的名字,還有他接收到的post和get數據。 暫不提實現這個功能有什麼意義之說。 我的思路是這樣的,每個控制器都繼承一個公共控制器,在公共控制器裡的初始化方法中實作這個操作。類似下圖這樣的,我已經寫好了偽代碼:
這違背背面向對象的設計哲學,父類不應該關心子類的實現
如果你想清楚了, 確實要這麼乾, 反射算是一種可行的方案(但是低效)
直覺上, 你可能需要採用適配器模式
適配器模式:
https://en.wikipedia.org/wiki/Adapter_pattern
你可能需要更加細化你的需求, 來給你一個更合適的實現方案
你可以搜尋 php後期靜態綁定,應該可以解決你的問題
你搞錯邏輯了,子類別不實例化怎麼執行test或xml?都已經實例化完成了,建構函式中的參數變化還有什麼意義嗎?
<code>$b = new B(); $b->test(); $a = new A(); // <- 此时父类实例化根本不会受到子类影响,所以你的思路本身有问题</code>
再說了 public function test() {$this->sonFunction = 'test';}不就行了
可以用php的重載__call()或是__callstatic試試
http://php.net/manual/zh/language.oop5.overloading.php#object.callstatic