2014-10-03 97 views
0

methosHere是調用我創建的類:PHP:呼叫的方法動態

Utils::search($idRole, $this->roles, 'getId'); 
在的Utils

,搜索方法:

public static function search ($needle, $haystack, $getter) { 
    $found = false; 
    $i = 0; 

    while($i < count($haystack) || $found) { 
     $object = $haystack[$i]; 

     if($object->$getter === $needle) { 
      $found = true; 
     } 
    } 

    return $found; 
} 

草堆是角色對象的數組。下面是角色類的一部分:

class Role 
{ 
    private $id; 
    private $nom; 

    public function __construct($id = 0, $nom = null) { 
    $this->id = $id; 
    $this->nom = $nom; 
    } 

    public function getId() 
    { 
    return $this->id; 
    } 
} 

運行$object->$getter部分我有一個例外:

Undefined property: Role::$getId 

我認爲這是動態調用屬性的方式..我該怎麼辦錯了?

謝謝

+0

由於'getId'是一種方法,而不是一個道具,你要稱呼其爲方法:'$ object - > $ getter();' – hindmost 2014-10-03 12:48:52

+0

缺少括號():) – pietro 2014-10-03 12:49:04

回答

3

試試這個方法:

的第一個元素是對象,第二個是方法。

call_user_func(array($object, $getter)) 

你也可以不用call_user_func

$object->{$getter}(); 

或者:

$object->$getter(); 
2

您嘗試調用類屬性,它是在private範圍。

您爲此屬性創建了一個getter方法(Role::getId())。現在你必須調用該方法,而不是屬性本身(它是私有的,不能在包含它的Role類實例之外訪問)。

所以,你必須使用call_user_func()

$id = call_user_func(array($object, $getter)); 
+0

'call_user_function'無法幫助訪問私有方法,除非它在該對象內調用。 – hindmost 2014-10-03 12:50:53

+0

有一個公共方法'Role :: getId()',它可以由'call_user_func()'調用。 – TiMESPLiNTER 2014-10-03 12:51:57