2015-04-24 31 views
1

我想知道內調用get_class_methods得到一個孩子的私有方法,如果有辦法得到這個工作:如何通過父類

<?php 
    class Foo 
    { 
     public function getMethods() 
     { 
      $methods = get_class_methods($this); 
      print_r($methods); 
     } 
    } 

    class Bar extends Foo 
    { 
     private function privateFunction() {} // Not visible for parent::getMethods() 
    } 

    $Bar = new Bar(); 
    $Bar->getMethods(); 
?> 

有一個父類Foo,其中我有一個方法調用get_class_methods($ this) - 函數。我會一直用幾個不同的Bar-Classes擴展Foo-Class。我的問題是,我看不到私有方法privateFunction()。

我的目標是看到Bar的所有方法,但我不想重新創建每個子類中的getMethods()方法。

那麼有沒有辦法讓它們在父類中,還是我必須覆蓋每個子類中的getMethods()方法?

+1

什麼保護的,而不是私人? – Random

+0

@Random會工作是的,但這意味着我要編輯所有現有的子類,我不能讓方法私有的子類兒童類 – MIB

+0

我認爲你必須重載父類方法,重新定義所有孩子的私人方法...問題是私人關鍵字,迫使你做你這兩個解決方案之一...私人是非常限制... – Random

回答

3

您可能需要使用Reflection這個

class Foo { 
    public function getMethods() { 
     $class = new ReflectionClass($this); 
     $methods = $class->getMethods(
      ReflectionMethod::IS_PUBLIC | 
      ReflectionMethod::IS_PROTECTED | 
      ReflectionMethod::IS_PRIVATE 
     ); 
     print_r($methods); 
    } 
} 

class Bar extends Foo { 
    public function privateFunction() {} 
} 

$Bar = new Bar(); 
$Bar->getMethods(); 

Demo

+0

這對我很好工作。優點是,我也可以將方法列表過濾爲只有子類的方法列表。父母的方法不需要我想做的事情。謝謝! – MIB

+0

很高興你發現它很有用....反射是一個非常低估的工具 –