2012-11-21 35 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