2012-11-21 62 views
1

是否有可能:使用define(或類常量)來調用變量方法?

define('DEFAULT_METHOD', 'defaultMethod'); 

class Foo 
{ 
    public function defaultMethod() { } 
} 

$foo = new Foo(); 
$foo->DEFAULT_METHOD(); 

還是我必須:

$method = DEFAULT_METHOD; 
$foo->$method(); 

又是怎麼回事類常量,而不是一個定義?

+0

爲什麼常量?只是'$ foo-> defaultMethod()'更容易嗎? – shad

+0

我需要爲某件事情做到這一點,我不確定人們會希望我粘貼我的整個代碼並解釋整個故事,所以我只保留了解釋我需要知道的最低要求。 – Virus721

回答

3

如果你使用一個變量或常量作爲方法名,你必須把它變成大括號:

$foo->{DEFAULT_METHOD}(); 

相同的技術變量,包括靜態類屬性:

class Foo { 
    public static $DEFAULT_METHOD = 'defaultMethod'; 
    public function defaultMethod() { echo "Cool!\n"; } 
} 

$foo = new Foo(); 
$foo->{FOO::$DEFAULT_METHOD}(); 

事實上,幾乎可以使用,結果在一個有效方法名稱的任何表達:

$foo->{'default'.'Method'}(); 
+0

謝謝!不知道這一點。可能有一天會得心應手:) '編輯':通過類常量我的意思是:'類Foo {const BAR ='Baz'; }' – Virus721

+0

很好的解釋!這看起來像是贏家:) – Sean3z

+1

'$ foo - > {Foo :: BAR}();'也可以。 – slashingweapon

2

你可以首先將其設置爲一個變量在你的例子:)

例子:http://codepad.org/69W4dYP1

<?php 
    define('DEFAULT_METHOD', 'defaultMethod'); 

    class Foo { 
     public function defaultMethod() { echo 'yay!'; } 
    } 

    $foo = new Foo(); 
    $method = DEFAULT_METHOD; 
    $foo->$method(); 
?> 
+0

感謝您的回答:) – Virus721