PHP 零基础教程

PHP 函数返回值

函数通常用于执行计算或检索数据,而这些操作的结果往往需要在函数体外部被使用。从函数中返回(Return)值,允许函数将处理好的数据发送回调用它的那部分代码,从而实现对该数据的进一步处理或显示。

1. return 语句

return 语句用于将一个值从函数内部发送回调用者。当 PHP 在函数内部遇到 return 语句时,函数会立即终止执行,并将指定的值发送回去。在函数中,位于 return 语句之后的任何代码都不会被执行。

1.1 返回基本数据类型

函数可以返回任何有效的 PHP 数据类型,包括字符串、整数、浮点数和布尔值。

<?php
// PHP 7+ 语法:指定参数类型为 int,返回值类型也为 int
function calculateSum(int $num1, int $num2): int
{
    $sum = $num1 + $num2;
    return $sum; // 返回整数总和
    // echo "这行代码永远不会执行"; 
}

$result = calculateSum(5, 10);
echo "总和是:" . $result; // 输出:总和是:15

function getGreeting(string $name): string
{
    $greeting = "你好," . $name . "!";
    return $greeting; // 返回字符串问候语
}

$message = getGreeting("Alice");
echo "<br>" . $message; // 输出:你好,Alice!

function isEven(int $number): bool
{
    if ($number % 2 == 0) {
        return true; // 返回布尔值 true
    } else {
        return false; // 返回布尔值 false
    }
}

$check1 = isEven(4); // $check1 将会是 true
$check2 = isEven(7); // $check2 将会是 false

echo "<br>4 是偶数吗?" . ($check1 ? "是" : "否"); // 输出:4 是偶数吗?是
echo "<br>7 是偶数吗?" . ($check2 ? "是" : "否"); // 输出:7 是偶数吗?否
?>

calculateSum 函数中,return $sum; 语句将计算出的总和发送回函数被调用的地方。然后,调用者将这个值存储在 $result 变量中。类似地,getGreeting 返回一个字符串,isEven 返回一个布尔值。

1.2 返回数组和对象

函数也可以返回更复杂的数据类型,如数组和对象,这在需要一次性返回多个相关值或结构化数据时非常常见。

<?php
function getUserDetails(int $userId): array
{
    // 在真实的应用程序中,这通常是从数据库获取数据
    if ($userId === 1) {
        return [
            'id' => 1,
            'name' => 'John Doe',
            'email' => 'john.doe@example.com'
        ];
    } elseif ($userId === 2) {
        return [
            'id' => 2,
            'name' => 'Jane Smith',
            'email' => 'jane.smith@example.com'
        ];
    } else {
        return []; // 如果未找到用户,返回一个空数组
    }
}

$user1 = getUserDetails(1);
echo "用户 1 姓名:" . $user1['name'] . ",邮箱:" . $user1['email']; 
// 输出:用户 1 姓名:John Doe,邮箱:john.doe@example.com

$user3 = getUserDetails(3);
if (empty($user3)) {
    echo "<br>未找到用户 3。"; // 输出:未找到用户 3。
}

// 返回对象的示例 (初步演示,对象将在后续模块详细讲解)
class Product {
    public string $name;
    public float $price;
    public function __construct(string $name, float $price) {
        $this->name = $name;
        $this->price = $price;
    }
}

function createProduct(string $name, float $price): Product
{
    $product = new Product($name, $price);
    return $product;
}

$item = createProduct("笔记本电脑", 1200.50);
echo "<br>产品:" . $item->name . ",价格:$" . $item->price; 
// 输出:产品:笔记本电脑,价格:$1200.5
?>

getUserDetails 函数返回一个包含用户信息的关联数组。这允许将相关数据捆绑到一个单一的返回值中。createProduct 函数演示了返回一个对象,对象可以封装数据以及潜在的行为。

1.3 返回 null 或无返回值

函数并不是必须返回一个值。如果一个函数执行到了末尾都没有遇到 return 语句,它会隐式地返回 null。你也可以明确地写出 return null;

<?php
// 'void' 返回类型声明 (PHP 7.1+) 表示该函数明确不返回任何值
function doSomething(): void 
{
    echo "这个函数执行了一个动作,但不返回数据。";
    // 这里没有 return 语句
}

$result1 = doSomething(); // 输出:这个函数执行了一个动作,但不返回数据。
echo "<br>doSomething() 的结果:" . var_dump($result1); // 输出:NULL

// '?string' 类型提示 (PHP 7.1+) 表示该函数可以返回字符串,也可以返回 null
function findUserById(int $id): ?string 
{
    if ($id === 10) {
        return "Alice";
    }
    return null; // 如果未找到用户,明确返回 null
}

$userName1 = findUserById(10);
echo "<br>找到用户:" . $userName1; // 输出:找到用户:Alice

$userName2 = findUserById(20);
echo "<br>找到用户:";
var_dump($userName2); // 输出:NULL
?>

明确返回 null 是表示操作失败或未找到结果的一种极常见的设计模式。

2. 综合实战案例

2.1 计算折后价格

想象一个电子商务场景,你需要计算商品应用折扣后的最终价格。一个函数可以封装这个逻辑并返回计算出的价格。

<?php
/**
 * 计算商品的折后价格。
 *
 * @param float $originalPrice 初始原价。
 * @param float $discountPercentage 折扣百分比 (例如,10 代表 10%)。
 * @return float 打折后的最终价格。
 */
function calculateDiscountedPrice(float $originalPrice, float $discountPercentage): float
{
    if ($discountPercentage < 0 || $discountPercentage > 100) {
        // 处理无效的折扣百分比,为了简单起见,这里直接返回原价
        return $originalPrice;
    }
    
    $discountAmount = $originalPrice * ($discountPercentage / 100);
    $finalPrice = $originalPrice - $discountAmount;
    
    return $finalPrice;
}

$productA_price = 150.00;
$discountA = 15; // 15% 折扣
$finalPriceA = calculateDiscountedPrice($productA_price, $discountA);

echo "产品 A 原价:$" . $productA_price . "<br>";
echo "产品 A 享受 " . $discountA . "% 折扣后的最终价格:$" . number_format($finalPriceA, 2) . "<br><br>";
?>

这个函数是可高度复用的,它将定价逻辑与应用程序的其他部分隔离开来。调用者无需关心内部是如何计算的,只需要拿到返回的 $finalPriceA 去显示即可。

2.2 验证用户输入

在处理表单提交时,你经常需要验证用户的各项输入(例如邮箱格式、最小密码长度)。此时让函数返回布尔值 (true/false) 来指示验证是通过还是失败,是非常标准的设计。

<?php
/**
 * 检查电子邮件地址是否有效。
 * @return bool 如果邮箱有效返回 true,否则返回 false。
 */
function isValidEmail(string $email): bool
{
    // filter_var 是 PHP 内置极其强大的验证函数
    return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}

$userEmail1 = "test@example.com";
if (isValidEmail($userEmail1)) {
    echo "'" . $userEmail1 . "' 是一个有效的邮箱。<br>"; 
} else {
    echo "'" . $userEmail1 . "' 不是一个有效的邮箱。<br>";
}
?>