写程序到一定阶段,你会发现自己经常在重复写相同逻辑的代码。比如在好几个地方都要计算商品折后价,或者都要验证邮箱格式。如果每次都把那段逻辑重新写一遍,不仅代码量膨胀,而且哪天规则变了,你得到处去改。
函数就是为了解决这个问题而存在的。函数是一段被命名、可重复调用的代码块,它封装了完成特定任务的逻辑,对外暴露一个清晰的调用接口。 用现实世界来类比:函数就像一个服务窗口——你把材料递进去,里面按固定流程处理好,然后把结果递出来。你不需要关心内部怎么操作,只需要知道递什么材料进去、拿到什么结果出来。
PHP里的函数分为两大类:一是PHP官方已经写好、随语言内置的库函数,比如count()、var_dump()、array_merge();另一类是我们自己根据业务需求编写的用户自定义函数。这节课聚焦后者,把函数的创建、参数传递、返回值讲清楚。
一、创建和调用函数的基础语法
在PHP里创建一个函数,遵循以下结构:
function 函数名() {
// 函数体:要执行的代码逻辑
}
命名规则:
-
函数名必须以字母或下划线开头,不能以数字开头
-
函数名不区分大小写,但调用时建议保持和定义时一致,遵循统一的命名规范
-
函数名后面必须跟一对圆括号
创建一个简单的函数并调用它:
<?php
// 定义一个打招呼的函数
function greetUser() {
echo "欢迎来到PHP函数学习课程!<br/>";
}
// 调用函数
greetUser();
?>
输出:欢迎来到PHP函数学习课程!
定义一个函数只是把代码块存起来,并不会被执行。只有当你通过函数名()的方式调用它时,函数体里的代码才会真正运行。而且一个函数定义好之后,可以在程序的任何位置反复调用,这就是代码复用——改一处逻辑,所有调用点同步生效。
二、函数参数:向函数内部传递数据
如果函数只能输出固定内容,那它的价值就太有限了。真正让函数变得灵活的是参数——你可以在调用函数时,把不同的值传给它,让函数根据输入做出不同的响应。
带参数的函数定义:
function 函数名($参数1, $参数2, ...) {
// 在函数体内使用$参数1、$参数2
}
多个参数之间用逗号分隔。调用时,按照定义时的顺序传入对应的实际值(这时候叫实参)。
实例:向不同的人打招呼
<?php
function sayHello($userName) {
echo "你好,{$userName}!欢迎回来。<br/>";
}
sayHello("张三");
sayHello("李四");
sayHello("王五");
?>
输出:
你好,张三!欢迎回来。
你好,李四!欢迎回来。
你好,王五!欢迎回来。
同一个sayHello()函数,根据调用时传入的不同名字,输出的内容跟着变化。这就是参数带来的灵活性。在代码号学习编程的过程中,理解参数是掌握函数的关键一步。
三、默认参数值:给参数设定备选值
有时候我们希望某个参数在调用者没传值时,自动启用一个预设的默认值。PHP支持在定义函数时,直接给参数赋默认值。
<?php
// $greeting参数有默认值"Hello"
function welcomeUser($name, $greeting = "Hello") {
echo "{$greeting}, {$name}!<br/>";
}
// 传了两个参数,使用传入的问候语
welcomeUser("Alice", "Good Morning");
// 只传了名字,$greeting使用默认值"Hello"
welcomeUser("Bob");
?>
输出:
Good Morning, Alice!
Hello, Bob!
本节课程知识要点: 带默认值的参数必须放在参数列表的末尾。如果把默认参数写在必选参数前面,调用时传参会出现歧义,PHP会报错。正确的顺序是:必选参数在前,可选(有默认值)的参数在后。
四、函数返回值:把处理结果送出去
函数可以做事,也可以产出结果。return关键字负责把函数内部计算出的结果,返回给调用它的地方。一旦函数执行到return,函数立刻结束,return后面的任何代码都不会再执行。
实例:计算三个数的和
<?php
function calculateSum($num1, $num2, $num3) {
$total = $num1 + $num2 + $num3;
return $total; // 把计算结果返回给调用者
}
// 用变量接收返回值
$result = calculateSum(4, 7, 9);
echo "三个数的总和是:{$result}";
?>
输出:三个数的总和是:20
函数内部算出了$total为20,通过return交出去,外部用$result变量接住。如果没有return,函数内部的计算结果就困在里面了,外部拿不到。
个人经验分享: 初学者容易混淆echo和return。echo是把内容输出到屏幕,return是把值交给调用者。一个函数如果只echo不return,它的计算结果无法被其他代码继续使用(比如赋值给变量再参与别的运算)。我建议让函数优先用return返回结果,由调用方决定是否echo。这样函数的职责更纯粹——只负责计算,不负责展示。
五、参数传递方式:传值 vs 传引用
PHP函数接收参数时,有两种传递方式,它们的区别直接影响到函数内部对变量的修改会不会波及外部。
Pass by Value(按值传递)
默认情况下,PHP函数参数是按值传递的。函数内部拿到的是原始变量的一个副本,你在函数内怎么改这个副本,外面的原始变量纹丝不动。
<?php
function tryToChange($num) {
$num = $num + 10;
echo "函数内部:{$num}<br/>";
}
$original = 5;
tryToChange($original);
echo "函数外部:{$original}";
?>
输出:
函数内部:15
函数外部:5
$original在函数外部依然是5,函数内部的$num加到15并不影响它。因为$num只是一份拷贝。
Pass by Reference(按引用传递)
如果你想函数内部的修改直接影响外部原始变量,需要在参数前面加一个&符号。这样传进去的不是值,而是变量本身的内存地址。
<?php
function appendText(&$str) {
$str .= "——这是追加的内容。";
}
$myText = "原始文本";
appendText($myText);
echo $myText;
?>
输出:原始文本——这是追加的内容。
$myText在调用appendText()之后,内容真真切切地变了。因为&$str拿到的是原始变量的引用,函数内对它的任何操作都直接作用于原变量。
主观建议: 按引用传递是一个有权限的操作,它打破了函数内外的隔离边界。在大多数场景下,按值传递配合return返回新值,是更安全、更易于理解和维护的做法。引用传递主要用在需要函数直接修改外部变量(而且不通过返回值)的场景。用得谨慎些,代码的逻辑链路会更清晰。
本节课程知识要点
回顾一下创建和使用PHP自定义函数时需要掌握的核心点:
-
函数是封装逻辑的基本单元,定义一次,多次调用,提升代码复用率。
-
参数让函数变灵活,通过传入不同的实参,同一个函数能应对不同的输入情况。
-
默认参数要放在参数列表末尾,避免调用时语义不清。
-
return把结果交出来,echo只是显示在屏幕上。函数优先用return,职责更清晰。 -
按值传递是默认方式,函数内修改不影响外部变量;按引用传递需要加
&,修改会直接影响原变量。
函数是PHP编程里组织代码的核心手段。理解这几个基础概念,是为后面学习更复杂的函数用法(如类型声明、可变参数、匿名函数)铺路。把这个基础打实,以后处理业务逻辑会顺手很多。