Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 创建变量函数作为类的成员_Php_Variables_Dynamic - Fatal编程技术网

Php 创建变量函数作为类的成员

Php 创建变量函数作为类的成员,php,variables,dynamic,Php,Variables,Dynamic,假设我们有一个班级,我有 $stockFns->{$functionOne}=create_function('$a,$b' , 'return $a+$b;'); 这将在$stockFns中创建一个名为create_函数返回的内容的属性 现在我想引用(调用)已创建的函数 在一条指令中,什么是一种干净的方法?。一个例子 $stockFns=new StockFns; $functionOne='add'; $stockFns->{$functionOne}=create_funct

假设我们有一个班级,我有

$stockFns->{$functionOne}=create_function('$a,$b' , 'return $a+$b;');
这将在$stockFns中创建一个名为create_函数返回的内容的属性

现在我想引用(调用)已创建的函数

在一条指令中,什么是一种干净的方法?。一个例子

$stockFns=new StockFns;
$functionOne='add';
$stockFns->{$functionOne}=create_function('$a,$b' , 'return $a+$b;');

//echo "***" . ($stockFns->add)(1,2);  // That doesn't work
$theFn=$stockFns->add;
echo $theFn(1,2);         // This works but reuires two instructions

谢谢

你试过调用用户函数吗

如果你使用PHP5.3和UP,你应该考虑使用匿名函数

你自己的方式,或者

echo call_user_func(array($stockFbs, 'add'), 1, 2);
问题是,PHP无法区分实际方法和可调用属性。如果您使用
()
调用某个对象,它将根本不会触及属性,并且在中可能会调用
\u call
,如果它存在的话。你可以试试类似的东西

class StockFns {
  public function __call ($name, $args) {
    $fctn = $this->{$name};
    return call_user_func_array($fctn, $args);
  }
}

作为一种解决方法,因此
\u call()
将重定向到您的回调。

忘记启动,函数的名称也是一个变量,但我想这在这个问题上并不重要。你能给出一些上下文说明为什么你需要这样做,而不是创建一个扩展
StockFns
的新类吗?drewm的可能副本:正在考虑以某种灵活的方式翻译字符串的可能性查看链接副本这可能会导致无限循环的原因。您必须检查$name是否可调用。谢谢。现在它的答案与链接dup中的答案几乎相同。戈登:啊,现在我明白你的意思了。我省略了检查,如果一切都是有效的,以使它更好地可读。我认为每个人都应该能够找到(至少是困难的方法)陷阱并验证自己。是的,但我正在搜索一些“干净”的东西,因为该方法在代码中会被多次调用。谢谢
class StockFns {
  public function __call ($name, $args) {
    $fctn = $this->{$name};
    return call_user_func_array($fctn, $args);
  }
}