Appearance
第 8 章:函数
8.1 自定义函数语法
基本语法
php
<?php
function 函数名(参数1, 参数2, ...) {
// 函数体
return 返回值;
}
?>示例代码
php
<?php
// 无参数无返回值的函数
function sayHello() {
echo "Hello, PHP!";
}
// 调用函数
sayHello();
// 有参数无返回值的函数
function greet($name) {
echo "Hello, $name!";
}
greet("张三");
// 有参数有返回值的函数
function add($a, $b) {
return $a + $b;
}
$result = add(5, 3);
echo $result; // 输出 8
?>8.2 形参、实参、默认参数
形参和实参
- 形参:函数定义时的参数,是形式上的参数
- 实参:函数调用时传递的参数,是实际的值
php
<?php
function add($a, $b) { // $a 和 $b 是形参
return $a + $b;
}
$result = add(5, 3); // 5 和 3 是实参
echo $result; // 输出 8
?>默认参数
默认参数允许函数在调用时不传递某些参数,使用默认值。
php
<?php
function greet($name, $greeting = "Hello") {
echo "$greeting, $name!";
}
// 使用默认值
greet("张三"); // 输出 "Hello, 张三!"
// 覆盖默认值
greet("张三", "Hi"); // 输出 "Hi, 张三!"
?>注意事项
- 默认参数必须放在参数列表的末尾
- 可以有多个默认参数
php
<?php
// 正确的写法
function calculate($a, $b = 1, $operation = "add") {
switch ($operation) {
case "add":
return $a + $b;
case "subtract":
return $a - $b;
default:
return $a + $b;
}
}
// 错误的写法(默认参数后面不能有非默认参数)
// function calculate($a = 0, $b, $operation) {
// // ...
// }
?>8.3 返回值 return
return 语句
return 语句用于从函数中返回值,并终止函数的执行。
php
<?php
function add($a, $b) {
return $a + $b; // 返回计算结果
// return 语句后的代码不会执行
echo "这行代码不会执行";
}
$result = add(5, 3);
echo $result; // 输出 8
?>返回多个值
PHP 函数只能返回一个值,但可以通过数组返回多个值。
php
<?php
function getPerson() {
return [
"name" => "张三",
"age" => 25,
"email" => "zhangsan@example.com"
];
}
$person = getPerson();
echo $person["name"]; // 输出 "张三"
echo $person["age"]; // 输出 25
?>8.4 变量作用域(全局 / 局部)
局部变量
在函数内部定义的变量,只在函数内部有效。
php
<?php
function test() {
$localVar = "局部变量";
echo $localVar; // 可以访问
}
test();
echo $localVar; // 错误:变量未定义
?>全局变量
在函数外部定义的变量,默认情况下在函数内部不能直接访问。
php
<?php
$globalVar = "全局变量";
function test() {
echo $globalVar; // 错误:变量未定义
}
test();
?>使用 global 关键字
使用 global 关键字可以在函数内部访问全局变量。
php
<?php
$globalVar = "全局变量";
function test() {
global $globalVar;
echo $globalVar; // 可以访问
}
test(); // 输出 "全局变量"
?>使用 $GLOBALS 数组
$GLOBALS 是一个超全局数组,包含所有全局变量。
php
<?php
$globalVar = "全局变量";
function test() {
echo $GLOBALS["globalVar"]; // 可以访问
}
test(); // 输出 "全局变量"
?>8.5 系统常用函数(字符串、数组、时间)
字符串函数
| 函数 | 描述 | 示例 |
|---|---|---|
strlen() | 获取字符串长度 | strlen("Hello") → 5 |
strpos() | 查找字符串位置 | strpos("Hello", "e") → 1 |
substr() | 截取字符串 | substr("Hello", 1, 3) → "ell" |
str_replace() | 替换字符串 | str_replace("Hello", "Hi", "Hello World") → "Hi World" |
strtolower() | 转换为小写 | strtolower("HELLO") → "hello" |
strtoupper() | 转换为大写 | strtoupper("hello") → "HELLO" |
trim() | 去除首尾空格 | trim(" Hello ") → "Hello" |
数组函数
| 函数 | 描述 | 示例 |
|---|---|---|
count() | 获取数组长度 | count([1, 2, 3]) → 3 |
array_push() | 在数组末尾添加元素 | array_push($arr, "value") |
array_pop() | 删除数组末尾元素 | array_pop($arr) |
array_shift() | 删除数组开头元素 | array_shift($arr) |
array_unshift() | 在数组开头添加元素 | array_unshift($arr, "value") |
array_merge() | 合并数组 | array_merge($arr1, $arr2) |
in_array() | 检查元素是否在数组中 | in_array("value", $arr) |
sort() | 对数组排序 | sort($arr) |
时间函数
| 函数 | 描述 | 示例 |
|---|---|---|
date() | 格式化日期时间 | date("Y-m-d H:i:s") → "2024-01-01 12:00:00" |
time() | 获取当前时间戳 | time() → 1609459200 |
strtotime() | 将字符串转换为时间戳 | strtotime("2024-01-01") → 1609459200 |
mktime() | 创建时间戳 | mktime(0, 0, 0, 1, 1, 2024) → 1609459200 |
8.6 递归函数(简单了解)
递归函数的概念
递归函数是指在函数内部调用自身的函数。
示例:计算阶乘
php
<?php
function factorial($n) {
if ($n <= 1) {
return 1;
}
return $n * factorial($n - 1);
}
echo factorial(5); // 输出 120 (5 × 4 × 3 × 2 × 1)
?>示例:斐波那契数列
php
<?php
function fibonacci($n) {
if ($n <= 1) {
return $n;
}
return fibonacci($n - 1) + fibonacci($n - 2);
}
// 输出前 10 个斐波那契数
for ($i = 0; $i < 10; $i++) {
echo fibonacci($i) . " ";
}
// 输出:0 1 1 2 3 5 8 13 21 34
?>注意事项
- 递归函数必须有终止条件,否则会导致无限递归
- 递归函数可能会消耗较多的内存,对于大规模计算可能不如迭代效率高
8.7 实操:封装常用工具函数
创建 functions-demo.php 文件
php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>函数示例</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
}
.section {
margin: 20px 0;
padding: 15px;
border: 1px solid #ccc;
border-radius: 5px;
}
h2 {
color: #333;
}
pre {
background-color: #f5f5f5;
padding: 10px;
border-radius: 3px;
}
</style>
</head>
<body>
<h1>函数示例</h1>
<?php
// 封装常用工具函数
/**
* 计算两个数的和
* @param int $a 第一个数
* @param int $b 第二个数
* @return int 两数之和
*/
function add($a, $b) {
return $a + $b;
}
/**
* 计算两个数的差
* @param int $a 被减数
* @param int $b 减数
* @return int 两数之差
*/
function subtract($a, $b) {
return $a - $b;
}
/**
* 计算两个数的积
* @param int $a 第一个数
* @param int $b 第二个数
* @return int 两数之积
*/
function multiply($a, $b) {
return $a * $b;
}
/**
* 计算两个数的商
* @param int $a 被除数
* @param int $b 除数
* @return float 两数之商
*/
function divide($a, $b) {
if ($b == 0) {
return "错误:除数不能为零";
}
return $a / $b;
}
/**
* 格式化日期
* @param string $format 日期格式
* @param int $timestamp 时间戳
* @return string 格式化后的日期
*/
function formatDate($format = "Y-m-d H:i:s", $timestamp = null) {
if ($timestamp === null) {
$timestamp = time();
}
return date($format, $timestamp);
}
/**
* 生成随机字符串
* @param int $length 字符串长度
* @return string 随机字符串
*/
function generateRandomString($length = 10) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
/**
* 检查邮箱格式是否正确
* @param string $email 邮箱地址
* @return bool 是否为有效邮箱
*/
function isValidEmail($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}
// 测试函数
echo '<div class="section">';
echo '<h2>数学函数</h2>';
echo "5 + 3 = " . add(5, 3) . '<br>';
echo "5 - 3 = " . subtract(5, 3) . '<br>';
echo "5 × 3 = " . multiply(5, 3) . '<br>';
echo "5 ÷ 3 = " . divide(5, 3) . '<br>';
echo "5 ÷ 0 = " . divide(5, 0) . '<br>';
echo '</div>';
echo '<div class="section">';
echo '<h2>日期函数</h2>';
echo "当前时间:" . formatDate() . '<br>';
echo "只显示日期:" . formatDate("Y-m-d") . '<br>';
echo "只显示时间:" . formatDate("H:i:s") . '<br>';
echo '</div>';
echo '<div class="section">';
echo '<h2>字符串函数</h2>';
echo "随机字符串:" . generateRandomString() . '<br>';
echo "长度为 20 的随机字符串:" . generateRandomString(20) . '<br>';
echo '</div>';
echo '<div class="section">';
echo '<h2>验证函数</h2>';
echo "zhangsan@example.com 是否有效:" . (isValidEmail("zhangsan@example.com") ? '是' : '否') . '<br>';
echo "invalid-email 是否有效:" . (isValidEmail("invalid-email") ? '是' : '否') . '<br>';
echo '</div>';
// 递归函数示例
echo '<div class="section">';
echo '<h2>递归函数</h2>';
function factorial($n) {
if ($n <= 1) {
return 1;
}
return $n * factorial($n - 1);
}
echo "5 的阶乘:" . factorial(5) . '<br>';
echo "10 的阶乘:" . factorial(10) . '<br>';
echo '</div>';
?>
</body>
</html>访问页面
- 将文件保存到网站根目录
- 打开浏览器,访问
http://localhost/functions-demo.php - 查看页面效果
小结
通过本章的学习,你掌握了 PHP 函数的基本概念和使用方法,包括自定义函数的定义和调用、参数传递、返回值、变量作用域以及常用的系统函数。你还了解了递归函数的基本原理和应用。函数是 PHP 编程的重要组成部分,它可以将代码模块化,提高代码的复用性和可维护性。在后续的学习中,你将经常使用函数来组织和管理代码。
