在php中用静态类变量作为类名调用静态方法

时间:2015-08-21 09:45:30

标签: php class oop static

我知道你可以使用变量作为类名调用静态方法,如下所示:

$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的局部变量)?

1 个答案:

答案 0 :(得分:3)

你可以这样做:

$tmp = self::$className;
$tmp::Bar();

修改

根据您的评论,您的问题似乎更多是关于OOP设计而不是语法。此外,每次给出解决方案时,您都会不断添加新限制,这使得难以提供相关答案。

无论如何,我会尝试总结你的选择。你想要的语法不存在(目前,无论如何),所以你必须以这种或那种方式解决它。是的,这很烦人,是的,这意味着你必须做出让步。但就是这样。

到目前为止,您可以选择以下选项:

  • 使用call_user_funcforward_static_call或类似内容。
  • 使用临时局部变量。如果真的困扰你(例如static function call($method) { $tmp = self::$classname; return $tmp::$method(); }然后使用self::call('bar');
  • ,可能会将其包装到方法中
  • 使用实例而不是静态方法重构对象设计,以便您不再需要这样做。
  • 使用其他一些非常丑陋和危险的黑客(例如eval(self::$classname.'::bar();');并希望它不会咬你的屁股。