【问题标题】:it is possible to assign a function to a class variable at runtime in php?可以在运行时在 php 中将函数分配给类变量吗?
【发布时间】:2012-01-22 05:17:42
【问题描述】:

可以在运行时为类变量分配一个函数来执行吗?一种类似 C 的“函数指针”

类似这样的:(这不起作用,因为 sum 超出了 A 的范围,但这是我的意思)

 class A {
    public $function_name;
    public functon run($arg1,$arg2){
        $function_name($arg1,$arg2);
    }
}  

function sum($a,$b){
    echo $a+$b;
}

$a=new A();
$a->function_name='sum';

$a->run();     

[编辑] 我知道有“call_user_func”,但据我所知,它需要在范围内拥有该函数或使用公共类方法

【问题讨论】:

标签: php function-pointers


【解决方案1】:

如果你使用 PHP >5.3.0,你可以使用anonymous function

$sum = function($a, $b) {
    return $a+$b;
}

$a->function_name = $sum;

【讨论】:

    【解决方案2】:

    使用call_user_func_array

    <?php
    class A {
    
        public $function_name;
    
        public function run($arg1,$arg2){
    
            return call_user_func_array( $this->function_name, array($arg1, $arg2 ) );
    
        }
    }  
    
    function sum($a,$b){
        return $a+$b;
    }
    
    $a=new A();
    $a->function_name= 'sum';
    
    var_dump( $a->run(1,1) ); //2
    
    ?>
    

    【讨论】:

    • 酷!但我需要函数声明和类初始化在同一范围内?
    • @Zorb,你是什么意思, sum 是 A 类的公共方法?你能编辑你原来的问题,把总和放在应该的地方吗
    • 您在这里有点滥用call_user_func_array() ...如果您知道参数,您应该简单地使用call_user_func(),如果不知道,您应该使用$args = func_get_args(); call_user_func_array($this-&gt;function_name, $args);,而不是从已知参数。
    • @rdlowrey 当然,不知道为什么它首先出现在我的脑海中。只是想得到一个快速的答案:P
    • @Esailija 我在想如果班级不能直接看到函数并且我将函数传递给班级可以使用它吗?现在很清楚了,谢谢!
    【解决方案3】:

    无论范围如何,它都可以工作。你只需要使用call_user_func 调用它。我还修正了您示例中的几个错别字。

    <?php
        class A {
            public $function_name;
            public function run($arg1, $arg2) {
            call_user_func($this->function_name, $arg1, $arg2);
            }
        }  
    
        function sum($a, $b){
            echo $a + $b;
        }
    
        $a = new A();
        $a->function_name = 'sum';
    
        $a->run(2, 3);
    ?>
    

    Live example

    【讨论】:

      【解决方案4】:

      另一种方法是使用可变变量(适用于对象方法)

      public static function sum($arg1, $arg2)
      {
        ..
      }
      
      public function run($arg1, $arg2)
      {
        $func = $this->function_name;
        $func( $arg1, $arg2);         <-- procedural call
        self::$func($arg1, $arg2);    <-- static method call
      }
      

      【讨论】:

        【解决方案5】:

        使用Callback 伪类型的任何变体。 与call_user_funccall_user_func_array 一起使用

        手册给出了上述用法的很好示例。

        如果您希望能够在其中轻松使用 $this 关键字,另请参阅新的 php 5.4 Closure::bindTO 方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-10-13
          • 1970-01-01
          • 1970-01-01
          • 2014-09-27
          • 2019-07-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多