Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

README.md

实验 05:PHP 自定义函数与参数

本实验学习如何把重复的数据处理逻辑封装成函数,并在不同位置重复调用。

实验目标

完成本实验后,应能够理解:

  • function
  • 函数名
  • 参数
  • 返回值
  • 默认参数
  • 参数类型
  • 返回值类型
  • bool
  • 函数复用
  • 为什么函数可以降低重复代码

文件结构

05-php-function/
├── index.php
└── README.md

1. 什么是函数

函数可以理解为:

给一段代码起一个名字
↓
需要时直接调用

例如:

function sayHello(): string
{
    return 'Hello PHP';
}

调用:

echo sayHello();

2. 函数参数

参数就是传给函数的数据。

例如:

function formatPrice(float $price): string
{
    return '¥' . number_format($price, 2);
}

调用:

formatPrice(25.8);

这里:

25.8
↓
传给 $price
↓
函数处理
↓
返回结果

输出:

¥25.80

3. 多个参数

函数可以接收多个参数:

function formatPrice(float $price, string $currency): string
{
    return $currency . number_format($price, 2);
}

调用:

formatPrice(25.8, '$');

4. 默认参数

本实验使用:

function formatPrice(
    float $price,
    string $currency = '¥'
): string

因为 $currency 有默认值,所以可以直接:

formatPrice(25.8);

结果:

¥25.80

也可以覆盖默认值:

formatPrice(25.8, '$');

结果:

$25.80

5. 返回值

函数通常通过:

return

把结果返回给调用位置。

例如:

function getDiscountPrice(
    float $price,
    float $discount = 0.9
): float {
    return $price * $discount;
}

调用:

$price = getDiscountPrice(100);

结果:

90

6. 参数类型

本实验启用了:

declare(strict_types=1);

并使用:

string
int
float
bool

例如:

function getStockText(int $stock): string

这里代表:

$stock
应该是整数

函数返回值
应该是字符串

这种写法可以让代码意图更加清晰。


7. bool 返回值

本实验有一个函数:

function isPurchasable(int $stock): bool
{
    return $stock > 0;
}

它只返回:

true
或
false

因此可以用于条件判断:

if (isPurchasable($stock)) {
    echo '可以买';
}

8. 为什么函数很重要

假设页面中有 20 个地方需要格式化价格。

如果每次都写:

'¥' . number_format($price, 2)

以后规则变化,就可能需要修改 20 个地方。

如果封装成:

formatPrice($price)

以后只需要修改:

formatPrice()

函数内部即可。

因此函数最核心的价值之一是:

减少重复
+
集中维护规则

9. 本实验中的函数

e()

e()

负责安全输出字符串。

formatPrice()

formatPrice()

负责价格格式化。

getStockText()

getStockText()

负责库存状态判断。

isPurchasable()

isPurchasable()

负责判断商品是否可购买。

getDiscountPrice()

getDiscountPrice()

负责计算折扣价格。


10. 与 WordPress 的关系

WordPress 中大量功能都是通过函数调用完成的。

例如:

the_title();
the_permalink();
get_header();
get_footer();
has_post_thumbnail();

当看到:

get_header();

可以把它理解为:

WordPress 已经提前定义好了一个函数

↓

我们只负责调用它

WordPress 本质上就是建立在大量 PHP 函数和类之上的系统。


11. 与 WooCommerce 的关系

WooCommerce 中也经常看到:

$product->get_name();
$product->get_price();
$product->is_in_stock();

这里虽然已经涉及对象和方法,但思想与函数非常接近:

传入数据
或
读取对象数据

↓

执行内部逻辑

↓

获得结果

OOP 会在后期进阶阶段再单独学习。


可以尝试修改

修改默认折扣

将:

$discount = 0.9

修改为:

$discount = 0.8

观察价格变化。


增加一个函数

例如:

function getProductLabel(float $price): string
{
    return $price >= 30 ? '高价产品' : '普通产品';
}

然后在页面中调用。


修改价格货币符号

调用:

formatPrice($price, '$');

观察默认参数如何被覆盖。


本章重点

这一章最重要的是理解:

重复逻辑
↓
封装成函数

输入数据
↓
参数

处理数据
↓
函数内部

输出结果
↓
return

因此可以形成一个非常重要的 PHP 编程习惯:

页面负责展示,重复的数据处理规则尽量放到函数中。


第一阶段小结

到这里已经完成 PHP 基础阶段的前五个实验:

01 基础输出与变量
02 数组
03 条件判断
04 循环
05 函数

它们共同组成:

变量
↓
数组保存数据
↓
条件判断数据
↓
循环处理数据
↓
函数封装逻辑

这是后面 PHP Web 开发的基础。


下一实验

06 - PHP 页面模块化

下一章开始进入 PHP Web 开发阶段,重点学习:

  • include
  • require
  • include_once
  • require_once
  • header / footer 拆分
  • 公共页面模块复用

并开始理解 PHP 项目的多文件结构。