1、什么是函数?
函数,在英文中的单词是function,这个词语有功能的意思,也就是说,使用函数就是在编程的过程中,实现一定的功能。即函数就是实现一定功能的一段特定代码。
在前面的教学中,我们已经学习到了函数的使用了,比如,使用define()函数定义一个常量。在这里我们来讲解自定义函数。
任何有效的 php 代码都有可能出现在函数内部,甚至包括其它函数和 类 定义。
函数名和 PHP 中的其它标识符命名规则相同。有效的函数名以字母或下划线打头,后面跟字母,数字或下划线。可以用正则表达式表示为: ^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$。
PHP 中的所有函数和类都具有全局作用域,可以定义在一个函数之内而在之外调用,反之亦然。
PHP 不支持函数重载,也不可能取消定义或者重定义已声明的函数。
2、什么是自定义函数?
自定义函数是一种在编程中创建的用户自定义的功能代码块。它们允许程序员定义自己的函数,并根据需要在程序中调用它们。自定义函数可以接收参数,执行特定的任务,并返回一个值。
通过使用自定义函数,程序员可以将复杂的任务分解为更小的可重用代码块,提高代码的可读性和可维护性。自定义函数是编程中常用的概念,几乎在所有的编程语言中都有支持。在PHP8中也不例外。
3、定义和调用函数
一般情况下,程序员面对的是自定义函数。其语法结构如下:
function 函数名称(参数1,参数2,……){
函数的具体内容;
}
函数定义完成以后,即可调用这个函数。调用函数的操作比较简单,直接引用函数名并赋予正确的参数,即可完成函数的调用。
<?php
// 定义一个函数
function myfun($a, $b) {
$sum = $a + $b;
$product = $a * $b;
// 返回求和和求积的结果作为数组
return array($sum, $product);
}
// 调用myfun()函数并输出结果
$results = myfun(10, 20);
echo "求和计算结果是: " . $results[0] . "<br>";
echo "求积的计算结果是: " . $results[1];
?>
以上代码在PHP8中的运行结果为:
求和计算结果是: 30
求积的计算结果是: 200
4、函数中的变量作用域
所谓 变量作用域,是指特定变量在代码中可以被访问到的位置。在PHP8中,有6种基本变量作用域法则:
一、内置超全局变量。在代码中任意位置都能访问的变量。
二、常数。一旦声明,他就是全局性的,可以在函数的内外使用。
三、全局变量。在代码声明中,可以爱代码中访问,但是不能在函数内部访问。
四、在函数中声明为全局变量的变量。就是同名的全局变量。
五、在函数中创建和声明为静态变量的变量。该变量在函数外是无法访问的,但是这个静态变量的值是可以保留的。
六、在函数中创建和声明的局部变量。在函数外是无法访问的,并且在本函数终止时终止并推出。
4.1、超全局变量
PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们。
这些超全局变量是:
$GLOBALS:它是一个包含了当前脚本中所有全局变量的数组。
$_SERVER:它是一个包含了服务器和执行环境信息的数组,如 HTTP 请求头、路径等。
$_GET:它是一个包含通过 GET 方法传递给当前脚本的参数和值的数组。
$_POST:它是一个包含通过 POST 方法传递给当前脚本的参数和值的数组。
$_FILES:它是一个包含上传文件的相关信息的数组,包括文件名、类型、大小等。
$_COOKIE:它是一个包含客户端发送的 Cookie 的相关信息的数组。
$_SESSION:它是一个包含用户会话数据的数组,用于存储特定用户在不同页面之间共享的数据。
$_REQUEST:它是一个包含了通过 HTTP 请求方法(GET、POST和COOKIES)传递给当前脚本的参数和值的数组。
$_ENV:它是一个包含环境变量的数组,这些变量是由操作系统或 web 服务器设置的。
请注意,对这些超全局变量进行直接引用可能存在安全性和可靠性问题。在使用时,请确保验证和过滤来自用户的输入以防止潜在的安全漏洞。
4.2、全局变量
全局变量就是在函数外声明的变量,在代码中可以访问,但是在函数内部是不能访问的。这是因为函数默认就不能访问起外部的全局变量。
函数内访问全局变量示范代码:
<?php
$a = "PHP"; //定义全局变量
function xuexi() { // 定义一个函数
echo "正在学习的是: " .$a; //函数内调用全局变量
}
xuexi(); //运行函数
?>
在PHP8中运行的结果为:
Warning: Undefined variable $a in D:\phpenv\www\localhost\test.php on line 4
正在学习的是:
上面内容明显是异常信息,如果想让函数访问某个全局变量,可以在函数中使用global关键字来声明。
使用global关键字访问全局变量,示例代码:
<?php
$a = "PHP"; //定义全局变量
function xuexi() { // 定义一个函数
global $a; //函数内声明全局变量
echo "正在学习的是: " .$a; //函数内调用全局变量
}
xuexi(); //运行函数
?>
在PHP8中运行的结果为:
正在学习的是: PHP
也可以使用超全局变量中的$GLOBALS数组进行访问。
使用$GLOBALS数组进行访问全局变量,示范代码:
<?php
$a = "PHP8"; //定义全局变量
function xuexi() { // 定义一个函数
$a = $GLOBALS["a"]; //通过$GLOBALS数组访问全局变量
echo "正在学习的是: " .$a; //函数内调用全局变量
}
xuexi(); //运行函数
?>
在PHP8中运行的结果为:
正在学习的是: PHP8
3、静态变量
静态变量只是在函数内存在,函数外无法访问。但是执行以后,其值会保留。
也就是说,这一次执行完毕以后,这个静态变量的值保留,下一次执行此函数,这个值还可以调用。
当在 PHP 8 中使用静态变量时,您可以在函数内部声明一个变量,并在后续的调用中保持其值不变。这样做可以在多次函数调用之间共享数据。
以下是一个示例代码:
<?php
function increment() {
static $counter = 0;
$counter++;
echo "Counter value: " . $counter . "<br>";
}
increment();
increment();
increment();
?>
以上代码在PHP8中运行的结果为:
Counter value: 1
Counter value: 2
Counter value: 3
在上面的代码中,我们定义了一个名为 $counter 的静态变量,并初始化为 0。每当 increment() 函数被调用时,该变量都会自增并输出当前计数器的值。
由于 $counter 是一个静态变量,在函数调用之间它的值得以保持和共享。因此,每次调用 increment() 都会使计数器递增。