函数

引言

函数(在类/对象上下文中称为方法)是一种将常见任务或计算组合在一起的方式,可以简便地重复使用。

计算机编程中的函数就像数学中的函数一样:你可以为函数提供要处理的值,并得到一个结果,而无需自己进行任何计算。

你还可以在 PHP 手册中的函数参考部分找到 PHP 中内置的大量预定义函数。

如何调用函数

需要注意的是,echo 不是一个函数。[1] “调用函数”是指在脚本的特定位置让某个函数执行。调用函数的基本方式包括:

  • 调用函数在新的一行上输出(如在 ";""}" 后面):

    print('I am human, I am.');
    
  • 在控制结构中调用函数:

    if ($a == 72) {
      print('I am human, I am.');
    }
    
  • 将函数返回的值赋给变量:

    $result = sum($a, 5);
    
  • 在控制结构的参数括号(表达式)中调用函数:

    while ($i < count($one)) {
      // some code
    }
    

在我们之前的示例中,我们调用了几个函数。最常见的是调用 print() 函数来打印文本到输出。echo 的参数是我们希望打印的字符串(例如,print("Hello World!") 会将 "Hello World!" 打印到输出)。

如果函数返回某些信息,我们可以通过简单的赋值操作符 "=" 将其赋值给一个变量:

$var1 = func_name();

参数

参数是仅在该函数内部存在的变量。它们由程序员在调用函数时提供,函数可以读取并在本地更改它们(除非是引用类型变量,这种类型会在全局范围内更改,这属于更高级的内容)。

在声明或调用具有多个参数的函数时,你需要用逗号 , 来分隔不同的参数。

函数声明的示例如下:

function print_two_strings($var1, $var2) {
  echo $var1;
  echo "\n";
  echo $var2;
  return NULL;
}

要调用这个函数,你必须为参数赋值。赋予的值不重要,只要有值即可:

print_two_strings("Hello", "World");

输出:

Hello
World

当声明函数时,有时你希望可以不使用所有的参数。因此,PHP 允许在声明函数时给参数指定默认值:

function print_two_strings($var1 = "Hello World", $var2 = "I'm Learning PHP") {
  echo($var1);
  echo("\n");
  echo($var2);
}

这些默认值仅在函数调用时没有传入足够的参数时才会被使用。如果只传入一个参数,则 $var2 会被赋值为 "I'm Learning PHP":

print_two_strings("Hello");

输出:

Hello
I'm Learning PHP

另一种处理动态数量参数的方法是使用 PHP 内置的 func_num_argsfunc_get_argsfunc_get_arg 函数。

function mean() {
  $sum = 0;
  $param_count = func_num_args();
  for ($i = 0; $i < $param_count; $i++) {
    $sum += func_get_arg($i);
  }
  $mean = $sum / $param_count;
  echo "Mean: {$mean}";
  return NULL;
}

或者

function mean() {
  $sum = 0;
  $vars = func_get_args();
  for ($i = 0; $i < count($vars); $i++) {
    $sum += $vars[$i];
  }
  $mean = $sum / count($vars);
  echo "Mean: {$mean}";
  return NULL;
}

上述两个函数都会计算传入值的算术平均值并输出。它们的区别在于,第一个函数使用 func_num_argsfunc_get_arg,而第二个函数使用 func_get_args 将参数加载到数组中。两者的输出是相同的。例如:

mean(35, 43, 3);

输出:

Mean: 27

返回值

这个函数工作正常,但通常你会希望你的函数返回一些信息。一般来说,程序员希望从函数中获取信息的原因有两个:

  1. 函数执行了诸如计算等任务,我们需要结果。
  2. 函数可以返回一个值,表示该函数是否遇到任何错误。

要从函数中返回一个值,使用 return() 语句。

function add_numbers($var1 = 0, $var2 = 0, $var3 = 0) {
  $var4 = $var1 + $var2 + $var3;
  return $var4;
}

示例 PHP 脚本:

function add_numbers($var1 = 0, $var2 = 0, $var3 = 0) {
  $var4 = $var1 + $var2 + $var3;
  return $var4;
}

$sum = add_numbers(1, 6, 9);
echo "The result of 1 + 6 + 9 is {$sum}";

结果:

The result of 1 + 6 + 9 is 16

注意,return() 语句结束了函数的执行。如果在执行 return() 语句后函数声明中还有其他内容,它会被解析但不会执行。这在某些情况下很有用。例如:

function divide($dividee, $divider) {
  if ($divider == 0) {
    // 不能除以0
    return false;
  }
  $result = $dividee / $divider;
  return $result;
}

注意,if 后面没有 else。这是因为,如果 $divider 等于 0,return() 语句会被执行,函数会停止。

如果你想返回多个变量,你需要返回一个数组,而不是单个变量。例如:

function maths($input1, $input2) {
  $total = ($input1 + $input2);
  $difference = ($input1 - $input2);
  $return = array("tot" => $total, "diff" => $difference);
  return $return;
}

在你的脚本中调用这个函数时,你需要将返回值赋给一个数组。例如:

$return = maths(10, 5);

在这种情况下,$return['tot'] 将是总和(例如 15),而 $return['diff'] 将是差值(5)。

运行时函数使用

开发者可以在 PHP 脚本中创建函数,而无需使用 function name($param...) {} 语法。这可以通过编程实现动态运行函数。

基于变量名称执行函数

有两种方法可以实现这一点:使用直接调用,或者使用 call_user_funccall_user_func_array

使用 call_user_func 函数调用函数

call_user_funccall_user_func_array 的唯一区别在于,call_user_func_array 允许你将第二个参数作为数组来轻松传递数据,而 call_user_func 则具有无限数量的参数,这在专业应用中不太实用。以下示例使用了一个类来展示更广泛的使用场景:

class Some_Class {
  function my_function($text1, $text2, $text3) {
    $return = $text1 . "\n\n" . $text2 . "\n\n" . $text3;
    return $return;
  }
}
$my_class = new Some_Class();

使用 call_user_func

$one = "One";
$two = "Two";
$three = "Three";
$callback_func = array(&$my_class, "my_function");
$result = call_user_func($callback_func, $one, $two, $three);
echo $result;

使用 call_user_func_array

$one = "One";
$two = "Two";
$three = "Three";
$callback_func = array(&$my_class, "my_function");
$result = call_user_func_array($callback_func, array($one, $two, $three));
echo $result;

注意,在这两个示例中如何使用 call_user_funccall_user_func_arraycall_user_func_array 允许脚本更动态地执行函数。

由于没有展示使用这两个函数调用非类函数的例子,下面是这些示例:

使用 call_user_func

$one = "One";
$two = "Two";
$three = "Three";
$callback_func = "my_function";
$result = call_user_func($callback_func, $one, $two, $three);
echo $result;

使用 call_user_func_array

$one = "One";
$two = "Two";
$three = "Three";
$callback_func = "my_function";
$result = call_user_func_array($callback_func, array($one, $two, $three));
echo $result;

更复杂的示例

$my_func($param1, $param2);
$my_class_name = new ClassObject();
$my_class_name->$my_func_from_that_class($param1, $param2);
// "->" 符号是一个减号后跟一个“更大”的符号。它允许你
// 使用在另一个 PHP 类中定义的函数。这直接来自
// 面向对象编程。通过构造函数,可以执行该类的函数。
// 这个特定的示例是一个不返回值的函数。
call_user_func($my_func, $param1, $param2);

call_user_func(array(&${$my_class_name}, $my_func), $param1, $param2);
// 为表示类对象的变量添加 & 前缀,允许你传递
// 类对象作为引用,而不是对象的副本。在这个示例中,这意味着
// `$my_class_name` 对象将会创建副本,函数将在副本上执行,
// 当函数结束时,原始对象不会被修改。通过引用传递对象,
// 传递的是该对象在内存中的地址,`call_user_func` 将会修改实际对象。

call_user_func_array($my_func, array($param1, $param2));
// 最强大、最动态的示例
call_user_func_array(array(&${$my_class_name}, $my_func), array($param1, $param2));
function positif($x, $y) {
  $x = 2;
  $y = 5;
  $z = $x + $y;
  echo $z;
}

positif($x, $y);

创建运行时函数

创建运行时函数是一种非常好的使脚本更动态的方法:

$function_name = create_function('$one, $two', 'return $one + $two;');
echo $function_name . "\n\n";
echo $function_name("1.5", "2");

create_function 创建一个具有 $one$two 参数的函数,并包含用于评估 return... 的代码。当 create_function 执行时,它将函数的信息存储在内存中,并返回函数的名称。这意味着你不能自定义函数的名称,尽管大多数开发者希望能够自定义。

引用

echo

最后修改: 2025年01月9日 星期四 23:04