PHP函数概述
函数是一段可以重复使用的代码块,它接受输入、处理数据并返回结果。PHP提供了大量的内置函数,同时也允许用户创建自定义函数。
函数的优势:
- 代码复用: 避免重复编写相同的代码
- 模块化: 将复杂任务分解为小函数
- 可维护性: 修改功能只需修改一处
- 可读性: 使用有意义的函数名提高代码可读性
- 测试方便: 可以单独测试每个函数
- 团队协作: 不同开发者可以负责不同函数
创建自定义函数
使用 function 关键字创建自定义函数。
基本函数定义
<?php
// 定义简单的函数
function sayHello() {
echo "Hello, World!<br>";
}
// 调用函数
sayHello(); // 输出: Hello, World!
sayHello(); // 可以多次调用
// 带参数的函数
function greet($name) {
echo "Hello, $name!<br>";
}
greet("张三"); // 输出: Hello, 张三!
greet("李四"); // 输出: Hello, 李四!
// 带返回值的函数
function add($a, $b) {
return $a + $b;
}
$result = add(5, 3);
echo "5 + 3 = $result<br>"; // 输出: 5 + 3 = 8
?>
函数命名规范
PHP函数命名遵循以下规则:
- 函数名必须以字母或下划线开头
- 函数名只能包含字母、数字和下划线
- 函数名不区分大小写(但建议保持一致性)
- 使用有意义的名称描述函数功能
- 建议使用小驼峰命名法或下划线分隔
函数参数
PHP函数支持多种参数传递方式。
必需参数
必需参数示例
<?php
function personInfo($name, $age, $city) {
echo "姓名: $name, 年龄: $age, 城市: $city<br>";
}
personInfo("王五", 25, "北京"); // 正确调用
// personInfo("赵六", 30); // 错误!缺少参数
?>
默认参数
默认参数示例
<?php
function greetPerson($name, $greeting = "Hello") {
echo "$greeting, $name!<br>";
}
greetPerson("张三"); // 输出: Hello, 张三!
greetPerson("李四", "Hi"); // 输出: Hi, 李四!
greetPerson("王五", "你好"); // 输出: 你好, 王五!
// 多个默认参数
function createEmail($username, $domain = "example.com", $tld = "com") {
return "$username@$domain.$tld";
}
echo createEmail("john") . "<br>"; // john@example.com
echo createEmail("jane", "gmail") . "<br>"; // jane@gmail.com
echo createEmail("bob", "company", "org") . "<br>"; // bob@company.org
?>
可变长度参数
可变长度参数示例
<?php
// 使用 func_get_args()
function sum() {
$args = func_get_args();
$total = 0;
foreach ($args as $num) {
$total += $num;
}
return $total;
}
echo "总和: " . sum(1, 2, 3) . "<br>"; // 6
echo "总和: " . sum(10, 20, 30, 40) . "<br>"; // 100
// 使用 ... 运算符 (PHP 5.6+)
function sumNumbers(...$numbers) {
return array_sum($numbers);
}
echo "总和: " . sumNumbers(1, 2, 3, 4, 5) . "<br>"; // 15
?>
引用参数
通过在参数前添加 & 符号,可以传递变量的引用而不是值。
引用参数示例
<?php
function increment(&$value) {
$value++;
}
$num = 5;
increment($num);
echo $num; // 输出: 6 (原始值被修改)
// 对比值传递
function incrementCopy($value) {
$value++;
return $value;
}
$num = 5;
$result = incrementCopy($num);
echo "原始值: $num, 返回值: $result"; // 原始值: 5, 返回值: 6
?>
返回值
函数可以使用 return 语句返回值。
返回值示例
<?php
// 返回单个值
function multiply($a, $b) {
return $a * $b;
}
$product = multiply(4, 5);
echo "4 * 5 = $product<br>"; // 20
// 返回多个值(使用数组)
function calculate($a, $b) {
return [
'sum' => $a + $b,
'difference' => $a - $b,
'product' => $a * $b,
'quotient' => $a / $b
];
}
$results = calculate(10, 2);
echo "和: " . $results['sum'] . "<br>";
echo "差: " . $results['difference'] . "<br>";
echo "积: " . $results['product'] . "<br>";
echo "商: " . $results['quotient'] . "<br>";
// 提前返回
function isEven($number) {
if (!is_numeric($number)) {
return false; // 提前返回
}
return $number % 2 == 0;
}
echo "4是偶数吗? " . (isEven(4) ? "是" : "否") . "<br>";
echo "abc是偶数吗? " . (isEven("abc") ? "是" : "否") . "<br>";
?>
返回类型声明
PHP 7+ 支持返回类型声明,可以在函数定义中指定返回类型。
返回类型声明示例
<?php
// 指定返回类型为整数
function addNumbers(int $a, int $b) : int {
return $a + $b;
}
echo addNumbers(5, 10); // 15
// 返回类型可以是:int, float, string, bool, array, object, callable, self, parent, void
function getUserData() : array {
return [
'name' => '张三',
'age' => 25,
'email' => 'zhangsan@example.com'
];
}
$user = getUserData();
echo "用户名: " . $user['name'];
?>
变量作用域
函数内部的变量与外部变量有不同的作用域。
变量作用域示例
<?php
$globalVar = "全局变量";
function testScope() {
$localVar = "局部变量";
echo "函数内: $localVar<br>"; // 可以访问局部变量
// 使用 global 关键字访问全局变量
global $globalVar;
echo "函数内: $globalVar<br>"; // 可以访问全局变量
// 或者使用 $GLOBALS 数组
echo "函数内: " . $GLOBALS['globalVar'] . "<br>";
}
testScope();
echo "函数外: $globalVar<br>"; // 可以访问全局变量
// echo $localVar; // 错误!不能访问局部变量
// 静态变量
function counter() {
static $count = 0;
$count++;
echo "计数: $count<br>";
return $count;
}
counter(); // 计数: 1
counter(); // 计数: 2
counter(); // 计数: 3
?>
常用内置函数
PHP提供了大量内置函数,以下是一些常用类别:
字符串函数
字符串函数示例
<?php
$text = " Hello, World! ";
echo "原始: '$text'<br>";
echo "长度: " . strlen($text) . "<br>";
echo "去空格: '" . trim($text) . "'<br>";
echo "大写: " . strtoupper($text) . "<br>";
echo "小写: " . strtolower($text) . "<br>";
echo "替换: " . str_replace("World", "PHP", $text) . "<br>";
echo "子串: " . substr($text, 2, 5) . "<br>";
echo "单词数: " . str_word_count($text) . "<br>";
echo "反转: " . strrev($text) . "<br>";
?>
数学函数
数学函数示例
<?php
$number = -5.75;
echo "原始: $number<br>";
echo "绝对值: " . abs($number) . "<br>";
echo "向上取整: " . ceil($number) . "<br>";
echo "向下取整: " . floor($number) . "<br>";
echo "四舍五入: " . round($number) . "<br>";
echo "平方根: " . sqrt(16) . "<br>";
echo "随机数: " . rand(1, 100) . "<br>";
echo "最大值: " . max(10, 20, 5, 35) . "<br>";
echo "最小值: " . min(10, 20, 5, 35) . "<br>";
echo "圆周率: " . pi() . "<br>";
?>
数组函数
数组函数示例
<?php
$fruits = ["apple", "banana", "orange"];
echo "数组: " . implode(", ", $fruits) . "<br>";
echo "元素个数: " . count($fruits) . "<br>";
echo "是否包含banana: " . (in_array("banana", $fruits) ? "是" : "否") . "<br>";
sort($fruits);
echo "排序后: " . implode(", ", $fruits) . "<br>";
// 更多数组函数示例
$numbers = [1, 2, 3, 4, 5];
echo "数组和: " . array_sum($numbers) . "<br>";
echo "数组乘积: " . array_product($numbers) . "<br>";
$user = ['name' => '张三', 'age' => 25, 'city' => '北京'];
echo "数组键: " . implode(", ", array_keys($user)) . "<br>";
echo "数组值: " . implode(", ", array_values($user)) . "<br>";
?>
日期时间函数
日期时间函数示例
<?php
echo "当前时间戳: " . time() . "<br>";
echo "当前日期: " . date("Y-m-d") . "<br>";
echo "当前日期时间: " . date("Y-m-d H:i:s") . "<br>";
echo "格式化日期: " . date("l, F j, Y") . "<br>";
// 创建特定日期
$futureDate = strtotime("+1 week");
echo "一周后的日期: " . date("Y-m-d", $futureDate) . "<br>";
// 计算日期差
$date1 = new DateTime("2023-01-01");
$date2 = new DateTime("2023-12-31");
$interval = $date1->diff($date2);
echo "日期差: " . $interval->days . " 天<br>";
?>
匿名函数
匿名函数(闭包)是没有名称的函数。
匿名函数示例
<?php
// 基本匿名函数
$greet = function($name) {
return "Hello, $name!";
};
echo $greet("张三") . "<br>";
// 使用 use 关键字访问外部变量
$prefix = "尊敬的";
$formalGreet = function($name) use ($prefix) {
return "$prefix $name,您好!";
};
echo $formalGreet("李四") . "<br>";
// 作为回调函数使用
$numbers = [1, 2, 3, 4, 5];
$squared = array_map(function($n) {
return $n * $n;
}, $numbers);
echo "平方: " . implode(", ", $squared) . "<br>";
// 箭头函数 (PHP 7.4+)
$cubed = array_map(fn($n) => $n * $n * $n, $numbers);
echo "立方: " . implode(", ", $cubed) . "<br>";
?>
递归函数
递归函数是调用自身的函数,常用于解决可以分解为相似子问题的问题。
递归函数示例
<?php
// 计算阶乘
function factorial($n) {
if ($n <= 1) {
return 1;
}
return $n * factorial($n - 1);
}
echo "5的阶乘: " . factorial(5) . "<br>"; // 120
// 斐波那契数列
function fibonacci($n) {
if ($n == 0) {
return 0;
} elseif ($n == 1) {
return 1;
} else {
return fibonacci($n - 1) + fibonacci($n - 2);
}
}
echo "斐波那契数列前10项: ";
for ($i = 0; $i < 10; $i++) {
echo fibonacci($i) . " ";
}
echo "<br>";
?>
可变函数
PHP支持可变函数,即通过变量来调用函数。
可变函数示例
<?php
function sayHello() {
return "Hello!";
}
function sayGoodbye() {
return "Goodbye!";
}
$functionName = "sayHello";
echo $functionName(); // 输出: Hello!
$functionName = "sayGoodbye";
echo $functionName(); // 输出: Goodbye!
// 结合数组使用
$functions = [
'greet' => function($name) {
return "Hello, $name!";
},
'farewell' => function($name) {
return "Goodbye, $name!";
}
];
echo $functions['greet']("张三") . "<br>";
echo $functions['farewell']("李四") . "<br>";
?>
函数最佳实践
编写高质量PHP函数的一些建议:
- 单一职责: 每个函数应该只做一件事情
- 有意义的命名: 函数名应该清晰描述其功能
- 适当的长度: 函数应该保持简短,一般不超过20-30行
- 减少副作用: 尽量避免修改全局变量
- 错误处理: 对可能出错的情况进行适当处理
- 文档注释: 使用PHPDoc为函数添加文档
- 参数验证: 验证输入参数的合法性
良好函数示例
<?php
/**
* 计算两个数的除法
*
* @param float $a 被除数
* @param float $b 除数
* @return float 商
* @throws InvalidArgumentException 当除数为0时抛出异常
*/
function divide($a, $b) {
if ($b == 0) {
throw new InvalidArgumentException("除数不能为0");
}
return $a / $b;
}
try {
$result = divide(10, 2);
echo "结果: $result<br>";
} catch (InvalidArgumentException $e) {
echo "错误: " . $e->getMessage() . "<br>";
}
?>
实践练习
创建一个PHP程序,实现以下功能:
- 创建几个自定义函数处理不同的任务
- 使用不同类型的参数(必需、默认、可变长度)
- 创建返回多个值的函数
- 使用全局变量和静态变量
- 创建并使用匿名函数
- 使用一些常用的内置函数
- 实现一个递归函数
- 使用可变函数
提示: 可以创建一个简单的工具库,包含各种实用函数,如字符串处理、数学计算、数据验证等。
综合练习示例
<?php
// 综合函数示例
function calculateStatistics(...$numbers) {
if (empty($numbers)) {
return null;
}
return [
'count' => count($numbers),
'sum' => array_sum($numbers),
'average' => array_sum($numbers) / count($numbers),
'min' => min($numbers),
'max' => max($numbers)
];
}
$stats = calculateStatistics(10, 20, 30, 40, 50);
echo "统计结果:<br>";
foreach ($stats as $key => $value) {
echo "$key: $value<br>";
}
?>