PHP学习笔记(八)
目录
返回值
return的使用
多值返回的替代方案
可变函数
内部(内置)函数
匿名函数
静态匿名函数
返回值
值通过可选参数的返回语句返回
return的使用
函数不能返回多个值,但可以通过返回一个数组来得到类似的效果
函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用运算符&:
多值返回的替代方案
可以用list()或者数组结构(PHP7.1+)接收返回的数组,例如
function getUser() { return ['name' => 'Alice', 'age' => 25]; }
list($name, $age) = getUser(); // 或 [$name, $age] = getUser();
可变函数
PHP支持可变函数的概念。意味着如果一个变量名后有圆括号,PHP将寻找与变量的值同名的函数,并且尝试执行它。可变函数可用来实现包括回调函数,函数表在内的一些用途。
可变函数不能用于例如echo,print,unset(),isset(),empty(),include,require以及类似的语言结构。需要使用自己的包装函数来将这些结构用作可变函数
也可用可变函数的语法来调用一个对象的方法
$object->$method()的用例,如实现工厂模式或策略模式:
class Logger {public function logToFile() {}public function logToDatabase() {}
}
$logger = new Logger();
$method = 'logTo' . $type; // $type 来自配置
$logger->$method();
当调用静态方法时,函数调用要比静态属性优先:
内部(内置)函数
PHP 有很多函数和结构,还有部分函数要和特定地PHP扩展模块一起编译,否则在使用它们的时候就会得到一个致命的“未定义函数”错误。
在PHP 中标准函数分为核心函数和扩展函数两大类。核心函数如字符串处理和变量操作相关函数已经内置在 PHP 中,可以直接使用。而扩展函数则需要额外加载相应的扩展模块才能生效,例如使用 imagecreatetruecolor()
需要 GD 扩展支持,调用 mysqli_connect()
必须启用 MySQLi 扩展。如果未正确加载扩展而调用相关函数,PHP 会抛出致命错误,提示函数未定义。
要检查当前 PHP 环境已加载的扩展,可以使用 phpinfo()
或 get_loaded_extensions()
函数。许多扩展在标准安装中默认启用,但仍需根据实际需求调整配置。
在使用 PHP 函数时,必须仔细阅读官方文档,明确其行为模式。例如,str_replace()
返回修改后的字符串,而 usort()
直接修改传入的数组本身。手册中每个函数的文档都会详细说明参数、返回值、兼容性以及可能的副作用,正确理解这些细节是编写稳定 PHP 代码的关键。
匿名函数
匿名函数也叫闭包函数,允许临时创建一个没有指定名称的函数。经常用作回调函数callable参数的值。
匿名函数目前是用Closure类来实现的
闭包函数也可以作为变量的值来使用。PHP会自动把此种表达式转换成内置类Closure的对象实例,把一个closure对象赋值给一个变量的方式与普通变量赋值的语法一样
闭包可以从父作用域中继承变量。任何此类变量都应该用use语言结构传递,PHP 7.1起,不能传入此类变量:superglobals、$this 或者和参数重名
从PHP 8.0 起, 作用域继承的变量列表可能包含一个尾部的逗号,这个逗号将被忽略。
这些变量都必须在函数或类的头部声明。从父作用域中继承变量与使用全局变量是不同的。全局变量存在于一个全局范围,无论当前在执行的是哪个函数,闭包的父作用域是定义该闭包的函数
当在类的上下文中声明时,当前类会自动绑定,使$this在函数的作用域中可用。若不需要自动绑定,可使用静态匿名函数替代
静态匿名函数
匿名函数允许被定义为静态化,可以防止当前类自动绑定到它们身上,对象在运行时也可能不会被绑定到它们身上。
PHP 8.0+ 新特性:函数返回值的现代化处理
1.match表达式与返回值
基本用法
match表达式是PHP8.0引入的严格值匹配结构,它比传统的switch更适合返回值场景:
$result = match($type) {'json' => json_encode($data),'xml' => toXml($data),
};
与switch的关键区别
- 直接返回值:不需要在每个分支中使用return 或 break
- 严格比较:使用=== 而非 ==
- 必须穷尽:必须处理所有情况或提供default
- 表达式特性:可以赋值给变量或直接返回
2.命名参数与返回值
基本概念
命名参数允许按参数名而非位置传递值,这对返回复杂结构的函数特别有用:
function getUserData(): array {return ['name' => 'Alice','age' => 28,'email' => 'alice@example.com'];
}// PHP 8.0+ 命名参数解构
['email' => $email, 'name' => $userName] = getUserData();
与构造函数的交互
命名参数特别适合工厂函数:
function createUser(string $name,int $age = 18,string $role = 'user'
): User {return new User($name, $age, $role);
}// 清晰指定参数
$admin = createUser(name: 'Admin', role: 'administrator');
参考资料
PHP手册
相关文章:

PHP学习笔记(八)
目录 返回值 return的使用 多值返回的替代方案 可变函数 内部(内置)函数 匿名函数 静态匿名函数 返回值 值通过可选参数的返回语句返回 return的使用 函数不能返回多个值,但可以通过返回一个数组来得到类似的效果 函数返回一个引用&am…...

C#中WSDL文件引用问题
工作中碰到一个单点登录的需求,因为这个需求同事别的系统已经做过,我这边只需要把代码迁移过来即可,但是迁移过程中发现引用WSDL文件后,方法报错的问题,各种排查代码之后未解决,最终发现是WSDL文件引用的问…...
Ubuntu 22.04上升级Node.js版本
在Ubuntu 22.04上升级Node.js版本有几种方法,推荐使用NVM(Node Version Manager),因为它可以让你轻松管理多个Node.js版本。 方法1: 使用NVM(推荐) 1. 安装NVM # 下载并安装NVM curl -o- https://raw.gi…...

养生新策:五维开启健康生活
一、饮食:天然食材,科学配比 以 “原型食物” 为主,减少加工食品摄入。早餐用鹰嘴豆泥涂抹全麦面包,搭配水煮蛋和一小把蓝莓,兼顾蛋白质与抗氧化物质;午餐选择藜麦饭,配上香煎鸡胸肉和蒜蓉空心…...
生成对抗网络(GAN)原理
生成对抗网络(GAN)原理 介绍示例代码一、GAN 的基本结构1. 生成器(Generator,记作 G)2. 判别器(Discriminator,记作 D) 二、对抗过程(博弈思想)三、训练过程四…...
【SpringBoot实战指南】使用 Spring Cache
文章目录 一、Spring Cache简介核心特点: 二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案1:通过 yml 配置文件方案2:自定义 Bean 三、 缓存注解使用示例1.Cacheable - 数据查询缓存2.CachePut - 更新数据并缓存3.CacheEvict - 删除缓…...

centos8 配置网桥,并禁止kvm默认网桥
环境背景: 我使用vmware部署了一台kvm服务器,网络模式是nat。我想要kvm创建的虚拟机可以访问公网;所以kvm默认的地址不行,我必须使用nat地址才可以; 实现方式: 创建一个网桥,将本地的网络接口…...
C++:list容器,deque容器
list容器:双向链表容器,底层是双向链表。 简单使用如下: #include<iostream> #include<list> using namespace std;int main() {list<int> lst;lst.push_back(1);lst.push_back(2);lst.push_back(3);lst.push_front(4);l…...

【Node.js】全栈开发实践
个人主页:Guiat 归属专栏:node.js 文章目录 1. Node.js 全栈开发概述1.1 全栈开发的优势1.2 Node.js 全栈开发技术栈 2. 开发环境搭建2.1 Node.js 和 npm 安装2.2 开发工具安装2.3 版本控制设置2.4 项目初始化流程 3. 后端开发 (Node.js)3.1 Express 框架…...
自定义类型-联合体
概念 联合体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型 联合体的所有成员共享同一块内存空间,大小由最大的成员决定 用于在同一块内存单元内存放不同类型的变量 语法结构 结构与结构体类似, union 共用体名 {成员列…...
Qt项目开发中所遇
讲述下面代码所表示的含义: QWidget widget_19 new QWidget(); QVBoxLayout *touchAreaLayout new QVBoxLayout(widget_19);QWidget *buttonArea new QWidget(widget_19); 1、新建一个名为widget_19的QWidget,将给其应用垂直管路布局。 2、新建一个…...

ubuntu sh安装包的安装方式
ubuntu sh安装包的安装方式以Miniconda2为例 https://repo.anaconda.com/miniconda/ 如果需要python2.7版本可下载以下版本 Miniconda2-latest-Linux-x86_64.sh 打开终端输入安装命令 sudo sh Miniconda2-latest-Linux-x86_64.sh 然后按提示安装,注意安装位置 …...
Redis语法大全
一、String(字符串) 特点:单键值存储,值可为字符串、数字,支持原子操作。 常用命令 SET 语法:SET key value [EX seconds] [PX milliseconds] [NX|XX]说明:设置键值对,可指定过期时…...

OpenAI宣布:核心API支持MCP,助力智能体开发
今天凌晨,OpenAI全资收购io的消息成为头条。同时,OpenAI还宣布其核心API——Responses API支持MCP服务。过去,开发智能体需通过函数调用与外部服务交互,过程复杂且延迟高。而今,Responses API支持MCP后,开发…...
我的爬虫夜未眠:一场与IP限流的攻防战
深夜的办公室里,键盘声此起彼伏,屏幕的蓝光映在程序员的脸上。我揉了揉酸胀的眼睛,第8次刷新日志页面——依旧是刺眼的“429 Too Many Requests”(请求过多)。这是本月第三次因为IP被目标网站封禁而被迫中断爬虫任务了…...
git:The following paths are ignored by one of your
遇到错误: The following paths are ignored by one of your .gitignore files: www hint: Use -f if you really want to add them. 说明:Git 拒绝添加 www/html/index.php,因为你的 .gitignore 中忽略了整个 www/ 目录(即 ww…...
算法--js--组合总和
题:给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复…...

微服务中的 AKF 拆分原则:构建可扩展系统的核心方法论
在数字化浪潮的推动下,互联网应用规模呈指数级增长,传统单体架构逐渐暴露出难以扩展、维护成本高等问题,微服务架构应运而生并成为企业应对复杂业务场景的主流选择。然而,随着业务的不断扩张和用户量的持续增加,如何确…...

vue element-plus 集成多语言
main.js中 // 引入i18n import i18n from /i18n/index 使用i18 app.use(i18n) 在App.vue中 <template><el-config-provider :locale"locale" namespace"el" size"small"><router-view /></el-config-provider> </tem…...

如何测试JWT的安全性:全面防御JSON Web Token的安全漏洞
在当今的Web应用安全领域,JSON Web Token(JWT)已成为身份认证的主流方案,但OWASP统计显示,错误配置的JWT导致的安全事件占比高达42%。本文将系统性地介绍JWT安全测试的方法论,通过真实案例剖析典型漏洞,帮助我们构建全…...

车载网关策略 --- 车载网关重置前的请求转发机制
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

EtpBot:安卓自动化脚本开发神器
EtpBot 是什么? EtpBot是一款专为安卓设备设计的自动化脚本开发工具,支持用户通过编写脚本实现自动化操作。该模块提供了丰富的API接口,涵盖点击、滑动、输入、截图等常见操作,帮助开发者快速构建自动化任务。ETPBot支持多设备并行…...

连锁企业管理系统对门店运营的促进作用
连锁企业管理系统通过整合数字化工具与流程优化,能从多维度提升门店运营效率与竞争力,以下是其对门店运营的具体促进作用: 一、数据化管理:精准决策与运营监控 实时数据同步与分析 系统可整合各门店销售数据、库存信息、客流统计…...

现代生活健康养生新策略
在充满挑战的现代生活中,各种健康问题悄然来袭,亚健康状态困扰着不少人。摒弃中医概念,运用现代科学理念,也能找到行之有效的养生之道。 饮食上,遵循 “彩虹饮食法” 能让营养摄入更全面。不同颜色的蔬果富含不同的…...

车载以太网网络测试-27【SOME/IP-SD简述】
文章目录 1 摘要2 SOME/IP-SD协议介绍2.1 定义与作用2.2 SOMEIP/SD协议通俗易懂的理解2.2.1 SOMEIP/SD协议是什么?2.2.2 通信流程(简化)2.2.3 车载功能示例2.2.4 类比理解 2.3 SOME/IP-SD报文结构2.3.1 Flags2.3.1.1 REBOOT (Bit 7)2.3.1.2 U…...
云南安全员考试报名需要具备哪些条件?
云南安全员考试分为 A、B、C 三类,不同类别报名条件有所不同,具体如下: 安全员 A 证 年龄 18 周岁以上。具有中专及以上的文化程度、中级及以上专业技术职称(法定代表人除外)。其中分管安全生产的副总经理(…...
Android Binder线程池饥饿与TransactionException:从零到企业级解决方案(含实战代码+调试技巧)
简介 在Android系统中,Binder作为进程间通信(IPC)的核心机制,承载着大量跨进程调用任务。然而,当Binder线程池资源耗尽时,可能导致严重的线程饥饿问题,最终引发TransactionException异常,甚至导致应用崩溃或系统卡顿。本文将从零开始,系统讲解Binder线程池的工作原理…...
FFmpeg 超级详细安装与配置教程(Windows 系统)
FFmpeg 是一款功能强大的开源多媒体处理工具集,能够进行音视频的编码、解码、转码、混流、推流、滤镜、格式转换等多种操作。本教程将详细介绍如何在 Windows 系统上安装和配置 FFmpeg,并提供一些常用的使用示例,助你从入门到基本掌握。 目录…...

【Redis8】最新安装版与手动运行版
1. 下载 Redis 百度网盘 2. 解压后直接运行 redis-server.exe 3. 使用安装版 双击 install_redis_service.bat 输入安装路径(请提前创建好安装路径)后直接回车下一步直接回车即可,因为是使用配置模板文件为默认解压出来的,然后…...
PyQt 探索QMainWindow:打造专业的PyQt5主窗
在PyQt5的世界里,窗口的创建和管理是构建图形用户界面(GUI)的基础。QMainWindow作为主窗口类,为开发者提供了强大而灵活的应用程序框架。今天,就让我们一起深入了解QMainWindow的奥秘。 QMainWindow简介 QMainWindow…...