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' => '[email protected]'
    ];
}

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

相关推荐
love530love34 分钟前
【笔记】PyCharm 中创建Poetry解释器
运维·人工智能·windows·笔记·python·pycharm·conda
我是坑货1 小时前
Spring学习笔记 IoC容器和XML的IoC装配
笔记·学习·spring
人类恶.1 小时前
C 语言学习笔记(指针1)
c语言·笔记·学习
Tiny番茄1 小时前
对抗学习(AL),生成对抗网络(GAN),强化学习,RLHF
人工智能·学习·生成对抗网络
liang_20261 小时前
【ULR #1】打击复读 (SAM, DAG链剖分)
笔记·学习·算法·图论
海绵宝宝的月光宝盒2 小时前
[STM32] 5-1 时钟树(上)
c语言·笔记·stm32·单片机·嵌入式硬件
搏博2 小时前
无人机集成毫米波雷达与双目视觉的融合感知系统深度解析
python·深度学习·学习·机器学习·动态规划·无人机
霖002 小时前
FPGA降低功耗研究
网络·神经网络·学习·fpga开发·边缘计算·知识图谱
jackson凌2 小时前
【Java学习笔记】main方法
java·笔记·学习
学渣676562 小时前
mac的Cli为什么输入python3才有用python --version显示无效,pyenv入门笔记,如何查看mac自带的标准库模块
笔记·python·macos