PHP变量类静态方法调用
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);
有什么想法吗?这不是同一件事吗?
问题是你在第一次使用时访问了一个类的属性,但在第二次尝试时,你将类属性的值解析为一个字符串(存储在变量$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();
这样,你就可以正确地调用静态方法了。
问题的出现原因:
该问题出现的原因是在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,并得到正确的结果。