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

Php 如何使用其他函数作为参数调用函数,php,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

我只是在学习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); };
    //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
我有点恼火,因为我需要重新键入这个if语句。 所以我做了一个单独的函数来返回这个函数 看起来是这样的:

//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); };
    //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);
现在我的问题是:有没有一种方法可以用函数调用函数。。 比如:

因此,我可以返回日志或不返回..

给定答案-这应该可以:

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

function call_function($name, $param)
{
    $name($param);
}
call_function('add1', $x);
另一方面,变量和函数名不是很直观。也许您应该研究如何编写高质量的可读代码。我推荐阅读Martin Fowler的《重构》第9章,它非常好。你可以在网上找到PDF版本

另一个注意事项,您的return语句
return$return=isset$log)?日志返回($data,$log):日志返回($data)对$return有不必要的赋值。代码应该简单地读取

return isset($log) ? log_return($data, $log) : log_return($data);
给出答案-这应该有效:

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

function call_function($name, $param)
{
    $name($param);
}
call_function('add1', $x);
另一方面,变量和函数名不是很直观。也许您应该研究如何编写高质量的可读代码。我推荐阅读Martin Fowler的《重构》第9章,它非常好。你可以在网上找到PDF版本

另一个注意事项,您的return语句
return$return=isset$log)?日志返回($data,$log):日志返回($data)对$return有不必要的赋值。代码应该简单地读取

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

是的,这是可能的。要简化:

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

是的,这是可能的。要简化:

function first($x) {
    return $x+1;
}
function second($y) {
    return $y+1;
}
echo second(first(1)); // Returns 3, ie. 1+1+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);
所有这些都表明,日志不应该控制程序流。换句话说,系统是否记录了某些内容不应该影响代码的执行。我真的认为你需要对你要做的事情有一个更广阔的视角,并把它分解成不同的部分


充其量,您的代码应该告诉记录器记录信息,记录器本身应该确定日志记录是否实际打开。如果是,则记录信息。如果没有,那么调用记录器的代码仍然可以正常工作。正如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);
所有这些都表明,日志不应该控制程序流。换句话说,系统是否记录了某些内容不应该影响代码的执行。我真的认为你需要对你要做的事情有一个更广阔的视角,并把它分解成不同的部分


充其量,您的代码应该告诉记录器记录信息,记录器本身应该确定日志记录是否实际打开。如果是,则记录信息。如果没有,那么调用记录器的代码仍然可以正常工作。

可能重复:不要使用$GLOBALS。将需要的参数传递到函数中。它更安全、自文档化,并且可以捕获错误,特别是如果您使用PHP中现在可用的类型暗示,这就是为什么许多框架都是围绕依赖注入模式构建的。我强烈建议:可能重复:不要使用$GLOBALS。将需要的参数传递到函数中。它更安全、自文档化,并且可以捕获错误,特别是如果您使用PHP中现在可用的类型暗示,这就是为什么许多框架都是围绕依赖注入模式构建的。我强烈建议:谢谢你的回复,我将重写没有全局变量的代码,是的,日志是打开(文件或屏幕)/关闭的。有很多工作要做。。尝试尽可能多地整合。感谢您的回复,我将在不使用globals的情况下重写代码,是的,日志已打开(文件或屏幕)/关闭。有很多工作要做。。尽可能地进行整合。