在 PHP 5.4.0 之前版本的匿名函数中使用 `$this`

2023-12-23

PHP 手册指出

无法使用$this来自 PHP 之前的匿名函数 5.4.0

on the 匿名函数页面 http://php.net/manual/en/functions.anonymous.php。但我发现我可以通过分配使其工作$this到一个变量并将该变量传递给use函数定义处的语句。

$CI = $this;
$callback = function () use ($CI) {
    $CI->public_method();
};

这是一个好的做法吗?
有没有更好的访问方式$this使用 PHP 5.3 的匿名函数内部?


当您尝试对其调用受保护或私有方法时,它将失败,因为以这种方式使用它会被视为从外部调用。据我所知,在 5.3 中没有办法解决这个问题,但是到了 PHP 5.4,它将按预期工作,开箱即用:

class Hello {

    private $message = "Hello world\n";

    public function createClosure() {
        return function() {
            echo $this->message;
        };
    }

}
$hello = new Hello();
$helloPrinter = $hello->createClosure();
$helloPrinter(); // outputs "Hello world"

更重要的是,您将能够在运行时更改 $this 指向的匿名函数(闭包重新绑定):

class Hello {

    private $message = "Hello world\n";

    public function createClosure() {
        return function() {
            echo $this->message;
        };
    }

}

class Bye {

    private $message = "Bye world\n";

}

$hello = new Hello();
$helloPrinter = $hello->createClosure();

$bye = new Bye();
$byePrinter = $helloPrinter->bindTo($bye, $bye);
$byePrinter(); // outputs "Bye world"

实际上,匿名函数将具有绑定到()方法 http://php.net/manual/en/closure.bindto.php,其中第一个参数可以用来指定$this指向的内容,第二个参数控制可见度应该是多少。如果省略第二个参数,可见性将就像从“外部”调用一样,例如。只能访问公共属性。还要注意bindTo的工作方式,它不会修改原始函数,它返回一个新的.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 PHP 5.4.0 之前版本的匿名函数中使用 `$this` 的相关文章

随机推荐

  • 如何在 SWT 中使用鼠标滚轮滚动滚动复合材料

    我想知道是否可以滚动ScrolledComposite使用鼠标滚轮 默认情况下它不工作 显然 有必要为您的组合创建鼠标滚轮侦听器 您可以使用这样的东西作为基础 scrolledComposite new ScrolledComposite
  • 在循环中迭代数据帧行[重复]

    这个问题在这里已经有答案了 我的数据框中包含多行链接 df pd DataFrame 我需要一次迭代数据帧中的链接行 以便我可以分别对每个链接执行 selenium 任务 它应该循环遍历这些行 直到数据帧中不再有行 links 0 http
  • 是否有一个 .Net 类可以执行 ManualResetEvent.PulseAll() 会执行的操作(如果存在)?

    是否有 Net 类可以做什么ManualResetEvent PulseAll 会做 如果存在的话 我需要自动释放一组正在等待同一信号的线程 对于我的预期用途 我并不担心 线程踩踏 您不能使用ManualResetEvent去做这个 例如
  • 如何为 Ironpython27 安装 numpy 和 scipy?

    我认为这是以前最流行的方法 https pytools codeplex com wikipage title NumPy 20and 20SciPy 20for 20 Net https pytools codeplex com wiki
  • echoscu 中调用 AE 标题无法识别错误

    我试图测试 dcmqrscp 的连接性 我使用以下命令来启动 dcmqrscp dcmqrscp config C Dicom config dcmqrscp cfg 请找到我使用的以下配置文件 NetworkTCPPort 11113 M
  • IE11 中的 Angular 4 错误

    我的 Angular 4 项目可以在 Chrome 上成功运行 但是它不会在 IE11 上加载 并在 polyfills bundle js 中出现以下错误 我使用命令 ng build env prod 来构建网站 var exports
  • 如何使用 jQuery 选择空输入 (value="")

    如何检查 required 在一个部分中输入字段 然后使用 jQuery 在事件中向它们添加一个类 到目前为止 我已经尝试过 jQuery sender container input required val addClass error
  • 了解 Scrapy 中的回调

    我是 Python 和 Scrapy 的新手 我以前没有使用过回调函数 但是 我现在执行以下代码 第一个请求将被执行 其响应将被发送到定义为第二个参数的回调函数 def parse page1 self response item MyIt
  • 无限递归别名“cd”

    我想记录一下我最近的状态cd跨越我的任何一台终端 我认为一个好方法是编写一个简单的 bash 脚本包装cd bin bash cd 1 echo pwd gt tmp cwd 既然我想要cd要发生在我的终端进程中 我需要运行脚本 bette
  • 使用 SendMessage 拖放

    这听起来很有趣 只是一个小实验 我想使用发送消息模拟文件在应用程序 窗口上的拖放 是否可以 我没有该应用程序的代码 但有可执行文件的代码 该应用程序是IP 信使 http www ipmsg org index html en 我想做的是使
  • 如何快速修复导航栏的透明度?

    我有透明的导航栏 带有用于视图控制器的背景图像 但是当我向导航栏添加栏按钮项目时 它变得像第二张图片中那样 如何让栏按钮项目也完全透明的导航栏 我使用下面的这些代码使导航栏透明 extension UINavigationControlle
  • IntelliJ 的选择字体对话框中没有出现字体

    我用这个安装了 Monaco 字体code https gist github com rogerleite 99819 然而 它并没有出现在Setting gt Editor gt Color and fonts gt Font 我应该怎
  • 如何在Windows Azure中使用子域?

    我目前已将 domain com 分配给我的 azure 网站 但我想知道使用子域需要什么 我想我需要在 godaddy 创建一个 CNAME 但我要指出什么呢 每个子域如何指向我的解决方案中的每个文件夹 为此我需要网络角色吗 我不知道如何
  • 64位类型和操作是如何在32位架构的最低层实现的?

    像 int64 t 这样的类型如何在最低 即汇编级别 上实现 我使用的是 32 位机器 但仍然可以使用 int64 t 例如 我最初的假设是 64 位只是模拟的 因此在 32 位机器上与 32 位数据类型相比 这些类型的计算必须有相当多的开
  • 在 Swift 中将 NSUnderlineStyle.PatternDash 添加到 NSAttributedString 中?

    我正在尝试为 Swift 应用程序中的某些文本添加下划线 这是我目前拥有的代码 let text NSMutableAttributedString string self currentHome name let attrs NSUnde
  • TSQL问题计算一个表中两个日期之间的差异

    在 MSSQL 2008 中 我的表和数据如下所示 create table tempData user id int type varchar 10 ts datetime insert into tempData select 1 EN
  • 如何正确使用goto语句

    我正在上高中 AP 计算机科学课程 我决定扔一个goto声明进入我们的一个实验室只是为了玩玩 但我得到了这个错误 Exception in thread main java lang Error Unresolved compilation
  • 在发布时替换 ASP.NET Core 与 2017 中的 web.config

    我正在尝试将 web config 替换为生产版本 我有生产版本 production web config tilda 作为我的项目文件夹的根 我在迁移文档中找到了这个
  • (Postgresql 中的一对多关系

    我有两张桌子 posts id other stuff tags 1
  • 在 PHP 5.4.0 之前版本的匿名函数中使用 `$this`

    PHP 手册指出 无法使用 this来自 PHP 之前的匿名函数 5 4 0 on the 匿名函数页面 http php net manual en functions anonymous php 但我发现我可以通过分配使其工作 this