PHP8的匿名函数-PHP8知识详解

php 8引入了匿名函数(Anonymous Functions),它是一种创建短生命周期的函数,不需要命名,并且可以在其作用域内直接使用。以下是在PHP 8中使用匿名函数的知识要点:

Image

1、创建匿名函数,语法格式如下:

$fn = function() {  // 匿名函数的代码  
};

使用function关键字创建一个匿名函数。下面是一个示例:

<?php
$fn = function($arg1, $arg2) {  // 匿名函数的代码  return $arg1 + $arg2; 
};
echo $fn(3, 4);
?>

以上代码在PHP8中输出的结果为:

7

在上述示例中,我们向匿名函数传递了值 $arg1 = 3 和 $arg2 = 4,并输出结果为 7。请根据您的需求修改参数的值。

2、匿名函数可以作为变量赋值给其他变量,也可以作为参数传递给其他函数或方法。示例代码:

<?php
// 将匿名函数赋值给变量
$myFunction = function($arg1, $arg2) {// 匿名函数的代码return $arg1 + $arg2;
};// 使用变量中的匿名函数进行计算
$result = $myFunction(3, 4);
echo $result; // 输出 7
echo "<br>";// 将匿名函数作为参数传递给其他函数或方法
function operate($a, $b, $func) {return $func($a, $b);
}$result = operate(5, 2, function($x, $y) {return $x * $y;
});echo $result; // 输出 10?>

在PHP8中运行的结果为:

7
10

在上面的示例中,我们首先将匿名函数赋值给变量 $myFunction,然后使用该变量调用匿名函数并将结果存储在 $result 变量中。

接下来,我们定义了一个 operate() 函数,它接受三个参数:两个操作数 $a 和 $b,以及一个匿名函数 $func。在 operate() 函数内部,我们通过调用 $func($a, $b) 来执行传递进来的匿名函数,并返回其结果。

最后,我们使用了另一个匿名函数作为参数传递给 operate() 函数,并对数字进行相乘操作,将结果输出。

3、匿名函数可以访问其作用域内的变量,这些变量被称为闭包变量(Closure Variables)。在匿名函数内部,可以使用use关键字来引用外部变量。

<?php
$variable = 'php';  
$fn = function() use ($variable) {  echo $variable;  
};  
$fn(); 
?>

以上代码在PHP8中,输出的结果为:

php

4、匿名函数也可以返回值,就像普通函数一样。可以在匿名函数内部使用return语句来返回值。示范代码:

<?php
$fn = function() {  return 'php';  
};  
echo $fn(); 
?>

以上代码在PHP8中的运行结果为:

php

5、匿名函数可以作为回调函数使用,例如在数组排序、异步操作等场景中。可以使用callable类型来指定匿名函数作为回调函数。示范代码:

<?php
$numbers = [4, 2, 8, 6, 1];// 使用匿名函数进行数组排序
usort($numbers, function ($a, $b) {return $a - $b;
});print_r($numbers);
?>

在PHP8中运行的结果为:

Array ( [0] => 1 [1] => 2 [2] => 4 [3] => 6 [4] => 8 )

在这个例子中,我们使用了usort函数对$numbers数组进行排序。第二个参数是一个匿名函数,它接受两个参数$a和$b,并返回一个整数值来指定元素之间的比较关系。通过使用匿名函数作为回调函数,我们可以根据自己的逻辑来定义排序规则。

请注意,在使用匿名函数作为回调函数时,可以直接将匿名函数写在函数调用的参数列表中,而不需要定义一个独立的函数体。这样可以使代码更加简洁和易读。

6、匿名函数也可以使用闭包绑定(Closure Binding),即将匿名函数绑定到特定的对象或类。通过使用bind方法,可以将匿名函数绑定到特定的对象上。

示范代码:

<?php
class MyClass {private $message = "Hello";public function sayHello() {$func = function() {echo $this->message;};$boundFunc = $func->bindTo($this, 'MyClass');$boundFunc();}
}$obj = new MyClass();
$obj->sayHello();
?>

以上代码在PHP8中运行结果为‘:

Hello

在上述示例中,我们创建了一个名为MyClass的类,该类具有一个私有属性message和一个公共方法sayHello。

在sayHello方法内部,我们定义了一个匿名函数$func,它尝试访问$this->message。然后,我们使用bindTo方法将匿名函数绑定到当前对象$this上,并指定绑定到MyClass类。

最后,我们调用绑定后的函数$boundFunc(),这样就可以在匿名函数中成功访问到$this->message的值。

请注意,这里的关键是使用bindTo方法将匿名函数与特定的对象或类进行绑定。这样做的好处是,匿名函数仍然保持其原始定义中访问外部作用域变量的能力,同时又能够正确地访问绑定的对象或类的成员。

7、匿名函数还可以使用闭包模拟(Closure Simulation),即创建一个模拟闭包来访问外部变量。这在使用旧版本的PHP时非常有用,因为匿名函数在旧版本中不可用。通过使用命名函数和命名函数的变量绑定,可以模拟闭包的行为。示范代码:

<?php
function createClosure($outerVariable) {return function() use ($outerVariable) {echo "Outer variable value: " . $outerVariable;};
}// 创建一个模拟闭包
$closure = createClosure("Hello, world!");// 执行闭包
$closure(); 
?>

在php8zhon运行的结果为:

Outer variable value: Hello, world!

8、静态匿名函数

匿名函数允许被定义为静态化。这样可以防止当前类自动绑定到它们身上,对象在运行时也可能不会被绑定到它们上面。示范代码:

<?php
class MyClass {private static $message = 'Hello';public function testCallback() {$callback = static fn() => self::$message;echo $callback(); // 输出:Hello}
}$obj = new MyClass();
$obj->testCallback();
?>

在上面的代码中,我们将匿名函数定义为静态化,并通过static fn() => self::$message创建了一个闭包。该闭包能够访问类内部的私有静态变量$message。在testCallback()方法中,我们调用了该闭包,并输出了结果。

请注意,由于我们使用了静态化的匿名函数,所以无需依赖于对象进行绑定,但仍然可以访问类的成员变量。 

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

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

相关文章

利用tidevice+mysql+grafana实现ios性能测试

利用tidevicemysqlgrafana实现ios性能测试 1.什么是tidevice&#xff1f; tidevice是一个可以和ios设备进行通信的工具&#xff0c;提供以下功能&#xff1a; 截图获取手机信息ipa包的安装和卸载根据bundleID 启动和停止应用列出安装应用信息模拟Xcode运行XCTest&#xff0c…

kafka-python 消费者消费不到消息

排除步骤1&#xff1a; 使用group_id”consumer_group_id_001“ 和 auto_offset_reset"earliest" from kafka import KafkaConsumerconsumer KafkaConsumer(bootstrap_servers["dev-kafka01.test.xxx.cloud:9092"],enable_auto_commitTrue, auto_commit…

网络直播源码UDP协议搭建:为平台注入一份力量

网络直播源码中的UDP协议的定义&#xff1a; UDP协议又名用户数据报协议&#xff0c;是一种轻量级、无连接的协议。在网络直播源码平台中&#xff0c;UDP协议有着高速传输与实时性的能力&#xff0c;尤其是在网络直播源码实时性要求较高的场景&#xff0c;UDP协议的应用有着重要…

Vue脚手架中安装ElementUi

目录 ElementUi简介&#xff1a; ElementUi下载&#xff1a; npm 安装&#xff1a; 引入ElementUi: 测试是否引入成功&#xff1a; Element-ui官网&#xff1a;组件 | Element ElementUi简介&#xff1a; ElementUi&#xff0c;是由国内的饿了么团队开发并开源的一套为开…

【android12-linux-5.1】【ST芯片】HAL移植后配置文件生成报错

根据ST官方源码移植HAL源码后&#xff0c;执行readme指示中的生成配置文件指令时报错ST_HAL_ANDROID_VERSION未定义之类&#xff0c;应该是编译环境参数问题。makefile文件中是自动识别配置的&#xff0c;参数不祥就会报错&#xff0c;这里最快的解决方案是查询确定自己android…

xfs ext4 结合lvm 扩容、缩容 —— 筑梦之路

ext4 文件系统扩容、缩容操作 扩容系统根分区 根文件系统在 /dev/VolGroup/lv_root 逻辑卷上&#xff0c;文件系统类型为ext4&#xff0c;大小为10G&#xff0c;现在要将其扩容成20G。 给空闲空间分区# 调整分区类型为LVM&#xff0c;也就是8e类型 fdisk /dev/sdb# 选定分区后使…

netdata监控服务器主机(包括Docker容器)

效果 Docker部署 创建挂载目录 mkdir -p /data/netdata/{netdatacache,netdatalib}docker运行 docker run -d --namenetdata \-p 19999:19999 \-v /data/netdata/netdatalib:/var/lib/netdata \-v /data/netdata/netdatacache:/var/cache/netdata \-v /etc/passwd:/host/etc…

华为eNSP模拟器中,路由器如何添加serial接口

在ensp模拟器中新建拓扑后&#xff0c;添加2个路由器。 在路由器图标上单击鼠标右键&#xff0c;选择设置选项。 在【视图】选项卡的【eNSP支持的接口卡】窗口查找serial接口卡。 选择2SA接口卡&#xff0c;将其拖动到路由器空置的卡槽位。 如上图所示&#xff0c;已经完成路由…

客户案例:中圣科技—CAC2.0防范盗号威胁,加固安全防线

客户背景 中圣科技&#xff08;江苏&#xff09;股份有限公司&#xff08;以下简称“中圣科技”&#xff09;&#xff0c;是一家以技术研发为驱动&#xff0c;以清洁能源核心成套装备和节能环保工程服务为支撑的科技创新型企业。其以南京为核心运营基地&#xff0c;与当地政府…

CRM系统的个性化定制如何打造?

就像没有两片相同的叶子那样&#xff0c;每家企业都有自己独特的业务和需求&#xff0c;更需要一个能够适应自身情况的CRM系统。那么&#xff0c;如何打造个性化CRM系统呢&#xff1f;下面我们以Zoho CRM为例&#xff0c;聊聊CRM的个性化定制。 多页面布局&#xff1a; Zoho …

基于Jenkins构建生产CICD环境(第二篇)

基于Jenkins自动打包并部署Tomcat环境 传统网站部署的流程 在运维过程中&#xff0c;网站部署是运维的工作之一。传统的网站部署的流程大致分为:需求分 析-->原型设计-->开发代码-->提交代码-->内网部署-->内网测试-->确认上线-->备份数据-->外网更新…

学习创建第一个 React 项目

目标 本篇的目标是配置好基础的环境并创建出第一个 React 项目。 由于之前没接触过相关的知识&#xff0c;所以还需要了解其依赖的一些概念。 步骤主要参考First React app using create-react-app | VS code | npx | npm - YouTube 0. 简单了解相关概念 JavaScript 一种语…

nginx服务与调优

一、nginx概述&#xff1a; 1.Nginx简介&#xff1a; Nginx是一个高性能的HTTP和反向代理服务器。是一款轻量级的高性能的web服务器/反向代理服 务器/电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;单台物理服务器可支持30 000&#xff5e;50 000个并发请求…

httpd协议与apache

1.http 相关概念 HTTP是处于应用层的协议&#xff0c;使用TCP传输层协议进行可靠的传送。因此&#xff0c;需要特别提醒的是&#xff0c;万维网是基于因特网的一种广泛因特网应用系统&#xff0c;且万维网采用的是HTTP&#xff08;80/TCP&#xff09;和 HTTPS&#xff08;443/…

Exploring Unreal Engine New Free Archviz Explorer Project 视频笔记

链接&#xff1a; https://www.bilibili.com/video/BV1Q34y1Z7he/ 场景中没有太阳&#xff0c;也没有定向光 该蓝图用来控制光线的显示 删除这个蓝图 添加这个蓝图 顶部会出现时间滑块 该项目还有扩展插件&#xff0c;用户可以自由下载 它是由一个8k的卫星图做的地形底图 …

js中?.、??、??=的用法及使用场景

上面这个错误&#xff0c;相信前端开发工程师应该经常遇到吧&#xff0c;要么是自己考虑不全造成的&#xff0c;要么是后端开发人员丢失数据或者传输错误数据类型造成的。因此对数据访问时的非空判断就变成了一件很繁琐且重要的事情&#xff0c;下面就介绍ES6一些新的语法来方便…

Kali 软件管理

kali 更新 1. 查看发行版本 ┌──(root㉿kali)-[~] └─# lsb_release -a No LSB modules are available. Distributor ID: Kali Description: Kali GNU/Linux Rolling Release: 2023.2 Codename: kali-rolling2. 查看内核版本 ┌──(root㉿kali)-[~] └─…

Linux常用命令——depmod命令

在线Linux命令查询工具 depmod 分析可载入模块的相依性 补充说明 depmod命令可产生模块依赖的映射文件&#xff0c;在构建嵌入式系统时&#xff0c;需要由这个命令来生成相应的文件&#xff0c;由modprobe使用。 语法 depmod(选项)选项 -a或--all&#xff1a;分析所有可…

32、启用 HTTP 响应压缩和编程式配置Web应用

★ 启用HTTP压缩 就是前端页面如果改动的比较多&#xff0c;那么响应就会比较慢&#xff0c;可以通过设置HTTP响应压缩来提高响应&#xff0c;如果前端改动少&#xff0c;那么就不需要启动这个响应压缩。 目的&#xff1a;为了提高HTTP响应数据在网络上的传输效率。▲ 设置如…

路径规划 | 图解Theta*算法(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 A*算法的局限性2 Theta*算法原理图解3 Bresenham视线法4 算法仿真测试4.1 算法流程图4.2 ROS C 实现4.3 Python实现4.4 Matlab实现 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细介绍全…