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,然后对其进行调用。
($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变量不能被设置为受保护的。感谢任何能帮忙的人!