PHP学习笔记(八)

news2025/5/23 5:41:34

目录

返回值

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手册

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

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

相关文章

C#中WSDL文件引用问题

工作中碰到一个单点登录的需求,因为这个需求同事别的系统已经做过,我这边只需要把代码迁移过来即可,但是迁移过程中发现引用WSDL文件后,方法报错的问题,各种排查代码之后未解决,最终发现是WSDL文件引用的问…

养生新策:五维开启健康生活

一、饮食:天然食材,科学配比 以 “原型食物” 为主,减少加工食品摄入。早餐用鹰嘴豆泥涂抹全麦面包,搭配水煮蛋和一小把蓝莓,兼顾蛋白质与抗氧化物质;午餐选择藜麦饭,配上香煎鸡胸肉和蒜蓉空心…

centos8 配置网桥,并禁止kvm默认网桥

环境背景: 我使用vmware部署了一台kvm服务器,网络模式是nat。我想要kvm创建的虚拟机可以访问公网;所以kvm默认的地址不行,我必须使用nat地址才可以; 实现方式: 创建一个网桥,将本地的网络接口…

【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 框架…

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 然后按提示安装,注意安装位置 …

OpenAI宣布:核心API支持MCP,助力智能体开发

今天凌晨,OpenAI全资收购io的消息成为头条。同时,OpenAI还宣布其核心API——Responses API支持MCP服务。过去,开发智能体需通过函数调用与外部服务交互,过程复杂且延迟高。而今,Responses API支持MCP后,开发…

微服务中的 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应用安全领域&#xff0c;JSON Web Token(JWT)已成为身份认证的主流方案&#xff0c;但OWASP统计显示&#xff0c;错误配置的JWT导致的安全事件占比高达42%。本文将系统性地介绍JWT安全测试的方法论&#xff0c;通过真实案例剖析典型漏洞&#xff0c;帮助我们构建全…

车载网关策略 --- 车载网关重置前的请求转发机制

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

EtpBot:安卓自动化脚本开发神器

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

连锁企业管理系统对门店运营的促进作用

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

现代生活健康养生新策略

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

车载以太网网络测试-27【SOME/IP-SD简述】

文章目录 1 摘要2 SOME/IP-SD协议介绍2.1 定义与作用2.2 SOMEIP/SD协议通俗易懂的理解2.2.1 SOMEIP/SD协议是什么&#xff1f;2.2.2 通信流程&#xff08;简化&#xff09;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…

【Redis8】最新安装版与手动运行版

1. 下载 Redis 百度网盘 2. 解压后直接运行 redis-server.exe 3. 使用安装版 双击 install_redis_service.bat 输入安装路径&#xff08;请提前创建好安装路径&#xff09;后直接回车下一步直接回车即可&#xff0c;因为是使用配置模板文件为默认解压出来的&#xff0c;然后…

Spring Boot 集成 Elasticsearch【实战】

前言&#xff1a; 上一篇我们简单分享了 Elasticsearch 的一些概念性的知识&#xff0c;本篇我们来分享 Elasticsearch 的实际运用&#xff0c;也就是在 Spring Booot 项目中使用 Elasticsearch。 Elasticsearch 系列文章传送门 Elasticsearch 基础篇【ES】 Elasticsearch …

06算法学习_58. 区间和

58. 区间和 06算法学习_58. 区间和题目描述&#xff1a;个人代码&#xff1a;学习思路&#xff1a;第一种写法&#xff1a;题解关键点&#xff1a; 个人学习时疑惑点解答&#xff1a; 06算法学习_58. 区间和 卡码网题目链接: 59. 螺旋矩阵 II 题目描述&#xff1a; 58. 区间…

Python爬虫之路(14)--playwright浏览器自动化

playwright 前言 ​ 你有没有在用 Selenium 抓网页的时候&#xff0c;体验过那种「明明点了按钮&#xff0c;它却装死不动」的痛苦&#xff1f;或者那种「刚加载完页面&#xff0c;它又刷新了」的抓狂&#xff1f;别担心&#xff0c;你不是一个人——那是 Selenium 在和现代前…

Python开启智能之眼:OpenCV+深度学习实战

开篇导言 场景痛点 "某汽车零部件厂每月因人工质检遗漏损失300万,直到部署了基于Python的视觉检测系统..." 传统质检效率低下、成本高昂 深度学习技术带来的产业变革 Python在视觉识别领域的独特优势 一、技术架构解析 1.1 系统组成模块 图表 代码 下载 检测结…

华为模拟器练习简单的拓扑图(3台路由器和2台pc)

1、题目要求 根据下图&#xff0c;pc1连通pc2&#xff0c;实现不同网段直接的互通 2、思路整理 2.1 根据图上的要求&#xff0c;为主机和路由器相连接的端口设置对应IP地址&#xff08;子网掩码都是24位&#xff09;,路由器连接pc的那个端口&#xff0c;是主机pc的网关 2.2 …