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>";
}
?>