【问题标题】:PHP variable class static method callPHP变量类静态方法调用
【发布时间】:2017-04-16 14:43:12
【问题描述】:

我有一个将类名存储为字符串的属性。然后我想用它来调用所述类的静态方法。据我所知,这从 PHP 5.3 开始是可能的。我在 vagrant box 上运行 5.6.x。

我想这样做:

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

但我收到以下错误:

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

以下工作正常:

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

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

【问题讨论】:

标签: php


【解决方案1】:

问题是您在第一次使用时访问的是类的属性,但是在第二次尝试中您正在解析类属性的值(到 $c),什么是类名作为字符串,以及可用于对静态类函数的静态调用。第一次尝试,尝试访问字符串(类属性)上的静态方法。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 2011-06-30
      • 1970-01-01
      相关资源
      最近更新 更多