PHP函数

全面学习PHP函数的定义、使用和高级特性

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程序,实现以下功能:

  1. 创建几个自定义函数处理不同的任务
  2. 使用不同类型的参数(必需、默认、可变长度)
  3. 创建返回多个值的函数
  4. 使用全局变量和静态变量
  5. 创建并使用匿名函数
  6. 使用一些常用的内置函数
  7. 实现一个递归函数
  8. 使用可变函数
提示: 可以创建一个简单的工具库,包含各种实用函数,如字符串处理、数学计算、数据验证等。
综合练习示例
<?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>";
}
?>