Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >关于php匿名函数中的use

关于php匿名函数中的use

作者头像
跑马溜溜的球
发布于 2020-12-07 07:12:25
发布于 2020-12-07 07:12:25
1K00
代码可运行
举报
文章被收录于专栏:日积月累1024日积月累1024
运行总次数:0
代码可运行

匿名函数中的use,其作用就是从父作用域继承变量。 下例是最常见的用法,如果不使用use,函数中将找不到变量$msg。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
$msg = [1,2,3];
$func = function()use($msg){
    print_r($msg);
};  

$func();
?>

运行输出
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)

关于继承变量的时机

继承变量的行为是在函数定义时产生还是在函数调用时产生?我们调整下上例中代码的顺序,将$msg置于函数定义之后。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
$func = function()use($msg){
    print_r($msg);
};  

$msg = [1,2,3];

$func();
?>

运行输出
PHP Notice:  Undefined variable: msg in /search/ballqiu/c.php on line 4

可见,继承变量的行为是在函数定义时产生的。上例中定义 func时,没有找到外部的 func时,没有找到外部的msg,所以函数运行时$msg就是未定义变量。


关于use中使用引用传值

我们知道,在匿名函数的use中如果使用引用传值,那么匿名函数中对参数值的改变会同样影响外部相应变量。比如下面的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
$msg = [1,2,3];
$func = function()use(&$msg){
    $msg[0]++;
    print_r($msg);
};


$func();

print_r($msg);
?>

运行输出
Array
(
    [0] => 2
    [1] => 2
    [2] => 3
)
Array
(
    [0] => 2
    [1] => 2
    [2] => 3
)

那么是不是任何情况下,想通过匿名函数改变外部变量值都一定要通过引用方式向use传值呢?看下面这个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
$msg = new ArrayObject([1,2,3], ArrayObject::ARRAY_AS_PROPS);
$func = function()use($msg){
    $msg[0]++;
    print_r($msg);
};

$func();
print_r($msg);
?>

运行输出
ArrayObject Object
(
    [storage:ArrayObject:private] => Array
        (
            [0] => 2
            [1] => 2
            [2] => 3
        )

)
ArrayObject Object
(
    [storage:ArrayObject:private] => Array
        (
            [0] => 2
            [1] => 2
            [2] => 3
        )

)

可见,如果传递object类型的变量,即使不显示使用引用传递,匿名函数中变量值的改变同样会影响到外部相关变量。

但是,问题又来了。向use传递object变量时,使用引用与不使用引用到底有没有区别呢?还是来看例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
$func = function()use($msg){
    echo $msg[0],"\n";
};

$msg = new ArrayObject([1,2,3], ArrayObject::ARRAY_AS_PROPS);
$func();
?>

运行输出
PHP Notice:  Undefined variable: msg

我们改为使用引用传递

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$func = function()use(&$msg){
    echo $msg[0],"\n";
};

运行输出
1

可见使用引用传递时,即使变量滞后于函数定义,函数内部还是可以找到外部相应的变量,不会出现变量未定义的情况。两者还是有区别的。


关于class中匿名函数里的this及use

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
class C{
    protected $_num = 0;

    public function mkFunc(){
        $func = function(){
            echo $this->_num++, "\n";
        };

        return $func;
    }

    public function get(){
        echo $this->_num,"\n";
    }
}

$obj = new C();
$func = $obj->mkFunc();
$func();

$obj->get();
?>

运行结果
0
1

可见匿名函数里的this就是指当前对象,不需要使用use就可以直接找到。

还是上面的例子,如果一定要使用use会是什么效果呢? 将mkFunc改为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public function mkFunc(){
    //唯一改动是此处加了use
    $func = function()use($this){
        echo $this->_num++, "\n";
    };

    return $func;
}

运行输出
PHP Fatal error:  Cannot use $this as lexical variable 

修改为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public function mkFunc(){
    $self = $this;
    $func = function()use($self){
        echo $this->_num++, "\n";
    };

    return $func;
}

运行结果
0
1

可见是否使用use,效果是一样的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016/12/15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
百度在重庆开启自动驾驶共享汽车试运营,一键召唤、自动还车
6台搭载了百度Apollo开放平台Valet Parking(代客泊车系统)的自动驾驶共享汽车,将在重庆两江新区互联网产业园“百度-盼达自动驾驶示范园区”投入为期约1个月的定向试运营。
量子位
2018/07/24
2900
百度在重庆开启自动驾驶共享汽车试运营,一键召唤、自动还车
视觉在自动泊车系统中的设计与实现和挑战综述
文章:Computer Vision in Automated Parking Systems: Design, Implementation and Challenges
点云PCL博主
2022/12/27
9080
视觉在自动泊车系统中的设计与实现和挑战综述
【论文速读】AVP-SLAM:自动泊车系统中的语义SLAM
标题:AVP-SLAM: Semantic Visual Mapping and Localization for Autonomous Vehicles in the Parking Lot
点云PCL博主
2020/07/16
2.6K0
【论文速读】AVP-SLAM:自动泊车系统中的语义SLAM
i-VISTA挑战赛中纵目泊车环境感知系统解析
2021年8月19日,全球智能汽车领域的顶尖赛事——2021i-VISTA自动驾驶汽车挑战赛,在重庆正式开启。首日的赛程是被誉为赛事“人气王”的ADAS辅助驾驶系统挑战赛,其中的APS自动泊车挑战赛更是整个赛事的重头戏。本次APS自动泊车挑战赛设置了平行车位、垂直车位、斜向车位三种场景,这些都是驾驶者平时最常遇到的泊车场景。登场的多个品牌车型基本都出现失误,有的在侧方位停车时越过后方停车线,有的在垂直停车时没能准确识别车位。长安UNI-T2021款1.5T旗舰型从识别车位、执行操作,到完成泊车,三种场景都是一把入库,勇夺冠军。江淮汽车紧跟其后位列第二。
AI产业研究中心
2021/08/27
5720
自动驾驶汽车传感器融合系统及多传感器数据融合算法浅析
“自动泊车、公路巡航控制和自动紧急制动等自动驾驶汽车功能在很大程度上是依靠传感器来实现的。重要的不仅仅是传感器的数量或种类,它们的使用方式也同样重要。目前,大多数路面上行驶车辆内的ADAS都是独立工作的,这意味着它们彼此之间几乎不交换信息。只有把多个传感器信息融合起来,才是实现自动驾驶的关键。” 现在路面上的很多汽车,甚至是展厅内的很多新车,内部都配备有基于摄像头、雷达、超声波或LIDAR等不同传感器的先进驾驶员辅助系统(ADAS)。 这些系统的数量将会随着新法案的通过而不断增加,例如在美国,就有强制要求安
刘盼
2018/03/16
4K0
自动驾驶汽车传感器融合系统及多传感器数据融合算法浅析
小鹏VPA实测:地下的自动泊车场景,怕是比你想象中更复杂
Auto Byte报道 作者:曹锦、George.W 地下停车场,在大家的印象中,可能都是电影中那种「开阔得足够飞车枪战」的场地——行人不多、划线清晰、指示明显,也不具备路面上的复杂路况,看似对于自动驾驶车辆来说难度不大。但其实,目前能给出这「最后一公里」解决方案并实现普遍应用的汽车品牌,仍然没有几家。 去年9月,威马汽车就曾推出一项名为「AVP无人泊车」的功能,但根据测评,该功能无法脱离人工监管,与记忆泊车几乎没有差别,而且仅支持最长150米的记忆路线,并且路线上限只有五条。更重要的是,AVP并不支持避障
机器之心
2023/03/29
8650
小鹏VPA实测:地下的自动泊车场景,怕是比你想象中更复杂
中国第一家交货的自动驾驶独角兽:完全自主泊车,千元级硬件成本
意义还不止于此。在特斯拉路线备受质疑、全球自动驾驶初创公司八卦多于业务进展,无人车“寒冬”的种种不利的风潮下,此时交货,非比寻常。
量子位
2019/07/17
5830
中国第一家交货的自动驾驶独角兽:完全自主泊车,千元级硬件成本
自动驾驶技术栈——常见概念篇
ECU全称是Electronic Control Unit。随着汽车电子设备的引入,汽车中很多机械组件逐渐改为汽车电子设备,导致ECU在新能源汽车中的占比越来越大。ECU在汽车电子中完成特定的控制功能,控制范围包括发动机,雨刷器,制动器等。
Coder-ZZ
2023/02/23
1.7K0
自动驾驶技术栈——常见概念篇
特斯拉的计算机视觉
根据埃隆·马斯克(Elon Musk)的说法,截至2020年7月初,特斯拉接近于自动驾驶汽车,也称为5级自动驾驶。无论是真的还是假的,一件事情变得越来越清晰:特斯拉已准备好在其他任何人之前实现完全的自主权。一旦他们这样做,其他人可能很快就会跟进。
小白学视觉
2021/02/05
5870
进击的自动驾驶,能否助力传感器提前迎来千亿市场?
近期小鹏汽车在广州汽车展上发布了新款电动汽车——小鹏P7,该车采用英伟达Xavier自动驾驶芯片,车外共有30个传感器,其中有12个超声波传感器、5个毫米波雷达、13个摄像头,是L3级别的自动驾驶。相较于以往的自动驾驶系统传感器的配置,这次小鹏无疑在传感器的数量上提升了一个量级。
镁客网
2019/12/18
4330
自动驾驶行业观察 | 停车不再难,L2到L4的泊车辅助系统技术剖析
泊车辅助系统目前已经发展至第三代,从最开始的驾驶员必须在车内配合挂挡完成泊车,发展到驾驶员可以站在车外5米使用手机控制泊车,最后到汽车自己学习泊车路线,完成固定停车位或自家车库的泊车。
AI科技大本营
2019/09/17
1.4K1
自动驾驶行业观察 | 停车不再难,L2到L4的泊车辅助系统技术剖析
如何利用物联网开发智能停车解决方案
How-To-Use-IoT-For-Smart-Parking-Solution-Development-1068x656-1.jpg
用户4122690
2020/06/19
9010
如何利用物联网开发智能停车解决方案
特斯拉移除超声波传感器,正式转向纯视觉自动驾驶
10月6日消息,特斯拉于当地时间周二对外宣布,自2022年10月起,北美、中东、欧洲及中国台湾市场销售的 Model 3 和 Model Y电动汽车,都将不再在其自动驾驶传感器套件中使用超声波传感器,转向依靠纯视觉的“Tesla Vision”自动/辅助驾驶技术。而 Model S 和Model X 将在2023年跟进。
芯智讯
2022/10/28
3460
特斯拉移除超声波传感器,正式转向纯视觉自动驾驶
【图文实录】北大AI公开课 | 吴甘沙:智能驾驶,有多少AI可以重来
3月14日,北大AI公开课第四讲邀请到了驭势科技联合创始人&CEO、原英特尔中国研究院院长、英特尔首席工程师吴甘沙老师亲临现场,与北大人工智能创新中心主任、百度七剑客之一、酷我音乐创始人雷鸣老师一起,就智能驾驶领域展开深入的讨论和交流。
CreateAMind
2018/07/24
5680
【图文实录】北大AI公开课 | 吴甘沙:智能驾驶,有多少AI可以重来
高清地图:为自动驾驶汽车提供动力的新时代地图
专为自动驾驶而构建的地图通常称之为高精地图(High Definition Maps),这些地图在厘米级别,一般具有极高的精度,阅读本文将了解有关高精地图的一些基本内容。你将了解到高精地图的定义,为什么自动驾驶需要高精地图,如何制作高精地图,高精地图如何存储,等等基本问题,对高精地图有着全面且基础的认识。
点云PCL博主
2020/02/19
1.5K0
高清地图:为自动驾驶汽车提供动力的新时代地图
基于计算机视觉的无人驾驶感知系统
作者简介: 吴双,原百度研究院硅谷人工智能实验室高级研究员,百度美国研发中心高级架构师。美国南加州大学物理博士,加州大学洛杉矶分校博士后,研究方向包括计算机和生物视觉,互联网广告算法,互联网文本和视频的推荐系统,语音识别和自然语言处理,曾在NIPS等国际会议中发表文章。 刘少山,PerceptIn联合创始人。加州大学欧文分校计算机博士,研究方向包括智能感知计算、系统软件、体系结构与异构计算。现在PerceptIn主要专注于SLAM技术及其在智能硬件上的实现与优化。曾在百度美国研发中心负责百度无人车系统架
用户1737318
2018/06/06
1.6K0
鱼眼摄像头和超声波融合感知近场障碍物
文章:Fisheye Camera and Ultrasonic Sensor Fusion For Near-Field Obstacle Perception in Bird’s-Eye-View
点云PCL博主
2024/02/06
7280
鱼眼摄像头和超声波融合感知近场障碍物
鱼眼相机的物体感知
兄嘚们,小编考完PMP回来了。本文我们学习泊车场景的感知中较为关键的一个模块,即鱼眼相机的目标检测。从介绍开源数据集开始,讨论目前一些针对鱼眼相机进行目标检测的方法,最后针对端到端的目标检测分析输入端,网络端,输出端的关注点。
3D视觉工坊
2021/07/01
2.2K0
鱼眼相机的物体感知
ADAS最全整理
个人认为自动驾驶的前期即为ADAS阶段: 1. 自适应巡航控制系统 Adaptive Cruise Control(ACC) 自适应巡航控制系统是一种智能化的自动控制系统,它是在早已存在的巡航
刘盼
2018/03/16
1.4K0
ADAS最全整理
什么是4D成像雷达
公众号致力于分享点云处理,SLAM,三维视觉,高精地图相关的文章与技术,欢迎各位加入我们,一起每交流一起进步,有兴趣的可联系微信:920177957。本文来自点云PCL博主的分享,未经作者允许请勿转载,欢迎各位同学积极分享和交流。
点云PCL博主
2022/12/27
7740
什么是4D成像雷达
推荐阅读
相关推荐
百度在重庆开启自动驾驶共享汽车试运营,一键召唤、自动还车
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验