我知道你可以使用变量作为类名调用静态方法,如下所示:
$className = "Foo";
$className::Bar(); //works
但是当我尝试将静态属性用作这样的变量时:
self::$className = "Foo";
self::$className::Bar(); //doesn't
它在线上给出了以下解析错误,我试图调用该方法:
Parse error: syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM)
那么我如何使用静态属性调用该方法,甚至可能使用与我所描述的语法有些相似的语法(没有call_user_func
并创建存储self::$className
的局部变量)?
答案 0 :(得分:3)
你可以这样做:
$tmp = self::$className;
$tmp::Bar();
修改强>
根据您的评论,您的问题似乎更多是关于OOP设计而不是语法。此外,每次给出解决方案时,您都会不断添加新限制,这使得难以提供相关答案。
无论如何,我会尝试总结你的选择。你想要的语法不存在(目前,无论如何),所以你必须以这种或那种方式解决它。是的,这很烦人,是的,这意味着你必须做出让步。但就是这样。
到目前为止,您可以选择以下选项:
call_user_func
或forward_static_call
或类似内容。static function call($method) { $tmp = self::$classname; return $tmp::$method(); }
然后使用self::call('bar');
)eval(self::$classname.'::bar();');
并希望它不会咬你的屁股。