【问题标题】:Dynamically call a static function?动态调用静态函数?
【发布时间】:2010-11-18 11:35:55
【问题描述】:

有人可以填空吗?我需要在一个类上调用一个静态函数。我需要在这里使用 eval 吗?

// Some settings require function calls
$switch = array ('random_image' => 'Splashpage::get_random_image()', 'splash_photos_count' => 'Splashpage::count_splash_photos()');
foreach($switch as $key => $function) {
    if ($name == $key) {
        return ... $function
    }
}

【问题讨论】:

    标签: php function static


    【解决方案1】:

    如果您有 PHP 5.2.3 或更高版本,call_user_func() 将使用以该格式传递的静态方法:

    foreach($switch as $key => $function) {
        if ($name == $key) {
            return call_user_func($function);
        }
    }
    

    此外,如果您要立即返回方法调用的结果,则不需要循环,因为 if 条件只有一次机会评估为真:

    if (isset($switch[$name]) && is_callable($switch[$name])) {
        return call_user_func($switch[$name]);
    }
    

    【讨论】:

    • method_exists 需要 2 个参数,而不是一个。
    【解决方案2】:

    使用 call_user_func 函数:

    http://php.net/manual/en/function.call-user-func.php

    例子:

    call_user_func('myClassName::'.$function);
    

    【讨论】:

      【解决方案3】:

      如果你总是在同一个类上调用这些方法,你只能将方法名放在你的数组中,然后像这样调用它们:

      $switch = array ('random_image' => 'get_random_image', 'splash_photos_count' => 'count_splash_photos');
      foreach($switch as $key => $function) {
          if ($name == $key) {
              return Splashpage::$function ();
          }
      }
      

      【讨论】:

      • 目前我只需要 Splashpage 是唯一需要的类,但我认为将来这会改变。不过谢谢。
      【解决方案4】:

      每个人都说对了一部分。

      首先这个数组是错误的。

      $switch = array ('random_image' => 'Splashpage::get_random_image()', 'splash_photos_count' => 'Splashpage::count_splash_photos()');
      

      应该是:

      $switch = array ('random_image' => 'Splashpage::get_random_image', 'splash_photos_count' => 'Splashpage::count_splash_photos');
      

      这让你可以打电话 - 正如 2 个人所说 - call_user_func 和鲍勃你的叔叔。

      $switch = array ('random_image' => 'Splashpage::get_random_image', 'splash_photos_count' => 'Splashpage::count_splash_photos');
      if(isset($switch[$name])) {
          return call_user_func($switch[$name]);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-04
        • 1970-01-01
        • 2011-10-04
        • 1970-01-01
        • 2011-09-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多