PHP 闭包获取外部变量和global关键字声明变量的区别讲解

最近在学习workerman的时候比较频繁的接触到回调函数,使用中经常会因为worker的使用方式不同,会用这两种不同的方式去调用外部的worker变量,这里就整理一下PHP闭包获取外部变量和global关键字声明变量的区别。

闭包

闭包是一个常见的概念,我们通常可以将其与回调函数配合使用,可以使代码更加简洁易读。

闭包可以 通过拷贝的方式 让函数使用父作用域中的变量。如:

$global = 'hello'; $bbb = function()use($global){ echo $global."\n"; }; $bbb(); //输出 'hello'

global关键字声明变量

通过global声明变量同样可以使函数体调用到函数外部的变量,不过global与use不同,globle关键字会使创建 一个与外部变量同名的引用 ,并且在函数内对变量作出修改同样会作用域外部变量。

$global = 'hello'; $fun = function(){ global $global; $global =' world'; echo $global."\n"; }; $fun(); // 输出 'world'

这里只是创建一个同名引用而已,并不会改变原本外部变量$global的作用域,也就是说在另外一个函数中调用该依旧需要声明或者使用闭包

$global = 'hello'; $fun = function(){ global $global; $global =' world'; echo 'a:'.$global."\n"; }; $ccc = function(){ echo 'b:'.$global; }; $fun() $ccc() /*

输出

a: world Notice: Undefined variable: global in xxxxxxx on line xx */

再稍微改一下代码,这样更容易对比闭包和global关键字声明变量这两种访问外部变量方式的区别。

<?php $global = 'hello'; $fun = function(){ global $global; $global ='world'; echo 'a:'.$global."\n"; }; $bbb = function()use($global){ $global = 'china'; echo 'c:'.$global."\n"; }; $fun(); echo 'b:'.$global."\n"; $bbb(); echo 'd:'.$global;

这里b和d两个输出可以看出来,global改变了外部变量的值,而闭包方式并没有。

输出:

a: world b: world c:china d: world

最后再贴一个官方文档中比较经典的使用匿名函数,闭包与回调函数配合的例子:

class Cart { const PRICE_BUTTER = 1.00; const PRICE_MILK = 3.00; const PRICE_EGGS = 6.95; protected $products = array(); public function add($product, $quantity) { $this->products[$product] = $quantity; } public function getQuantity($product) { return isset($this->products[$product]) ? $this->products[$product] : FALSE; } public function getTotal($tax) { $total = 0.00; $callback = function ($quantity, $product) use ($tax, &$total) { $pricePerItem = constant(__CLASS__ . "::PRICE_" . strtoupper($product)); $total += ($pricePerItem * $quantity) * ($tax + 1.0); }; array_walk($this->products, $callback); return round($total, 2); } } $my_cart = new Cart; $my_cart->add('butter', 1); $my_cart->add('milk', 3); $my_cart->add('eggs', 6); print $my_cart->getTotal(0.05) . "\n";

总结

以上所述是小编给大家介绍的PHP 闭包获取外部变量和global关键字声明变量的区别讲解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

时间: 2024-08-02 05:37:22

PHP 闭包获取外部变量和global关键字声明变量的区别讲解的相关文章

浅谈JavaScript中定义变量时有无var声明的区别_javascript技巧

前段时间回答了一个关于定义变量时使用关键字var与否的区别,总结回顾一下. 1.在函数作用域内 加var定义的变量是局部变量,不加var定义的就成了全局变量. 使用var定义: var a = 'hello World'; function bb(){ var a = 'hello Bill'; console.log(a); } bb() //'hello Bill' console.log(a); //'hello world' 不使用var定义: var a = 'hello World'

jsp中变量及方法的声明与使用_JSP编程

本文实例讲述了jsp中变量及方法的声明与使用.分享给大家供大家参考,具体如下: <%@ page language="java" import="java.util.*" contentType="text/html;charset=GBK"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://&q

PHP Global与$GLOBALS变量作用域与区别

Global,全局变量   PHP Global变量在实际应用中会发现许多问题需要我们不断的去完善处理.我们在这篇文章中就针对PHP Global变量出现的问题给出了一些具体的解决办法. PHP hack的使用技巧详解 代码实现PHP GTK写文本查看器 网站开发中PHP语言优缺点 如何正确实现PHP function函数扩展 PHP error_log()函数处理错误日志 1:PHP Global变量的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括includ

JS作用域闭包、预解释和this关键字综合实例解析_javascript技巧

本文实例分析了JS作用域闭包.预解释和this关键字.分享给大家供大家参考,具体如下: var number = 2; var obj = {number : 5, fn1 : ( function() { this.number *= 2; number=number*2; var number=3; return function() { this.number *= 2; number*=3; alert(number); } } )() }; var fn1 = obj.fn1; ale

PHP源码分析之Global关键字

  闲来无事,就系统的从PHP的词法分析,语法分析,opcodes生成,执行,整个流程,详细的分析了global关键字的实现. 当你在脚本中写下:   <?php $var = "laruence"; function sample(){ global $var; } ?>   的时候,你知道PHP是怎么实现在函数作用域找到全局变量的么? 在我前面的文章中(深入理解PHP原理之Opcodes)讲过, PHP的执行,经历了如下几个阶段:   1. Scanning(Lexin

PHP 全局变量之Global关键字引用解读

引用PHP手册的$GLOBALS的解释: Global 变量:$GLOBALS 注意: $GLOBALS 在 PHP 3.0.0 及以后版本中适用. 由所有已定义全局变量组成的数组.变量名就是该数组的索引. 这是一个"superglobal",或者可以描述为自动全局变量. 也就是说上面代码中的$var1和$GLOBALS['var1']是指的同一变量,而不是2个不同的变量! 全局变量举例  代码如下 复制代码 <?php  $pangbu = "pangbu"

网站迅速获取外部链接的最优方式

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 SEO迅速获取外部链接的最优方式 Google PR快更新了,揪了多少站长的心,最近一段时期,很多的站长期盼着自己站点的Pr能提升一个等级,以便在未来的链接交换和关键字排名方面或者优势. 很多的事情,其实都是功到自然成,你的站点质量上去了,外链做的有多质量又好,pr想不上去都难.下面结合自己的经验,总结一下如何获取外部链接. 一.人品+口碑

对象-匿名内部类怎么获取外部外部局部变量

问题描述 匿名内部类怎么获取外部外部局部变量 public class test { // public String name; public void say(String name) { new RunnableWithReturn() { @Override public Object execute() { System.out.println(name); return null; } }; } } interface RunnableWithReturn { public abst

JavaScript声明变量时为什么要加var关键字_javascript技巧

在JavaScript中,var用来声明变量,但是这个语法并不严格要求,很多时修改,我们可以直接使用一个变量而不用var声明它. 复制代码 代码如下: var x = "XX"; y ="xxx"; 诸如此类.这有一个问题,比如说在代码中的某一行,我想使用的一个已声明的变量x,结果由于打字或者拼写错误,这个变量被写成y了,结果相当于"隐式"声明了一个变量y,在实际编程过程中,这种错误有时比较难以发现. 当你在当前上下文内进行这种"隐式&