PHP get_called_class() 作为引用静态属性的变量

PHP get_called_class() as variable for referencing static property

提问人:OCDev 提问时间:1/1/2014 更新时间:1/1/2014 访问量:355

问:

我正在尝试以下每种变体来引用静态属性:

get_called_class()::$$prop

我试过了这个:

${get_called_class()}::$$prop

我尝试了很多东西,但似乎无法理解。

我知道我可以这样做:

$className = get_called_class();
$className::$$prop

但是,这意味着额外的一行代码。当然,语言必须有一种方法可以使它在同一条线上工作。有人有解决方案吗?

(顺便说一句,静态属性是受保护的,因此它失败并显示 ReflectionClass::getStaticPropertyValue。

php oop 变量

评论

0赞 1/1/2014
你试过了吗(get_called_class())::$$prop
5赞 tereško 1/1/2014
请不要这样做。另外,我建议在机器产卵之前将其烧毁。
1赞 deceze 1/1/2014
如果某件事从根本上说是困难的,也许你一开始就不应该这样做。
0赞 OCDev 1/1/2014
@tereško:为什么要对周围的代码进行假设?框架级实现通常会扩展语言。想想看,正是这些框架推动了近年来对如此多改进的需求,以适应过去需要丑陋的黑客攻击。我在这里做了一些你看不见的聪明事情。承诺!
1赞 Charles 1/1/2014
@FriendlyDev,我们亲爱的朋友 Teresko 对大多数静态事物有一种(有根据的)厌恶。通常,静态的东西是一种代码气味,除非有更好的(以PHP为中心)的方法,否则你应该小心避免。在没有任何上下文可继续的情况下,给定的代码在概念上是可怕的,而不是在脚下射击自己的自我。

答:

2赞 Charles 1/1/2014 #1

在不了解此处任何其他上下文的情况下,您不需要实际调用来戳 LSB 解析的静态属性。相反,请使用 static 关键字自动解析当前调用的静态类名。get_called_class

class A {

    static $foo = 'from a';

    public static function test($property) {
        echo static::$$property, "\n";
    }

}

class B extends A { static $foo = 'from b'; }
class C extends A { static $foo = 'from c'; }

PHP 交互式提示示例:

php > include '/tmp/get_called_class.php';
php > A::test('foo');
from a
php > B::test('foo');
from b
php > C::test('foo');
from c
php > 

评论

0赞 OCDev 1/1/2014
为什么当然!感谢您的提醒。我现在感到羞怯。:D