【PHP 函数从入门到精通】

🧠 PHP 函数从入门到精通

PHP 函数是编程中最基础、也是最强大的工具之一。它不仅可以简化代码、提高复用性,还能通过各种高级用法,让你写出更灵活、更现代的代码。

下面我们从函数的基础讲起,逐步深入,带你掌握函数的核心用法和高级技巧,即使是编程小白也能轻松理解!


🧩 一、函数基础:定义与调用

函数是将一段代码封装起来,方便重复使用的代码块。

function greet($name) {echo "Hello, $name";
}greet("Tom"); // 输出:Hello, Tom
  • function 是定义函数的关键字
  • $name 是参数
  • greet("Tom") 是调用函数

📦 二、传参方式:值传参 vs 引用传参

1️⃣ 值传参(默认)

function add($a) {$a++;
}$a = 1;
add($a);
echo $a; // 输出:1

函数内部操作的是变量的副本,不会影响原始变量。


2️⃣ 引用传参(使用 &

function add(&$a) {$a++;
}$a = 1;
add($a);
echo $a; // 输出:2

&$a 表示传入的是变量的引用,函数内部对变量的修改会影响外部。


🎁 三、默认参数:让函数更灵活

你可以为函数参数设置默认值,这样在调用时可以省略这些参数。

function greet($name = "Guest") {echo "Hello, $name";
}greet(); // 输出:Hello, Guest
greet("Tom"); // 输出:Hello, Tom

✅ 支持类型:

  • 标量类型(int, string, bool, float
  • array
  • null
  • 从 PHP 8.1 开始支持对象
class User {public function __construct(public string $name = "Guest") {}
}function greet(User $user = new User()) {echo "Hello, " . $user->name;
}greet(); // 输出:Hello, Guest

🧩 四、命名参数(PHP 8.0+)

命名参数允许你按参数名传参,跳过中间的可选参数。

function makeYogurt($container = "bowl",$flavour = "raspberry",$style = "Greek"
) {return "Making a $container of $flavour $style yogurt.\n";
}echo makeYogurt(style: "natural");
// 输出:Making a bowl of raspberry natural yogurt.

✅ 更清晰、更灵活,推荐使用。


🧮 五、可变参数(Variadic Parameters)

当函数需要接收不确定数量的参数时,可以使用可变参数语法 ...$params

function sum(...$nums) {return array_sum($nums);
}echo sum(1, 2, 3, 4); // 输出:10
  • ...$nums 会把所有传入的参数收集成一个数组。
  • 你还可以用它来“展开”数组传参:
$values = [1, 2, 3];
echo sum(...$values); // 输出:6

✅ 可变参数与正常参数结合使用

可变参数必须是函数参数列表中的最后一个参数,前面可以有正常参数。

function logMessage($level, ...$messages) {echo "[$level] ";foreach ($messages as $msg) {echo "$msg ";}echo "\n";
}logMessage("INFO", "User", "logged", "in");
// 输出:[INFO] User logged in

🔄 六、可变函数(动态调用函数)

你可以将函数名保存在变量中,并动态调用它。

function add($a, $b) {return $a + $b;
}$func = "add";
echo $func(1, 2); // 输出:3

✅ 常用于回调、插件系统等场景。


🧩 七、实战示例:结合命名参数 + 可变参数 + 可变函数

下面是一个非常实用的综合示例,展示了三者如何结合使用:

function formatData(string $type = "json", bool $pretty = false, ...$data) {if ($pretty) {print_r($data);} else {echo json_encode($data);}
}

✅ 使用可变函数调用 + 命名参数

$formatter = 'formatData';// 使用命名参数 + 可变参数调用
$formatter(type: "json",pretty: true,"name", "age", "email"
);

📌 输出结果:

Array
([0] => name[1] => age[2] => email
)

😶‍🌫️ 八、匿名函数(闭包)

匿名函数是没有名字的函数,通常用于作为参数传递给其他函数,或者作为返回值。

$add = function($a, $b) {return $a + $b;
};echo $add(1, 2); // 输出:3

你还可以在闭包中使用外部变量,只需要加上 use

$prefix = "结果是:";
$add = function($a, $b) use ($prefix) {return $prefix . ($a + $b);
};echo $add(2, 3); // 输出:结果是:5

use 可以让闭包访问它外部的变量。


🔗 bindTo:绑定闭包的上下文

有时候你想让闭包访问类的私有属性或方法,可以使用 bindTo()

class User {private $name = "Alice";
}$getName = function() {return $this->name;
};$user = new User();
$bound = $getName->bindTo($user, 'User');echo $bound(); // 输出:Alice
  • 第一个参数是绑定的对象($this
  • 第二个参数是类名,表示闭包可以访问这个类的私有成员

🔄 Closure::fromCallable:将方法转为闭包

你可以把一个类的方法转换成闭包对象,这样就能像函数一样使用它:

class Greeter {private function sayHello($name) {return "Hello, $name";}
}$greeter = new Greeter();
$hello = Closure::fromCallable([$greeter, 'sayHello']);echo $hello("Tom"); // 输出:Hello, Tom

➡️ 九、箭头函数(PHP 7.4+)

箭头函数是匿名函数的简化版,写法更简洁,自动继承外部变量。

$add = fn($a, $b) => $a + $b;echo $add(1, 2); // 输出:3

它有几个特点:

  • ✅ 自动继承外部变量(不需要写 use
  • ❌ 对外部变量只有读权限(不能修改)
  • ✅ 只能写一行表达式(不能写多行逻辑)

🔖 十、First-class Callable(PHP 8.1+)

PHP 8.1 引入了一种新的方式,可以更方便地引用函数或方法:

$fn = strlen(...); // 获取 strlen 函数的引用
echo $fn("hello"); // 输出:5
  • ... 是语法的一部分,表示你不是在调用函数,而是在引用它。

  • 这种方式可以引用:

    • 普通函数:strlen(...)
    • 静态方法:Math::add(...)
    • 实例方法:$greeter->sayHello(...)

它返回的是一个 Closure,可以像闭包一样调用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/916100.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/916100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CGA老年综合评估汉密尔顿抑郁量表与认知评估联用

一、CGA老年综合评估汉密尔顿抑郁量表与认知评估联用的基础CGA老年综合评估 (一)二者评估内容的互补性 CGA老年综合评估汉密尔顿抑郁量表主要聚焦于老年人的抑郁情绪及相关症状,而认知评估则着重考察老年人的记忆力、注意力、思维能力等认知…

教培机构如何开发自己的证件照拍照采集小程序

职业教培机构对学员的证件照采集是进行学生培训管理、考试报名、证书发放的前置工作,传统拍照和收集证件照的方式往往面临效率低、质量参差不齐等问题。开发一款专属的证件照拍照采集小程序,不仅能提升机构形象,还能大幅优化工作流程。借助“…

GC8872刷式直流电机驱动器详解:3.6A驱动能力与PWM控制

概述GC8872是一款具有故障报告功能的刷式直流电机驱动芯片,专为打印机、电器、工业设备等机电一体化应用设计。这款芯片采用ESOP8封装,集成了H桥驱动电路和多种保护功能,支持高达3.6A的峰值电流输出。关键特性宽电压工作范围:6.5V…

从0开始学习R语言--Day54--双重固定模型

对于具有空间差异的数据,如果不知道数据的特征关系或意义,直接用杜宾模型来处理是一个比较通用的思路,只是后续还需要很多检验去证明结果的可解释性和统计性。但如果我们已经知道特征的意义,比如企业经济发展的数据中有着员工的科…

三生筛法在计算数论中的极限是什么?

AI辅助创作:三生筛法在计算数论中的极限主要体现在‌规模边界‌、‌算法适应性‌及‌理论兼容性‌三个维度,其核心瓶颈与突破路径如下:一、规模边界:计算效率的断崖式衰减‌‌低维高效区的上限‌在 10^15 以内数域,三生…

iOS WebView 加载失败与缓存刷新问题排查实战指南

在移动 App 中嵌入网页后,不少团队都会遇到一个诡异的问题:用户看到的是“旧内容”,或“资源加载失败”,但在浏览器调试中一切正常。特别是在 iOS WebView 中,这类缓存和加载问题常常隐匿、难以复现。 这篇文章将通过一…

GoLand 项目从 0 到 1:第二天 —— 数据库自动化

第二天核心任务:自动化与多数据库支持第二天的开发聚焦于数据库自动化流程构建与MongoDB 业务链路扩展,通过工具化手段解决数据库操作的重复性问题,同时完善多数据库支持能力。经过一天的开发,项目已实现数据库初始化、迁移、种子…

qt框架,使用webEngine如何调试前端

解决 Qt 5.14.2 中启用开发者工具的问题问题在于 Qt 5.14.2 中 QWebEngineSettings::DeveloperExtrasEnabled 属性已被弃用或更改。正确启用开发者工具的完整方法&#xff08;Qt 5.14.2&#xff09;1. 修改 main.cpp#include <QWebEngineView> #include <QWebEngineSe…

【Atlassian生态】Jira Cloud单站点现可支持10万用户:架构升级与龙智云迁移服务

作为Atlassian全球白金合作伙伴&#xff0c;龙智团队非常激动地宣布&#xff1a;Jira迎来历史性突破——Jira Cloud单个站点最高可支持10万用户&#xff01;覆盖Enterprise、Premium和Standard版本。现在&#xff0c;更多的团队可以将Jira作为核心协作中枢&#xff0c;以加速目…

深入解析JVM垃圾回收调优:性能优化实践指南

深入解析JVM垃圾回收调优&#xff1a;性能优化实践指南 一、技术背景与应用场景 随着互联网业务的飞速发展&#xff0c;Java 应用在高并发、大内存场景下对 JVM 性能提出了更高要求。垃圾回收&#xff08;Garbage Collection&#xff0c;GC&#xff09;作为 JVM 的核心组件之一…

万字解析Redission ---深入理解Redission上锁过程

Redisson获取锁过程 RLock lock redissonClient.getLock("lock:order" userId); boolean isLock lock.tryLock(1L, TimeUnit.SECONDS);调用tyrLock其实就是下面的方法&#xff0c;如果说没有指定锁的过期时间&#xff0c;可以看到这边设置为了-1Overridepublic bo…

NVM踩坑实录:配置了npm的阿里云cdn之后,下载nodejs老版本(如:12.18.4)时,报404异常,下载失败的问题解决

文章目录一、情景还原二、分析原因三、解决方案一、情景还原 有个老项目&#xff0c;需要用到 node 的 12.18.4 版本。 小case&#xff0c;我装了 nvm 的&#xff0c;根本构不成挑战&#xff0c;敲敲命令就可以了&#xff1a; # 安装12.18.4版本的nodejs nvm install 12.18.…

优秀案例:基于python django的智能家居销售数据采集和分析系统设计与实现,使用混合推荐算法和LSTM算法情感分析

1 绪论1.1 研究的背景和意义本文所研究设计的智能家居销售数据采集与分析系统主要是为了提升数据的采集效率&#xff0c;并且实现及时采集到的线上电商平台及线下店面的多重渠道销售数据的采集与分析&#xff0c;精确地进行相关的数据采集并应用先进的数据挖掘算法进行分析挖掘…

【传感器标定(四):多传感器融合定位系统中的标定与时间同步方案】

1. 系统框架概述 本方案采用"三层标定框架"&#xff0c;整体架构如下图所示&#xff1a; #mermaid-svg-WhuG9fzKdHSAzSNh {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-WhuG9fzKdHSAzSNh .error-icon{f…

PostgreSQL 跨库查询方法

问题描述&#xff1a; PostgreSQL 跨库查询方法 select rc.tm,fq,fq_old,sccd,unitcd from resource_calc_scene_section_result as rc inner join "mxpt_yushuiqingsrc_databases"."public".st_river_r_hi as st on st.stcd rc.bscd and st.tm rc.tmwher…

毕业论文参考文档(免费)—DHT11 温湿度传感器的硬件与软件系统设计

毕业论文参考文档&#xff08;免费&#xff09;—DHT11 温湿度传感器的硬件与软件系统设计第一章 硬件系统设计 1.1 硬件组成与接口设计 DHT11 采用 4 引脚封装&#xff08;SOP-4&#xff09;&#xff0c;如图 1-1 所示。核心硬件由三部分构成&#xff1a;电阻式湿度检测元件、…

壁纸管理 API 文档

壁纸管理 API 文档环境&#xff1a;Python 3.9、Flask 2.x、PyMySQL 1.x 运行&#xff1a;python app.py 监听&#xff1a;http://0.0.0.0:5000通用响应格式 {"code": 200, // 业务码&#xff1a;200 成功&#xff0c;201 创建成功&#xff0c;400 参数错误&am…

常见问题三

在前端开发中&#xff0c;Vue 的数据响应机制、脚本加载策略以及函数式编程技巧是高频考点和日常开发的核心基础。本文将围绕这几个关键点展开详细解析&#xff0c;帮助开发者深入理解其原理与应用。一、Vue2 与 Vue3 的数据响应原理对比Vue 的核心特性之一是数据响应式—— 当…

清华大学顶刊发表|破解无人机抓取与投递难题

在城市配送、应急物资投放和仓储拣选等场景&#xff0c;人们期待无人机能够独立完成“取-运-投”全流程。然而主流多旋翼通常采用下挂式夹爪或机械臂&#xff0c;包裹悬在机体下方&#xff0c;带来重心下移、转动惯量增加等问题。为突破这一结构瓶颈&#xff0c;清华大学机械工…

【机器学习之推荐算法】基于矩阵分解和损失函数梯度下降的协同过滤算法实现

基于矩阵分解的CF算法实现&#xff08;一&#xff09;&#xff1a;LFM LFM也就是前面提到的Funk SVD矩阵分解 LFM原理解析 LFM(latent factor model) 隐语义模型核心思想是通过隐含特征联系用户和物品&#xff0c;如下图&#xff1a;P矩阵是User-LF矩阵&#xff0c;即用户和隐含…