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

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();是一个方法调用,因此PHP将在类的方法列表中搜索__invoke。

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();是一个属性提取,因此PHP将在类的属性列表中搜索__invoke。

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();被解析为方法调用,因此PHP在您的类中搜索名为__invoke的方法,但是没有这样的方法(因此调用未定义的方法错误)。

所以你必须使用fetch属性语法来获取lambda,然后调用它。

从PHP 7.0开始,您可以使用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();执行此操作:

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();

括号确保PHP解析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();作为获取名为lambda的属性。 然后,__invoke调用获取属性的结果。

或者你可以用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();做到这一点:

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();

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();是PHP的魔术方法之一。 当一个对象实现此方法时,它变为可调用:可以使用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();语法调用它。 匿名函数是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();的实例,其实现__invoke。

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

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();

或者使用call_user_func调用它:

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();

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();可以拨打任何电话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();,包括匿名电话。

或者,如果这是代码中的常见模式,则可以设置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();方法以将调用转发到lambda:

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();

现在这个工作:

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();

从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();

php函数内调用类的变量,php - 如何调用一个类变量的闭包?相关推荐

  1. VC++中多线程学习(MFC多线程)一(线程的创建、线程函数如何调用类成员呢?如何调用主对话框的成员?、MFC中的工作线程和界面线程的区别)

    这里废话不多讲了,因为项目原因,需要开启线程进行处理,在不了解线程的情况下,直接百度一下,然后就使用了,结果可想而知,出现了异常,所以花了一天时间系统学习一下多线程,这里主要是针对win32编程方面的 ...

  2. static方法不能直接访问类内的非static变量和不能调用this,super语句分析

    大家都知道在static方法中,不能访问类内非static成员变量和方法.可是原因是什么呢? 这首先要从static方法的特性说起.static方法,即类的静态成员经常被称为"成员变量&qu ...

  3. python中属性和类级变量_六、Python类变量和实例变量(类属性和实例属性)

    我们知道,无论是在类中定义的属性还是方法,在类的外部,都无法直接调用它们,因此,我们完全可以把类看做是一个独立的作用域(称为类命名空间),则类属性其实就是定义在类命名空间内的变量(类方法其实就是定义的 ...

  4. php怎么调用类里面的方法_php调用类中的方法

    PHP外文名:PHP: Hypertext Preprocessor,中文名:超文本预处理器是一种通用开源脚本语言.可以是未实例化的类名直接调用.下面由小编整理了几种php调用类中的方法,希望对大家有 ...

  5. boost::threadpool 调用类成员变量并传入参数 的方法

    1. 首先到官网下载 http://threadpool.sourceforge.net/ 2. 包含头文件 #include "../boost/threadpool.hpp" ...

  6. 声明一个哺乳动物类Mammal,再由此派生出狗类Dog,二者都定义Speak()成员函数,基类中定义为虚函数,声明类Dog的一个对象,调用函数Speak()

    #include <iostream.h> #include <string.h> class Mammal { protected:  char name[10]; publ ...

  7. php 变量传给另外一个函数,将在一个函数中创建的PHP变量传递给另一个

    您可以将变量设为全局变量: function add_custom_price( $cart_object ) { global $newVar; foreach ( $cart_object-> ...

  8. C++ 包容类(Contain)与内嵌类(Embed)的关系

    关系总结如下: 1.内嵌类通过作用域限定,定义内嵌类的对象,从而调用内嵌类的成员函数 2.包容类不能调用内嵌类的成员变量 3.内嵌类只能调用包容类的静态成员函数 ![在这里插入图片描述](https: ...

  9. C语言函数内static关键字 疑惑

    static关键字有两类使用:函数外使用和和函数内使用,其中函数外使用主要用来限制被修饰的函数或变量作用域为本文件,没什么可多说的,下面重点说一下static关键字在函数体内的用法. 如下面的代码: ...

最新文章

  1. nodeJs --- web服务器创建
  2. 如何保留5个有效数字输出c不4舍5入_10 个C语言课设小项目拿走不谢~
  3. DataBinder
  4. academic division at cssa
  5. 五、JavaScript基础知识,学会操作元素的简单事件(一)
  6. 机器学习经典必读书,李航《统计学习方法》出视频课了!
  7. boost::contract模块实现volatile的测试程序
  8. java 钩子线程_java-钩子线程
  9. TCP/PI参考模型(应用层、传输层、网际层、网络接口层)、五层参考模型(应用层、传输层、网络层、数据链路层、物理层)、OSI与TCP/IP参考模型比较...
  10. 服务器***处理三则
  11. mtd设备操作、jffs2
  12. 潘多拉路由器固件备份
  13. highcharts向下钻取饼图
  14. VGA驱动实现并下板EGO1
  15. 为地图marker 设置网络图片
  16. Excel中Sheet(s)和Worksheet(s)的区别
  17. 11.全站乱码过滤器
  18. 【NLP】从WE、ELMo、GPT到Bert模型—自然语言处理中的预训练技术发展史
  19. 键入传真服务器位置是什么意思,2014传真服务器主要功能与技术参数说明.doc
  20. ad中按钮开关的符号_基础3:按钮开关,图文秒懂!

热门文章

  1. 实现Redis用户会话 - 2
  2. 数组静态初始化【应用】
  3. BufferedReader_字符缓冲输入流
  4. Zuul路由的strip-prefix与order
  5. 使用软碟通安装 CentOS Stream 会遇到哪些问题
  6. 正确率 精度 召回率 错误率
  7. jsp页面模块的来源
  8. JDK 是如何判断两个对象是否相同的?判断的流程是什么?
  9. docker基础用法
  10. thinkphp自定义标签库