【问题标题】:Using class name from a static constant statically in PHP在 PHP 中静态使用静态常量中的类名
【发布时间】:2013-05-17 02:15:05
【问题描述】:

我将类名Car 存储为常量中的静态变量。我想用这个常量来调用函数a。一种选择是使用中间变量$tmp。然后我可以打电话给$tmp::a()。有没有办法在一个声明中做到这一点?我的尝试如下。

class Car{
    public static function a(){
        return 'hi';
    }
}

class Constants{
    public static $use='Car';
}

$tmp=Constants::$use;

echo(${Constants::$use}::a());

IDEOne link

输出如下

PHP Notice:  Undefined variable: Car in /home/mU9w5e/prog.php on line 15
PHP Fatal error:  Class name must be a valid object or a string in /home/mU9w5e/prog.php on line 15

【问题讨论】:

    标签: php static-variables


    【解决方案1】:

    总有call_user_func()

    echo call_user_func( array( Constants::$use, 'a'));
    

    IDEOne Demo

    【讨论】:

      【解决方案2】:

      我能找到@nickb 的唯一替代方法是使用我从未听说过的东西,但这就是 SO 的用途!

      我找到了ReflectionMethod,它似乎比call_user_func 更臃肿,但这是我能找到的唯一替代方式:

      <?php
      class Car{
          public static function a(){
              return 'hi';
          }
      }
      
      class Constants{
          public static $use='Car';
      }
      $reflectionMethod = new ReflectionMethod(Constants::$use, 'a');
      echo $reflectionMethod->invoke(new Car());
      

      上面的实验有点失败,因为Casebash 不想创建临时变量。

      正如 cmets 中提到的CORRUPT,尽管在PHP version 5.4.14 上进行了测试(我无法做到),但可以使用以下内容:

      echo (new ReflectionMethod(Constants::$use, 'a'))->invoke(new Car());
      

      【讨论】:

      • 1 行:echo (new ReflectionMethod(Constants::$use, 'a'))-&gt;invoke(Constants::$use);
      • :] ,但生产服务器很少升级。不幸的是(
      • 应该注意的是,与更简单的方法相比,这样做的开销是巨大的。反射、两个新对象以及在对象上调用静态方法都是避免这种情况的原因。
      【解决方案3】:

      我有疯狂的解决方案,但你不应该使用它:^)

      echo ${${Constants::$use} = Constants::$use}::a();
      

      【讨论】:

      • 天啊! :)) 我尝试过这样的事情,但从来没有得到正常的结果。
      • @CORRUPT,看看我的relative answer关于静态调用。
      猜你喜欢
      • 2014-12-25
      • 1970-01-01
      • 2015-12-25
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      相关资源
      最近更新 更多