我有一个属性,它将类名存储为字符串。然后我想用它来调用所述类的静态方法。据我所知,这可能是因为PHP 5.3。我在流浪盒上运行5.6.x.
我想这样做:
$item = $this->className::getItem($id);
但是我收到以下错误:
Parse error: syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM)...
以下工作正常:
$c = $this->className;
$item = $c::getItem($id);
知道为什么吗?这不是一回事吗?
答案 0 :(得分:2)
问题是你在第一次使用中是来自类的属性,但是在第二次尝试中你正在解析类属性的值(到$ c),什么是类名作为字符串,这个可以用于静态调用静态类函数。第一次尝试,尝试访问字符串上的静态方法(类属性)。
class a {
static function b(){echo'works';}
}
$a='a';
$a::b();
但错误的真正问题是,这个->FooBar::
是PHP中的语法错误。
答案 1 :(得分:0)
JOUM是完全正确的! 根据他的回答,我写了一个类似面料的课程。
Interface GetItem
{
public static function getItem($id);
}
Abstract Class Item
{
private $id;
function __construct($id)
{
$this->id = $id;
}
}
Class ItemA extends Item implements GetItem
{
public static function getItem($id)
{
$item = new ItemA($id);
return $item;
}
}
Class ItemB extends Item implements GetItem
{
public static function getItem($id)
{
$item = new ItemB($id);
return $item;
}
}
Class Fabric
{
function fabricItem($classname,$id)
{
$item = $classname::getItem($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);