当前位置: 首页 > 面试题库 >

在PHP中,什么是闭包?为什么要使用“ use”标识符?

闻人景澄
2023-03-14
问题内容

我正在检查一些PHP 5.3.0功能,并在网站上浏览了一些看起来很有趣的代码:

public function getTotal($tax)
{
    $total = 0.00;

    $callback =
        /* This line here: */
        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);
}

作为匿名函数的例子之一。

有人知道吗?有文件吗?而且看起来很邪恶,应该使用它吗?


问题答案:

这就是PHP表示闭包的方式。这根本不是邪恶的,实际上它是强大而有用的。

基本上,这意味着您要允许匿名函数在其作用域之外“捕获”局部变量(在这种情况下$tax$total),并将其值(或在$total引用其$total自身的情况下)保留为内部状态匿名函数本身。



 类似资料:
  • 本文向大家介绍什么是闭包(closure)为什么要用它相关面试题,主要包含被问及什么是闭包(closure)为什么要用它时的应答技巧和注意事项,需要的朋友参考一下 闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域,将函数内部的变量和方法传递到外部。 闭包的特性: 1.函数内再嵌套函数

  • 问题内容: serialVersionUID缺少a时,Eclipse发出警告。 问题答案: 首先,我需要解释什么是序列化。 序列化 允许将对象转换为流,以便通过网络发送该对象,或者保存到文件或保存到DB以供使用。 有一些序列化规则。 仅当对象的类或其超类实现接口时,该对象才可序列化 一个对象是可序列化的(本身实现了接口),即使其超类不是。但是,可序列化类的层次结构中的第一个超类(不实现Serial

  • Bootstrapping(引导) 是 Netty 中配置程序的过程,当你需要连接客户端或服务器绑定指定端口时需要使用 Bootstrapping。 如前面所述,Bootstrapping 有两种类型,一种是用于客户端的Bootstrap,一种是用于服务端的ServerBootstrap。不管程序使用哪种协议,无论是创建一个客户端还是服务器都需要使用“引导”。 面向连接 vs. 无连接 请记住,这

  • 问题内容: 我很好奇,将框架与PHP一起使用有什么优缺点? 从版本3开始,我一直在使用PHP。无论如何,我从未使用过任何可用于PHP的框架,所以我错过了什么? 问题答案: 框架使您从低级详细信息中抽象出来,使您的工作效率更高,并保护您免受低级错误(例如防止SQL注入攻击)的侵害。 一个好的PHP框架会迫使您分离您的关注点并实现经过验证的体系结构,从而最终改善您的设计,并使您的代码更易于阅读和维护以

  • 我在DropWizard Metrics(以前的Coda Hale Metrics)库中看到了<code>CachedGauge</code>。我想知道为什么有人会用这个?!? 我对度量值的理解是,它是实时、准确和相关的。如果一个度量报告了一个过时/缓存的值,它可能有什么用途?

  • 我是个新手,我已经开始学习了。但我有些问题。为什么我们需要使用Mockito?据我所知,它用于模拟(创建虚拟对象),并在实际运行代码之前编写测试用例。但是,如果我想测试我已经实现的代码,以检查它们是否正常工作,该怎么办。我怎么用mockito来测试它呢? 例如,我有CRUD方法,我想通过实际使用我的Create方法在数据库中插入数据来测试Create是否正常工作,其他人也是如此。我们能用莫基托来实