PHP 函数返回值教程:return 语句详解与多类型数据返回实战 - PHP 入门教程

2024-07-06

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

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

1.1 返回基本数据类型函数可以返回任何有效的 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 "
" . $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 "
4 是偶数吗?" . ($check1 ? "是" : "否"); // 输出:4 是偶数吗?是

echo "
7 是偶数吗?" . ($check2 ? "是" : "否"); // 输出:7 是偶数吗?否

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

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

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 "
未找到用户 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 "
产品:" . $item->name . ",价格:$" . $item->price;

// 输出:产品:笔记本电脑,价格:$1200.5

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

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

// 'void' 返回类型声明 (PHP 7.1+) 表示该函数明确不返回任何值

function doSomething(): void

{

echo "这个函数执行了一个动作,但不返回数据。";

// 这里没有 return 语句

}

$result1 = doSomething(); // 输出:这个函数执行了一个动作,但不返回数据。

echo "
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 "
找到用户:" . $userName1; // 输出:找到用户:Alice

$userName2 = findUserById(20);

echo "
找到用户:";

var_dump($userName2); // 输出:NULL

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

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

/**

* 计算商品的折后价格。

*

* @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 . "
";

echo "产品 A 享受 " . $discountA . "% 折扣后的最终价格:$" . number_format($finalPriceA, 2) . "

";

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

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

/**

* 检查电子邮件地址是否有效。

* @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 . "' 是一个有效的邮箱。
";

} else {

echo "'" . $userEmail1 . "' 不是一个有效的邮箱。
";

}

?>