PHP变量类静态方法调用

9 浏览
0 Comments

PHP变量类静态方法调用

我有一个属性,它以字符串形式存储一个类名。然后,我想使用它来调用该类的静态方法。据我所知,自PHP 5.3以来这是可能的。我正在一个vagrant虚拟机上运行5.6.x版本的PHP。

我想这样做:

$item = $this->className::getItem($id);

但我得到了以下错误:

Parse error: syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM)...

以下代码可以正常工作:

$c = $this->className;
$item = $c::getItem($id);

有什么想法吗?这不是同一件事吗?

0
0 Comments

问题是你在第一次使用时访问了一个类的属性,但在第二次尝试时,你将类属性的值解析为一个字符串(存储在变量$c中),这个字符串可以用于调用静态类函数。第一次尝试是在一个字符串(类属性)上访问静态方法。

class a {
     static function b(){echo'works';}
}
$a='a';
$a::b();

但错误的真正问题是,在PHP中,->FooBar::是一个语法错误。

出现这个问题的原因是因为在第二次尝试时,你将类属性的值解析为字符串,而不是直接使用类名来调用静态方法。解决这个问题的方法是直接使用类名来调用静态方法,而不是将类属性的值解析为字符串。

class a {
     static function b(){echo'works';}
}
$a='a';
a::b();

这样,你就可以正确地调用静态方法了。

0
0 Comments

问题的出现原因:

该问题出现的原因是在Fabric类的fabricItem方法中,使用了动态调用静态方法的方式。在该方法中,通过传入的类名和ID,调用了GetItem接口中的静态方法getItem。然而,由于getItem方法是静态的,不能使用对象调用的方式来调用静态方法,因此出现了错误。

解决方法:

要解决这个问题,可以通过修改fabricItem方法中的代码来实现。可以使用call_user_func_array函数来调用静态方法getItem。具体的解决方法如下:

Class Fabric
{
    function fabricItem($classname, $id)
    {
        $item = call_user_func_array(array($classname, 'getItem'), array($id));
        return $item;
    }
}
$fabric = new Fabric();
$a = $fabric->fabricItem("ItemA", 3);
$b = $fabric->fabricItem("ItemB", 4);
var_dump($fabric);
var_dump($a);
var_dump($b);

通过上述修改,我们可以成功调用静态方法getItem,并得到正确的结果。

0