函数是可重用的代码块,用于执行特定任务。PHP有大量内置函数,也支持自定义函数。
<?php
// 定义函数
function greet() {
echo "Hello, World!";
}
// 调用函数
greet(); // 输出: Hello, World!
// 带参数的函数
function greetUser($name) {
echo "Hello, $name!";
}
greetUser("张三"); // 输出: Hello, 张三!
?>
<?php
function add($a, $b) {
return $a + $b;
}
$result = add(5, 3);
echo $result; // 输出: 8
// 返回多个值(使用数组)
function getUser() {
return ["name" => "张三", "age" => 25];
}
$user = getUser();
echo $user["name"]; // 输出: 张三
// PHP 7.1+ 可以使用list解构
[$name, $age] = ["张三", 25];
?>
<?php
function createUser($name, $role = "user", $active = true) {
return [
"name" => $name,
"role" => $role,
"active" => $active
];
}
$user1 = createUser("张三"); // 使用默认值
$user2 = createUser("李四", "admin"); // 覆盖role
$user3 = createUser("王五", "user", false); // 覆盖所有
?>
<?php
// PHP 7+ 支持类型声明
function multiply(int $a, int $b): int {
return $a * $b;
}
echo multiply(5, 3); // 15
// multiply("5", "3"); // 严格模式下会报错
// 可空类型(PHP 7.1+)
function greet(?string $name): string {
return $name ? "Hello, $name" : "Hello, Guest";
}
// 联合类型(PHP 8+)
function process(int|float $number): int|float {
return $number * 2;
}
?>
<?php
// 使用...运算符接收任意数量参数
function sum(...$numbers) {
$total = 0;
foreach ($numbers as $num) {
$total += $num;
}
return $total;
}
echo sum(1, 2, 3); // 6
echo sum(1, 2, 3, 4, 5); // 15
// 结合普通参数
function formatList($separator, ...$items) {
return implode($separator, $items);
}
echo formatList(", ", "苹果", "香蕉", "橙子"); // 苹果, 香蕉, 橙子
?>
<?php
// 默认是值传递
function increment($num) {
$num++;
}
$x = 5;
increment($x);
echo $x; // 5(未改变)
// 引用传递(使用&符号)
function incrementRef(&$num) {
$num++;
}
$y = 5;
incrementRef($y);
echo $y; // 6(已改变)
// 实际应用:交换两个变量
function swap(&$a, &$b) {
$temp = $a;
$a = $b;
$b = $temp;
}
?>
<?php
function test() {
$local = "局部变量";
echo $local; // 可以访问
}
test();
// echo $local; // 错误:未定义变量
?>
<?php
$globalVar = "全局变量";
function useGlobal() {
// 方式1:使用global关键字
global $globalVar;
echo $globalVar;
// 方式2:使用$GLOBALS数组
echo $GLOBALS['globalVar'];
}
useGlobal();
// 修改全局变量
function modifyGlobal() {
global $globalVar;
$globalVar = "已修改";
}
?>
<?php
function counter() {
static $count = 0; // 静态变量保持值
$count++;
echo $count . "\n";
}
counter(); // 输出: 1
counter(); // 输出: 2
counter(); // 输出: 3
// 实际应用:单例模式
function getConnection() {
static $conn = null;
if ($conn === null) {
$conn = new PDO("mysql:host=localhost", "user", "pass");
}
return $conn;
}
?>
<?php
// 将函数赋值给变量
$greet = function($name) {
return "Hello, $name!";
};
echo $greet("张三"); // Hello, 张三!
// 作为回调函数
$numbers = [1, 2, 3, 4, 5];
$squared = array_map(function($n) {
return $n * $n;
}, $numbers);
print_r($squared); // [1, 4, 9, 16, 25]
?>
<?php
$message = "Hello";
// 使用use引入外部变量
$greet = function($name) use ($message) {
return "$message, $name!";
};
echo $greet("张三"); // Hello, 张三!
// 引用传递外部变量
$counter = 0;
$increment = function() use (&$counter) {
$counter++;
};
$increment();
$increment();
echo $counter; // 2
?>
<?php
// 简洁的箭头函数语法
$multiply = fn($a, $b) => $a * $b;
echo $multiply(5, 3); // 15
// 自动捕获外部变量(不需要use)
$factor = 10;
$scale = fn($n) => $n * $factor;
echo $scale(5); // 50
// 用于数组操作
$numbers = [1, 2, 3, 4, 5];
$doubled = array_map(fn($n) => $n * 2, $numbers);
?>
<?php
$str = "Hello World";
strlen($str); // 11 - 字符串长度
strtoupper($str); // "HELLO WORLD"
strtolower($str); // "hello world"
str_replace("World", "PHP", $str); // "Hello PHP"
substr($str, 0, 5); // "Hello"
strpos($str, "World"); // 6 - 查找位置
?>
<?php
$arr = [1, 2, 3, 4, 5];
count($arr); // 5 - 数组长度
array_push($arr, 6); // 添加元素
array_pop($arr); // 移除最后一个元素
array_sum($arr); // 15 - 求和
array_reverse($arr); // 反转数组
in_array(3, $arr); // true - 检查元素是否存在
?>
<?php
abs(-5); // 5 - 绝对值
round(3.7); // 4 - 四舍五入
ceil(3.2); // 4 - 向上取整
floor(3.8); // 3 - 向下取整
max(1, 5, 3); // 5 - 最大值
min(1, 5, 3); // 1 - 最小值
rand(1, 100); // 随机数
pow(2, 3); // 8 - 幂运算
sqrt(16); // 4 - 平方根
?>
<?php
// 计算阶乘
function factorial($n) {
if ($n <= 1) {
return 1;
}
return $n * factorial($n - 1);
}
echo factorial(5); // 120
// 斐波那契数列
function fibonacci($n) {
if ($n <= 1) {
return $n;
}
return fibonacci($n - 1) + fibonacci($n - 2);
}
echo fibonacci(10); // 55
// 遍历目录(递归)
function listFiles($dir) {
$files = scandir($dir);
foreach ($files as $file) {
if ($file != '.' && $file != '..') {
$path = $dir . '/' . $file;
if (is_dir($path)) {
listFiles($path); // 递归调用
} else {
echo $path . "\n";
}
}
}
}
?>
<?php
function sayHello() {
echo "Hello!";
}
function sayGoodbye() {
echo "Goodbye!";
}
$func = "sayHello";
$func(); // 调用sayHello()
// 实际应用:动态调用
$action = $_GET['action'] ?? 'default';
$allowedActions = ['create', 'update', 'delete'];
if (in_array($action, $allowedActions)) {
$functionName = $action . 'User';
$functionName(); // 调用createUser()等
}
?>
<?php
// 使用callable类型
function process(array $data, callable $callback) {
$result = [];
foreach ($data as $item) {
$result[] = $callback($item);
}
return $result;
}
$numbers = [1, 2, 3, 4, 5];
// 使用匿名函数
$doubled = process($numbers, function($n) {
return $n * 2;
});
// 使用内置函数
$strings = process($numbers, 'strval');
?>