在 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` 的相关文章

  • 如何在索引视图中打印关联数据

    subjects this gt Subjects gt find all contain gt Users fields gt Users username Users email gt hydrate false gt toArray
  • https 重定向 laravel .htaccess 之后删除 /public

    我有一个 Laravel 页面部署在共享主机中 当我强制 http 请求重定向到 https 时 url 包含 public 我的根 htaccess 是 RewriteEngine on RewriteCond REQUEST URI p
  • 带单引号的 XPATH 查询[重复]

    这个问题在这里已经有答案了 有人知道如何解决这个问题吗 单引号让我陷入困境 nodes xml gt xpath item contains catalog Billy s Blogs title 我尝试以各种方式逃避它 但都抛出错误 no
  • 如何从 URL 获取当前的 Web 目录?

    如果我有一个网址http www example com sites dir index html http www example com sites dir index html 我想提取 sites 这个词 我知道我必须使用正则表达式
  • PHP7.1上读取会话数据失败

    分享一个我遇到的问题 现已解决 在我的开发机器上 我使用 PHP 运行 IIS 我升级到 PHP7 突然我的代码不再工作 返回此错误 session start 读取会话数据失败 用户 路径 C WINDOWS temp 看起来像是权限问题
  • Laravel 5:在控制台内核的 Schedule() 函数中使用 Cache:: 或 DB::

    我正在尝试以不同的用户配置的时间间隔在 Laravel 5 中运行 Artisan 控制台命令 我已经构建了控制台命令 并拥有一个包含 运行频率 配置值的数据库 具有 Eloquent 模型 内schedule 的函数App Console
  • PHP 可以解压缩使用 .NET GZipStream 类压缩的文件吗?

    我有一个 C 应用程序 它与基于 PHP 的 SOAP Web 服务进行通信以进行更新和许可 我现在正在开发一个反馈系统 供用户通过软件自动提交错误和跟踪日志 根据我之前发布的问题 我认为 Web 服务将是实现此目的的最佳方法 最有可能以最
  • Symfony/Doctrine 重新排列数据库列

    当我使用doctrine schema update命令行生成表时 Doctrine 或Symfony 似乎想要添加一个命令来重新排列我的列 将键放在它出现的前面 我想知道是否 更希望在哪里 我可以禁用环境的这个 功能 所以当我去生成我的表
  • AJAX 安全问题

    我希望能够解决一些关于 AJAX 安全性的问题 这是我试图理解的一个场景 假设我正在使用 AJAX 向页面请求一些半敏感材料 例如 我将把用户的 ID 传递给一个 php 文件 并返回一些关于他们自己的信息 现在 是什么阻止人们模拟此 Ja
  • WordPress 子主题 -functions.php 复制 - 无法“重新声明”

    我正在使用带有儿童主题 starkers child 的 Starkers 我需要编辑functions php来声明一个菜单 所以我复制了functions php JS文件夹和external文件夹 它们都在functions文件中的某
  • 多维数组中的数组排列保留键 PHP

    这两天我一直在疯狂地尝试完成这个任务 也许你可以启发我 这是针对赛马投注排列的 每次用户玩游戏时 我都会得到一个多维数组 2 个级别 第一级包含比赛 ID 第二级包含用户为该比赛选择的马匹 它看起来像这样 play array 4 gt a
  • 重用 PDO 语句 var 会使进程崩溃

    我重用一个变量来存储两个不同的 PDO mysql 语句 stmt dbh gt prepare SELECT stmt gt execute stmt dbh gt prepare UPDATE crash here Error in o
  • 检查用户设备的 GPS 是否开启

    我正在使用 jQuery Mobile 和 PHP 开发一个应用程序 我没有使用 Phonegap 或其他框架 我需要找到用户的geolocation 如果用户设备的 GPS 关闭 那么我无法获取位置 现在我需要查找用户设备的 GPS 是否
  • 如何下载临时文件

    我正在尝试创建一个简短的 PHP 脚本 该脚本采用 JSON 字符串 将其转换为 CSV 格式 使用fputcsv 并使该 CSV 可作为下载的 csv 文件使用 我的想法是使用tmpfile 不用担心 cronjobs 或磁盘空间不足 但
  • PHP 使用主键和辅助键对多维数组进行排序[重复]

    这个问题在这里已经有答案了 如何按主键和辅助键对多维数组进行排序 例如 假设有以下数组 result array result 0 prio 1 result 0 date 2010 02 28 result 0 post February
  • Laravel 5 命名约定

    我对 Laravel 约定有点困惑 因为我是这个框架的新手 我正在关注 Jeffrey Way 他使用的 Laracasts 视频Plural对于控制器名称 E g 页面控制器 卡片控制器 帖子控制器 但如果我参考官方文档Laravel g
  • Laravel 4.2 Composer 安装错误:“无法扫描类”

    我想通过 Composer 在新的 Laravel 4 2 安装上安装一些软件包 但是 我遇到了例外 这是我的作曲家文件 name laravel laravel description The Laravel Framework keyw
  • 当php脚本通过ajax运行时显示进度条

    我有一个通过 ajax 向服务器提交值的表单
  • 通过 IP 地址限制 Laravel 错误日志

    When debug被设定为true在 Laravel 的app config php有什么方法可以限制结果Whoops包含对某些 IP 地址的堆栈跟踪的错误页面 并且不在该列表中的 IP 显示特定视图 Thanks 没有内置 但是你可能可
  • 无法将句子插入数据库

    我有一些句子 我必须选择由 6 个以上单词组成的句子 然后它们将被插入到数据库中

随机推荐

  • 如何在 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