文档章节

php 闭包与匿名函数

w
 wb123456
发布于 2017/05/31 10:35
字数 979
阅读 5
收藏 0
点赞 0
评论 0

提到闭包和匿名函数似乎一下子就想到了 javascript ,但其实在很多语言中都有闭包的特性。但是 javascript 坑爹的变量作用域让闭包变得非常重要。而其他语言完善私有共有变量和继承让闭包似乎没有什么卵用。但是为了有点 B 格,还是看了看 php 的闭包。 —— 由dm分享

提到闭包和匿名函数似乎一下子就想到了 javascript ,但其实在很多语言中都有闭包的特性。但是 javascript 坑爹的变量作用域让闭包变得非常重要。而其他语言完善私有共有变量和继承让闭包似乎没有什么卵用。但是为了有点B格,还是看了看 php 的闭包。

闭包和匿名函数

 

闭包个人理解就是可以访问不同作用域内变量的方式。在 javascript 中,变量的作用域都是遵循从下往上的原则,而最上级的变量是挂载在 window 对象中(nodejs 是挂载在 gloub 中),这就意味着如果随意定义的变量的话,挂载在最上级作用域的变量会越来越多,甚至会产生重名、覆盖等问题,这就是经常提到的变量污染。所以会使用闭包来解决变量污染和跨作用域访问变量。但是在 php 中有系统全局变量、一般的变量、常量、全局变量、静态变量,作用域划分明确。所以闭包在 php 中不是那么重要,所以理解起来也有点难度。(反正我是没理解 php 闭包有什么卵用)。匿名函数则允许我们创建一个没有指定名称的函数,同时拥有一个执行环境。匿名函数是完成闭包的常用方式。php5.3 之后引入了匿名函数的概念,laravel、CodeIgniter、Yii等框架都或多或少的使用的匿名函数和闭包。所以我们还是有必要了解一下。

 

闭包的实现

 

    //把函数做为参数传入

    function callFun($func){

        $func( "some string\r\n" );

    }

    //php写法

    $fun=function($str){

        echo $str;

    };//注意这里要带上结束符号,因为此时是赋值语句

    callFun($fun);

    //js写法

    callFun(function($str){

        echo $str;

    });

与 javascript 的区别

 

虽然从写法上看和 javascript 没有什么区别,但是在使用的时候还是有一定的区别。主要表现在变量作用域方面。在 javascript 中闭包函数可以使用上级作用域的变量。

 

function fun(){

  var a=1;

  return function(){

    console.log(a);

  }

}

var callfun=fun();

callfun();//1

但是在 php 中却不能这样使用。

 

    function callFun() {

        $v=1;

        $func=function(){

            echo $v;    //Notice: Undefined variable: v

        };

        $func();

    }

    callFun();

这样会报一个警告,变量$v没有定义。php 中需要使用use关键字来解决这个问题。

 

        $func1=function() use ($v){

            echo $v;    //1

            $v++;

        };

        $func1();

        echo $v;        //1

这时候和闭包函数内的$v改变不是影响到上级函数作用域内的变量。同样的,可以使用引用来关联。

 

        $func2=function() use (&$v){

            echo $v;    //1

            $v++;

        };

        $func2();

        echo $v;        //2

替代递归

 

闭包的使用非常广泛,比如简化代码、替换递归、替代循环等等…这里提供一个替代递归的方法。

 

    //递归

    function func ($v){

        if($v<10){ 123456789="" echo="" $v;="" $v++;="" func($v);="" }="" 101098765432="" func(1);="" 闭包="" $fib="function($n)" use(&$fib)="" {="" if($n<10){="" $n;="" $fib($n+1);="" 10987654321="" };="" $fib(1);="" <="" code=""></10){>

可以看到执行结果上还是有少许差异,使用过程中一定要注意。另外据说闭包的执行效率并不是很好,所以使用的时候还是要视情况而定。著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。互联网+时代,时刻要保持学习,携手千锋PHP,Dream It Possible。

© 著作权归作者所有

共有 人打赏支持
w
粉丝 0
博文 77
码字总数 62434
作品 0
PHP闭包(Closure)初探

不知不觉发现PHP已经出到了5.5版本,而自己一直在用PHP5.2,让我看起来像深山出来的小伙子一样,又土又落后。在我习惯在javascript中使用闭包之后,忽然间对PHP的闭包打起了兴趣。 于是乎在网...

豆浆Melon ⋅ 2013/04/30 ⋅ 17

PHP闭包Closure研究

一、闭包概念 接触过JavaScript朋友可能对闭包有所熟悉,因为JS中我们会经常用到闭包函数,非常方便,呐,PHP5.3也开始引入了闭包的特性。要了解闭包,我们先要知道何为匿名函数,也叫闭包函...

Corwien ⋅ 2016/03/18 ⋅ 0

php匿名函数的概念

一.匿名函数和闭包的概念 1.1匿名函数 匿名函数在编程语言中出现的比较早,最早出现在Lisp语言中,随后很多的编程语言都开始有这个功能了, 目前使用比较广泛的Javascript以及C#,。 什么是匿...

金于虎 ⋅ 2016/12/23 ⋅ 0

匿名函数和闭包

真正的匿名函数 在PHP5.3引入的众多功能中, 除了匿名函数还有一个特性值得讲讲: 新引入的invoke 魔幻方法。 这个魔幻方法被调用的时机是: 当一个对象当做函数调用的时候, 如果对象定义了i...

金于虎 ⋅ 2016/12/23 ⋅ 0

PHP匿名函数及闭包

匿名函数在编程语言中出现的比较早,最早出现在Lisp语言中,随后很多的编程语言都开始有这个功能了, 目前使用比较广泛的Javascript以及C#,PHP直到5.3才开始真正支持匿名函数,C++的新标准C...

新新 ⋅ 2015/09/16 ⋅ 0

PHP常用函数篇

PHP常用函数篇 1.为什么要使用函数? 除了内建的PHP函数,我们可以创建我们自己的函数。 函数是可以在程序中重复使用的语句块。 使代码逻辑更清晰 避免过多的全局变量 封装后避免相同逻辑重复...

Besmall ⋅ 2017/11/01 ⋅ 0

Modern PHP 笔记(一)

现在正式加入世界上最好的语言大家庭了。jimbochen大佬给推荐了 Josh Lockhart 写的,安道翻译的《Modern PHP》. 准备记录下一些学习笔记。刚刚入坑,如果理解的不对,欢迎指出。 这本书刚看...

郝开心信札 ⋅ 2017/11/22 ⋅ 0

PHP的匿名函数深入剖析

PHP中, 传递Callback的方式, 一直很丑陋. 在PHP5.3以前, 我们只有俩种选择: 1. 字符串的函数名 2. 使用create_function的返回值 在PHP5.3以后, 我们多了一个选择, 也就是Closure, $func = fu...

西西爱OS ⋅ 2012/10/25 ⋅ 2

PHP闭包函数的使用

PHP闭包函数的使用 匿名函数也叫闭包函数(closures允许创建一个没有指定没成的函数,最经常用作回调函数参数的值。 闭包函数没有函数名称,直接在function()传入变量即可使用时将定义的变量...

eatnothing ⋅ 2016/02/13 ⋅ 0

匿名函数和闭包规避xdebug限制的函数递归深度限制

PHP版本5.6 先来个简单的用递归求和,代码如下: function add($n){ if($n === 1)return 1; return add($n - 1);}echo add(256); 运行时报错: Maximum function nesting level of '256' rea......

chenzy526 ⋅ 2017/03/15 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JPA入门,配置文件的设置

<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http......

码农屌丝 ⋅ 22分钟前 ⋅ 0

Java基础——面向对象和构造器

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 静态成员介绍 为什么要有静态成员?静态成员用来...

凯哥学堂 ⋅ 24分钟前 ⋅ 0

vmware中Centos 7 linux的LVM磁盘扩容

系统是RHEL7(centos7差不多一样) 关闭系统,在vmware、设置、硬盘、扩展、输入数字大于当前系统内存、点击扩展。 开机再查看磁盘信息 fdisk -l 注意:可以看出sda磁盘增加了,但是根目录还...

gugudu ⋅ 35分钟前 ⋅ 0

JAVA线程sleep和wait方法区别

昨天面试,突然被问到sleep 和 wait的区别,一下子有点蒙,在这里记一下,以示警戒。 首先说sleep,sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过去后,cpu...

徐玉强 ⋅ 37分钟前 ⋅ 0

vuex学习--模块

随着项目复杂性增加,共享状态也越来越多。需要对转态操作进行分组,分组后在进行分组编写。学习一下module:状态管理器的模块组操作。 首先是声明: const moduleA={ state,mutations,g...

大美琴 ⋅ 39分钟前 ⋅ 0

Selenium 简单入门

安装 pip install selenium 驱动下载 https://chromedriver.storage.googleapis.com/index.html 下载最新的驱动,放入path中,可以放入Python的scripts目录下,也可以放入Chrome安装目录,并...

阿豪boy ⋅ 40分钟前 ⋅ 0

292. Nim Game - LeetCode

Question 292. Nim Game Solution 思路:试着列举一下,就能发现一个n只要不是4的倍数,就能赢。 n 是否能赢1 true2 true3 true4 false 不论删除几,对方都能一把赢5 t...

yysue ⋅ 今天 ⋅ 0

6.5 zip压缩工具 6.6 tar打包 6.7 打包并压缩

zip压缩工具 zip命令可以压缩目录和文件,-r 压缩目录。 zip使用方法 zip 1.txt.zip 1.txt //压缩文件 zip -r 123.zip 123/ //压缩目录 unzip 1.txt.zip //解压 unzip 123.zip -d /root/456...

Linux_老吴 ⋅ 今天 ⋅ 0

react-loadable使用跳坑

官方给react-loadable的定义是: A higher order component for loading components with dynamic imports. 动态路由示例 withLoadable.js import React from 'react'import Loadable fro......

pengqinmm ⋅ 今天 ⋅ 0

记录工作中遇到的坑

1、ios safari浏览器向下滚动会触发window resize事件

端木遗风 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部