2013-05-10 41 views
2

这是一些可能被过度编码的代码的简单示例,但我想使用类常量访问类成员变量,并且想知道是否有比使用$ foo- > __低于?使用常量的PHP访问成员变量

class Foo 
{ 
    const BAR = 'bar'; 

    private $props = array(self::BAR => 'wee'); 

    public function __get($name) 
    { 
     return $this->props[$name]; 
    } 
} 

$foo = new Foo(); 
echo $foo->__get(Foo::BAR); 
+0

'echo Foo :: BAR' – 2013-05-10 23:38:57

+0

@MikeBrant那会返回“bar”,而不是“wee”,对吧? – Wiseguy 2013-05-10 23:54:31

+0

对不起,我意识到我没有阅读正确的问题。它绝对会返回'酒吧',但这正是我最初想要寻找的问题。 – 2013-05-11 00:02:17

回答

4

这也适用于:

$foo->{Foo::BAR}; 

或实施ArrayAccess,那么你可以有:

$foo[Foo::BAR] 

但为何不以$foo->bar的身份访问?你打算改变这个常数还是我在这里错过了一些东西?

+0

Foo是一个自动生成的类,虽然变化不大,但偶尔会出现。这正是我正在寻找的,谢谢! – fwrawx 2013-05-12 00:56:08

1

我认为的代码看起来不错,但你可以使用构造函数初始化props阵列:

class Foo 
{ 
    const BAR = 'bar'; 

    private $props; 

    public function __construct() { 
     $this->props = array(self::BAR => 'wee'); 
    } 

    public function __get($name) 
    { 
     return $this->props[$name]; 
    } 
} 
+0

[为什么不](http://codepad.viper-7.com/iccdMD)?常量可以在编译时进行评估。 – Wiseguy 2013-05-10 23:32:42

+0

但它们不能用于类(属性)声明构造。为什么不? - >这个问题需要PHP解析器处理依赖关系。但PHP解析器不 – hek2mgl 2013-05-10 23:33:35

+0

嘿,你是对的! :)感谢您花时间准备这个例子(请注意,如果有人*显示*我错了,我真的很感激:)) – hek2mgl 2013-05-10 23:48:20