使用变量类名 (PHP) 访问静态方法

Posted

技术标签:

【中文标题】使用变量类名 (PHP) 访问静态方法【英文标题】:accessing static methods using a variable class name (PHP) 【发布时间】:2011-06-30 21:43:09 【问题描述】:

我正在尝试访问静态方法,但使用变量作为类名。这可能吗?我似乎对此有问题。我希望能够做这样的事情:

class foo 
    public static function bar() 
        echo 'test';
    


$variable_class_name = 'foo';
$variable_class_name::bar();

我也希望能够使用静态变量来做类似的事情。

【问题讨论】:

这对我来说在 php 5.3.2 上工作得很好。 我相信使用 5.2。收到类似“解析错误:语法错误,第 35 行 /some/path/application/models/lev_base_model.php 中的意外 T_PAAMAYIM_NEKUDOTAYIM”的错误 您运行的是什么版本的 PHP?据我所知,您在最近的版本中已经能够做到这一点(5.2+,虽然不确定从什么时候开始有效) @Gordon 似乎只允许在 5.3+ 中使用 【参考方案1】:

该语法仅在 PHP 5.3 及更高版本中受支持。以前的版本不理解该语法,因此您的解析错误(T_PAAMAYIM_NEKUDOTAYIM 指的是:: 运算符)。

在以前的版本中,您可以尝试call_user_func(),向其传递一个包含类名及其方法名的数组:

$variable_class_name = 'foo';
call_user_func(array($variable_class_name, 'bar'));

【讨论】:

看起来很棒。静态属性有类似的东西吗? @dqhendricks:不确定类变量。对于参数,将call_user_func() 与可变参数(如sprintf())一起使用,或者将call_user_func_array() 与参数数组一起使用。这两个函数都返回方法的返回值。 @dqhendricks:见"Getting static property from a class with dynamic class name in PHP"。【参考方案2】:

PHP 5.1 及以上版本可以使用reflection:

class foo 
    public static $bar = 'foobar';


$class = 'foo';
$reflector = new ReflectionClass($class);
echo $reflector->getStaticPropertyValue('bar');

> foobar

【讨论】:

以上是关于使用变量类名 (PHP) 访问静态方法的主要内容,如果未能解决你的问题,请参考以下文章

php static静态属性和静态方法

php static静态属性和静态方法

PHP中静态方法(static)与非静态方法的使用及区别

static 关键字

static,final,包,访问修饰符,内部类

7.28.2 static关键字(静态和成员)