PHP变量类静态方法调用

时间:2016-12-01 20:07:49

标签: php

我有一个属性,它将类名存储为字符串。然后我想用它来调用所述类的静态方法。据我所知,这可能是因为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);

知道为什么吗?这不是一回事吗?

2 个答案:

答案 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);