php函数如何定义_php函数定义方法【基础】

1次阅读

php函数名须以字母或下划线开头,禁用数字、保留字及unicode字符;默认值参数须居右;无return返回NULL但非语法保证;禁止重复定义,须用function_exists()防护。

php函数如何定义_php函数定义方法【基础】

函数名不能以数字开头,也不能用保留字

PHP 函数名必须以字母或下划线开头,后面可以跟字母、数字、下划线。写成 function 123abc()function class() 都会直接报错:Parse Error: syntax error, unexpected '123abc'Parse error: syntax error, unexpected 'class'。常见踩坑是用中文拼音缩写(如 zhuce())看着没问题,但一旦团队里有人手误写成 zhùcè()(带声调),就变成非法字符——PHP 不支持 Unicode 标识符开头。

建议统一用英文小写+下划线,比如 get_user_profile,避免大小写混用(getUserProfile 在某些配置下可能因文件系统大小写敏感导致找不到函数)。

参数默认值必须放在参数列表末尾

PHP 不允许跳过中间参数传默认值,否则会报 Parse error: default argument follows non-default argument。比如 function send_email($to, $subject = "Hi", $body) 是错的——$body 没默认值却排在有默认值的 $subject 后面。

实操时注意:

立即学习PHP免费学习笔记(深入)”;

  • 所有带默认值的参数必须集中在参数列表右侧
  • 如果要用“部分参数可选”,优先考虑用数组传参,比如 send_email($to, Array $options = []),再在函数内用 isset($options['subject']) 判断
  • PHP 8 开始支持 mixedString|null 等联合类型,但默认值仍要符合类型约束,例如 function log(string $msg = "") 合法,而 function log(string $msg = null) 会报错

return 之后的代码不会执行,但没 return 不等于返回 null

很多新手以为“函数没写 return 就自动返回 null”,其实 PHP 中无 return 的函数返回的是 NULL,但这是运行时行为,不是语法保证。更关键的是:一旦执行到 return,后续语句(包括 echofile_put_contents)全被跳过,容易造成逻辑断裂。

典型问题场景:

  • 条件分支中只在 if 里写了 return,else 忘了写,结果函数有时返回值,有时不返回(实际是 NULL),调用方用 === true 判断就失效
  • 调试时在 return 后加 var_dump("debug"),结果永远看不到输出
  • 函数里有资源操作(如 mysqli_close()),放在 return 后面就永远不会执行

建议:每个分支路径都显式 return,或统一在函数末尾 return;必要时用 declare(strict_types=1) 强制类型检查,让返回值不匹配立刻暴露。

函数不能重复定义,require/require_once 不解决运行时重定义

function_exists('my_func') 是唯一可靠的防御手段。哪怕你用 require_once 'helpers.php',如果这个文件被多次 include(比如通过不同路径引入、或 APCu 缓存失效后重载),仍可能触发 Fatal error: Cannot redeclare my_func()

常见疏漏点:

  • composer 自动加载 + 手动 require 同一个文件,导致函数被载入两次
  • CLI 脚本和 Web 请求共用同一份函数库,但 CLI 没走 autoloader,靠 require 加载,Web 端又用 Composer 加了一次
  • 测试时用 eval()create_function()(已废弃)动态生成函数,也受此限制

稳妥做法:所有全局函数文件开头加 if (!function_exists('xxx')) { function xxx() { ... } },别依赖文件加载机制保平安。

函数作用域这事,看着简单,但跨文件、跨环境、跨加载方式时,最容易在部署后突然崩。

text=ZqhQzanResources