2016-08-14 71 views
1

由于PHP 5.3,它是可以使用一个变量作为类名,不仅为对象的实例,但even for static methods as well为什么我不能在PHP中直接使用函数返回值作为动态类名?

$className = 'My\Name\Spaced\Thing'; 
$thing = $className::foo('hello world'); 

但是,如果我尝试使用函数或方法的返回值,而不是实际变量,我得到一个错误:

function getClassName() 
{ 
    return 'My\Name\Spaced\Thing'; 
} 

// Raises "syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM)" 
$thing = getClassName()::foo('hello world'); 

此,在另一方面,工作得很好:

$className = getClassName(); 
$thing = $className::foo('hello world'); 

是怎么回事?我在PHP的(5.6)语法处理器中发现了一个错误吗?

回答

2

我不知道我是否称它为“bug”,但它确实是PHP 7之前PHP的一个特质。这和类似问题的全部类别由Uniform Variable Syntax RFC解决。

+0

感谢,它看起来像是在RFC中明确表示的:“静态属性获取和方法调用现在可以应用于任何可忽略的表达式,例如$ foo ['bar'] :: $ baz,$ foo :: $ bar :: $ baz和$ foo-> bar():: baz()现在都是有效的。“ 除了仅仅分配给一个字符串变量之外,PHP <7是否有任何解决方法? – alexw

+0

不,应该使用中间变量。 (嗯,实际上你可能会用一些非常模糊的技巧来提取语法,但是他们会给你一个糟糕的混乱,这是不值得的,我甚至不想把它们[如果有的话]会在这里工作。) –

相关问题