有可能在运行时在php中为类变量赋值吗?

时间:2011-12-16 18:03:23

标签: php function-pointers

可以在运行时为一个类变量赋一个函数来执行吗?一种像C

这样的“函数指针”

这样的事情:(这不会起作用,因为总和不在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”,但我需要了解范围内的函数或使用公共类方法

5 个答案:

答案 0 :(得分:3)

如果您使用PHP> 5.3.0:

,则可以使用anonymous function
$sum = function($a, $b) {
    return $a+$b;
}

$a->function_name = $sum;

答案 1 :(得分: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

?>

答案 2 :(得分:1)

无论范围如何,它都有效。你只需要使用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

答案 3 :(得分:0)

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

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
}

答案 4 :(得分:0)

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

一起使用

本手册为上述内容提供了很好的例子。

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