跳转到内容

PHP 编程/函数

来自维基教科书,开放世界中的开放书籍
(从 PHP 编程/函数 重定向)

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

计算机编程中的函数非常像数学函数:您可以向函数提供要处理的值,并获得结果,而无需自己进行任何计算。

您还可以在 PHP 手册的函数参考 中找到内置于 PHP 的大量预定义函数列表。

如何调用函数

[编辑 | 编辑源代码]

注意,echo不是一个函数。[1] “调用函数”意味着在脚本中的特定点运行特定函数。调用函数的基本方法包括

  • 调用函数以在新行写入(例如在“;”或“}”之后)
print('I am human, I am.');
  • 调用函数以在控制语句内部写入新行
if ($a == 72) {
  print('I am human, I am.');
}
  • 将函数的返回值分配给一个变量“$var = function()"
$result = sum ($a, 5);
  • 在控制语句的参数括号(表达式)内调用函数
while ($i < count($one)) {

}

在我们之前的示例中,我们已经调用了几个函数。最常见的是我们调用了函数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 = "我正在学习 PHP":

print_two_strings("Hello");

输出

Hello
I'm Learning PHP

另一种获得动态数量参数的方法是使用 PHP 的内置func_num_args, func_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) {
    // Can't divide by 0.
    return false;
  }
  $result = $dividee/$divider;
  return $result;
}

请注意,在else之后没有if。这是因为,如果$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_func或者使用call_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_array在两个示例中都被使用。call_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);
// The -> symbol is a minus sign follow by a "larger than" sign. It allows you to
// use a function that is defined in a different PHP class. It comes directly from
// object-oriented programming. Via a constructor, a function of that class is
// executable. This specific example is a function that returns no values.
call_user_func($my_func, $param1, $param2);

call_user_func(array(&${$my_class_name}, $my_func), $param1, $param2);
// Prefixing a & to a variable that represents a class object allows you to send the
// class object as a reference instead of a copy of the object. In this example this
// means that $my_class_name Object would have a copy made of it, the function will
// act on the copy, and when the function ends. The original object wouldn't suffer
// modifications. Passing an object through its reference passes the address in memory
// where that object is stored and call_user_func will alter the actual object.

call_user_func_array($my_func, array($param1, $param2));
// Most powerful, dynamic example
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,以及要执行的代码,并返回...当create_function被执行时,它会将函数信息存储到内存中并返回函数名。这意味着无法自定义函数名,尽管大多数开发人员更喜欢自定义函数名。

  1. echo


华夏公益教科书