【问题标题】:PHP Using a variable when calling a static methodPHP在调用静态方法时使用变量
【发布时间】:2010-12-10 06:10:45
【问题描述】:

我有三个类,它们都有一个名为“create”的静态函数。 我想根据表单的输出动态调用适当的函数,但语法有点问题。反正有执行此操作吗?

$class = $_POST['class'];
$class::create();

任何建议将不胜感激。

谢谢。

【问题讨论】:

  • 您的示例是否引发错误? $_POST['class'] 的合法性是什么?
  • 现在是 5.2.1。我收到以下错误:解析错误:语法错误,意外的 T_PAAMAYIM_NEKUDOTAYIM
  • 为了记录,“Paamayim Nekudotayim”是希伯来语的“双冒号”。

标签: php static methods


【解决方案1】:

如果您使用的是 PHP 5.2,则可以使用 call_user_func(或 call_user_func_array):

$className = 'A';

call_user_func(array($className, 'method'));

class A {
    public static function method() {
        echo 'Hello, A';
    }
}

会得到你:

Hello, A


您在问题中使用的那种语法只有 PHP >= 5.3 才有可能;请参阅Static Keyword 的手册页,关于这一点:

从 PHP 5.3.0 开始,可以 使用变量引用类。 变量的值不能是 关键字(例如 self、parent 和 静态)。

【讨论】:

    【解决方案2】:

    截至PHP 5.3,您所拥有的作品。

    ps。你应该考虑清理 $_POST['class'] 因为你不能确定里面会有什么。

    【讨论】:

      【解决方案3】:

      使用 call_user_func

      这是一个来自 php.net 的示例

      class myclass {
          static function say_hello()
          {
              echo "Hello!\n";
          }
      }
      
      $classname = "myclass";
      
      call_user_func(array($classname, 'say_hello'));
      call_user_func($classname .'::say_hello'); // As of 5.2.3
      
      $myobject = new myclass();
      
      call_user_func(array($myobject, 'say_hello'));
      

      【讨论】:

      • 最好将这段代码添加到外部以抽象出这么多意大利面。无论如何都要 +1
      【解决方案4】:

      我相信这只能从 PHP 5.3.0 开始。检查this page 并搜索$classname::$my_static 以查看示例。

      【讨论】:

        【解决方案5】:

        我可能误解了你想要什么,但是这个怎么样?

        switch ($_POST['ClassType']) {
            case "Class1":
                $class1::create();
                break;
            case "Class2":
                $class2::create();
                break;
            // etc.
        }
        

        如果这不起作用,您应该查看 EVAL(危险,小心。)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多