可以在运行时为一个类变量赋一个函数来执行吗?一种像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”,但我需要了解范围内的函数或使用公共类方法
答案 0 :(得分:3)
如果您使用PHP> 5.3.0:
,则可以使用anonymous function$sum = function($a, $b) {
return $a+$b;
}
$a->function_name = $sum;
答案 1 :(得分:2)
<?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);
?>
答案 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_func或call_user_func_array
一起使用本手册为上述内容提供了很好的例子。
如果您希望能够在其中轻松使用$ this关键字,请参阅新的php 5.4 Closure::bindTO方法。