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

如何调用作为类变量的闭包?

归鹤龄
2023-03-14
问题内容
class MyClass {
  var $lambda;
  function __construct() {
    $this->lambda = function() {echo 'hello world';};
    // no errors here, so I assume that this is legal
  }
}

$myInstance = new MyClass();
$myInstance->lambda();
//Fatal error: Call to undefined method MyClass::lambda()

那么到达类变量的正确语法是什么?


问题答案:

在PHP中,方法和属性位于单独的命名空间中(您可以具有相同名称的方法和属性),而访问属性还是方法取决于您使用的语法。

$expr->something()是一个方法调用,因此PHP将something在类的方法列表中进行搜索。

$expr->something是属性提取,因此PHP将something在类的属性列表中搜索。

$myInstance->lambda();被解析为方法调用,因此PHP会lambda在您的类中搜索一个命名的方法,但是没有这样的方法(因此
Call to undefined method error)。

因此,您必须使用 fetch属性 语法来获取lambda,然后对其进行调用。

  • 从PHP 7.0开始,您可以使用($obj->lambda)()
    ($obj->lambda)();
    

括号确保PHP解析($obj->lambda)获取名为lambda的属性 。然后,()调用获取属性的结果。

  • 或者,您可以使用以下方法->lambda->__invoke()
    $myInstance = new MyClass();
    

    $myInstance->lambda->__invoke();

__invoke是PHP的魔术方法之一。当对象实现此方法时,它可以调用:可以使用$var()语法来调用它。匿名功能的实例Closure,其实现__invoke

  • 或将其分配给局部变量:

    $lambda = $myInstance->lambda;
    

    $lambda();

  • 或使用call_user_func调用它:

    call_user_func($myInstance->lambda);
    

call_user_func可以调用任何callable,包括匿名函数。

  • 或者,如果这是代码中的常见模式,则可以设置一种__call方法来将调用转发到lambda:
    class MyClass
    

    {
    private $lambda;

    public function __construct()
    {
        $this->lambda = function() {
            echo "Hello world!\n";
        };
    }
    
    public function __call($name, $args)
    {
        return call_user_func_array($this->$name, $args);
    }
    

    }

现在这有效:

    $myInstance = new MyClass();
$myInstance->lambda();

从PHP 5.4开始,您甚至可以在特征中做到这一点:

    trait LambdasAsMethods
{
    public function __call($name, $args)
    {
        return call_user_func_array($this->$name, $args);
    }
}

class MyClass
{
    use LambdasAsMethods;

    private $lambda;

    public function __construct()
    {
        $this->lambda = function() {
            echo "Hello World!\n";
        };
    }
}

$myInstance = new MyClass();
$myInstance->lambda();


 类似资料:
  • JavaScript 是一种非常面向函数的语言。它给了我们很大的自由度。在 JavaScript 中,我们可以随时创建函数,可以将函数作为参数传递给另一个函数,并在完全不同的代码位置进行调用。 我们已经知道函数可以访问其外部的变量。 但是,如果在函数被创建之后,外部变量发生了变化会怎样?函数会获得新值还是旧值? 如果将函数作为参数传递并在代码中的另一个位置调用它,该函数将访问的是新位置的外部变量吗

  • 问题内容: 我正在尝试将JavaScript变量作为PHP变量包含在PHP代码中,但是这样做有问题。单击按钮时,将调用以下功能: 可能吗? 问题答案: PHP在服务器端运行。JavaScript在请求页面的用户的浏览器中在客户端运行。到执行JavaScript时,服务器上都无法访问PHP。请阅读本文,了解有关客户端和服务器端编码的详细信息。 简而言之,这是什么: 您在办公桌下方的计算机上的浏览器中

  • 我遇到了一个问题,我需要调用在另一个java类中的一个java类中创建的变量。 课程.java 第二课程.java 即使,我已经这样设置了它,但可变调用在第二课程.java类中不起作用。我错过了什么吗?你可以帮我吗? 我在试着打电话 在SecondCourse.java类。但给我错误sendKeys(java.lang.CharSequence....)在org.openqa.selenium.W

  • 本文向大家介绍Java中如何使用lambda访问封闭类中的变量,包括了Java中如何使用lambda访问封闭类中的变量的使用技巧和注意事项,需要的朋友参考一下 Lambda 表达式的封闭范围定义的变量可以在 lambda 表达式中访问。Lambda 表达式可以访问实例、静态变量和由封闭类定义的方法。它还可以访问“ this”变量(隐式和显式) ,该变量可以是封闭类的实例。Lambda 表达式还设置

  • 问题内容: 假设我有一个协议: 这是实现 我的期望是我必须能够使用变量来打印这样的值: 编译器抱怨此错误: “协议’Printable’只能用作一般约束,因为它具有Self或关联的类型要求” 难道我做错了什么 ?有任何解决这个问题的方法吗 ? 编辑2:我想要的真实世界的例子。请注意,这不会编译,但是会介绍我想要实现的目标。 问题答案: 正如Thomas所指出的,您可以通过根本不提供类型来声明变量(

  • 我有一个名为User的抽象类和一个扩展User的子类。User类包含一个方法:受保护的抽象空setId(String newId){}:它在User类中设置一个私有变量id。所以我的问题是,当我去创建setId()方法时,如果User类中的id是私有的,我如何引用它?据我所知,id变量不能被设置为受保护的。感谢任何能帮忙的人!