如何使用其他函数作为参数调用函数

时间:2017-08-28 00:47:21

标签: php

我刚刚学习php 我试图添加一个带有注释的日志到我的函数输出。 现在它看起来像这样:

//the function
function add1($x){
  if($GLOBALS['logging'] === 'on'){ $log[] = 'Adding 1 to '.$x;};
  $a = $x + 1;
  if($GLOBALS['logging'] === 'on'){
    $return[] = $a;
    $return[] = $log;
    return $return;
  }else{ return $a; };
};
//calling the function
  if($GLOBALS['logging'] === 'on'){
    $return = add1($x);
    $number = $return[0];
    $log = $return[1];
  }else{ $number = add1($x); };

我有点恼火,因为我需要重新输入这个if语句。 所以我做了一个单独的函数来返回函数 看起来像这样:

    //function
    function log_return($data = 'x', $log = 'x'){
    if($GLOBALS['logging'] === 'on'){
      if($data !== 'x') $return[] = $data;
      if($log !== 'x') $return[] = $log;
      return $return;
    } return $data;

};//function end

并将其返回:

 return $return = isset($log) ? log_return($data, $log) : log_return($data);

现在我的问题是:有没有办法用函数调用函数.. 像:

call_function(add1($x));

所以我可以用日志或不用来返回它。

3 个答案:

答案 0 :(得分:1)

给出答案https://stackoverflow.com/a/2700760/5387193 - 这应该有效:

function add1($a)
{
    // add1 code goes here
}

function call_function($name, $param)
{
    $name($param);
}
call_function('add1', $x);

另外,您的变量和函数名称不是很直观。也许您应该研究如何编写高质量的可读代码。我建议阅读Martin Fowler的Refactoring第9章,它非常好。您可以在网上找到PDF版本。

另一个注意事项,你的return语句return $return = isset($log) ? log_return($data, $log) : log_return($data);对$ return有一个不必要的赋值。代码应该只是阅读

return isset($log) ? log_return($data, $log) : log_return($data);

答案 1 :(得分:1)

是的,有可能。简化:

function first($x) {
    return $x+1;
}
function second($y) {
    return $y+1;
}
echo second(first(1)); // Returns 3, ie. 1+1+1

答案 2 :(得分:1)

正如gview在评论中所说,不要使用全局变量。存在参数列表有几个原因,包括但不限于使代码更易于阅读,编辑和调试。函数和变量名也一样。

此外,您的代码非常混乱。它可以合并:

function addTo($currentValue, $valueToAdd, $logging = 0)
{
    if ($logging) {
        logWrite('addTo', "Adding $valueToAdd to $currentValue");
        return $currentValue + $valueToAdd;
    } else {
        return $currentValue;
    }
}

function logWrite($operation, $message)
{
    $log = getLog(); // maybe it's a file, or DB record or something
    // perform the write, depending on your implementation
}

$number = addTo($someStaringValue, $someOtherValue, 1);

所有这些都说,日志记录不应该控制程序流。换句话说,系统是否记录某些内容应该与您的代码尝试执行的操作无关。我真的认为你需要更广泛地了解你正在尝试做什么并将其分解成组件。

充其量,您的代码应该告诉记录器记录信息,记录器本身应该确定记录是否实际打开。如果是,则记录信息。如果没有,那么调用记录器的代码仍然有效并继续其业务。