PHP 闭包获取外部变量和global关键字声明变量的区别讲解
发布:smiling 来源: PHP粉丝网 添加日期:2021-08-22 12:41:49 浏览: 评论:0
闭包是一个常见的概念,我们通常可以将其与回调函数配合使用,可以使代码更加简洁易读,这篇文章主要介绍了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";
Tags: PHP闭包 global
相关文章
- ·PHP闭包的详细介绍(附代码)(2020-02-15)
- ·PHP闭包实例解析(2021-04-11)
- ·PHP闭包函数传参及使用外部变量的方法(2021-07-14)
- ·PHP闭包定义与使用简单示例(2021-09-08)
- ·PHP中全局变量global和$GLOBALS[]的区别(2013-12-02)
- ·php 全局变量global的使用方法(2013-12-23)
- ·PHP中global全局变量的作用范围(2014-01-06)
- ·PHP Global变量定义一些用法详解(2014-01-17)
- ·PHP基础笔记函数global变量(2014-02-10)
- ·PHP Global与$GLOBALS变量作用域与区别(2014-02-26)
- ·PHP 全局变量之Global关键字引用解读(2014-03-06)
- ·php中global static和$GLOBALS使用与区别(2014-03-13)
- ·PHP中全局变量global详解(2014-03-13)
- ·php中global和$GLOBALS[]用法区别(2014-03-21)
- ·PHP Global定义全局变量使用说明(2014-07-17)
- ·php中global和static两个关键字详解(2014-07-30)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)