PHP学习笔记(八)

目录

返回值

return的使用

多值返回的替代方案

可变函数

内部(内置)函数

匿名函数

静态匿名函数


返回值

值通过可选参数的返回语句返回

return的使用

函数不能返回多个值,但可以通过返回一个数组来得到类似的效果

函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用运算符&:

多值返回的替代方案

可以用list()或者数组结构(PHP7.1+)接收返回的数组,例如

php 复制代码
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()的用例,如实现工厂模式或策略模式:

php 复制代码
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更适合返回值场景:

php 复制代码
$result = match($type) {
    'json' => json_encode($data),
    'xml' => toXml($data),
};
与switch的关键区别
  • 直接返回值:不需要在每个分支中使用return 或 break
  • 严格比较:使用=== 而非 ==
  • 必须穷尽:必须处理所有情况或提供default
  • 表达式特性:可以赋值给变量或直接返回
2.命名参数与返回值
基本概念

命名参数允许按参数名而非位置传递值,这对返回复杂结构的函数特别有用:

php 复制代码
function getUserData(): array {
    return [
        'name' => 'Alice',
        'age' => 28,
        'email' => 'alice@example.com'
    ];
}

// PHP 8.0+ 命名参数解构
['email' => $email, 'name' => $userName] = getUserData();
与构造函数的交互

命名参数特别适合工厂函数:

php 复制代码
function createUser(
    string $name,
    int $age = 18,
    string $role = 'user'
): User {
    return new User($name, $age, $role);
}

// 清晰指定参数
$admin = createUser(name: 'Admin', role: 'administrator');

参考资料

PHP手册

相关推荐
JaguarJack17 小时前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo17 小时前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack2 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理2 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
西岸行者2 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
starlaky2 天前
Django入门笔记
笔记·django
QQ5110082852 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php
勇气要爆发2 天前
吴恩达《LangChain LLM 应用开发精读笔记》1-Introduction_介绍
笔记·langchain·吴恩达
WeiXin_DZbishe2 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5
悠哉悠哉愿意2 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习