PHP 相当于 JavaScript 绑定

2024-02-25

首先请原谅我的英语,我不是母语人士,很抱歉,如果它看起来很粗糙,这是我第一次在这个网站上发帖。 我认为我的问题很简单。比方说,我们有:

class A {

    function foo() {

        function bar ($arg){
            echo $this->baz, $arg;
        }

        bar("world !");

    }

    protected $baz = "Hello ";

}

$qux = new A;

$qux->foo();

在这个例子中,“$this”显然不是指我的对象“$qux”。

我该怎么做才能让它引用“$aux”?

就像 JavaScript 中的情况一样:bar.bind(this, "world !")


PHP 没有嵌套函数,所以在你的例子中bar本质上是全球性的。您可以通过使用闭包(=匿名函数)来实现您想要的,它支持binding http://php.net/manual/en/closure.bindto.php从 PHP 5.4 开始:

class A {
    function foo() {
        $bar = function($arg) {
            echo $this->baz, $arg;
        };
        $bar->bindTo($this);
        $bar("world !");
    }
    protected $baz = "Hello ";
}

$qux = new A;
$qux->foo();

UPD:但是,bindTo($this)没有多大意义,因为闭包会自动继承this从上下文来看(同样在 5.4 中)。所以你的例子可以很简单:

    function foo() {
        $bar = function($arg) {
            echo $this->baz, $arg;
        };
        $bar("world !");
    }

UPD2:对于 php 5.3 - 这似乎只有通过像这样的丑陋的黑客才能实现:

class A {
    function foo() {
        $me = (object) get_object_vars($this);
        $bar = function($arg) use($me) {
            echo $me->baz, $arg;
        };
        $bar("world !");
    }
    protected $baz = "Hello ";
}

Here get_object_vars()用于“发布”受保护/私有属性,以使它们在闭包内可访问。

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

PHP 相当于 JavaScript 绑定 的相关文章

随机推荐

  • Javascript AOP 库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您使用哪个 Javascript AOP 库 它的主要功能是什么 这是我到目前为止发现的 dotvoid
  • Angular 6/C#/MVC 以 Json Array of Array 的形式从控制器动态返回 JsonResult

    我正在尝试在 Angular 6 应用程序中将多个数据集导出到 Excel 为此 我使用 XLSX 和文件保存 如本例中所示 https medium com madhavmahesh exporting an excel file in
  • 使用 Redis 进行复合查询

    出于学习目的 我尝试在 Redis 中编写一个简单的结构化文档存储 在我的示例应用程序中 我正在对数百万个文档建立索引 这些文档看起来有点像下面这样
  • TensorFlow、批量索引(第一维)和排序

    我有一个形状为 params 张量 368 5 以及具有形状的查询张量 368 查询张量存储用于对第一个张量进行排序的索引 所需的输出具有以下形状 368 5 由于我需要它作为神经网络中的损失函数 因此所使用的操作应该保持可微分 另外 在运
  • 在WordPress中,如何在评论后重定向回引用页面?

    我在 WordPress 中的不同类型页面 存档 标签 搜索 主页 上启用了评论 并且在用户发布评论后 我希望将它们重定向回其引用页面 而不是单个帖子页面 有任何想法吗 把这个放在你的函数 php add filter comment po
  • 为什么在 UIView 再次添加到父级之前不调用 deinit ?

    我有一个 UIView 添加到 UIViewController 中 并且通常测试去初始化以确保我做的事情是正确的 但是 当我没有将 viewController 中的变量设置为 nil 并仅使用 removeFromSuperView 时
  • getResource() 无法加载 jar 中的内容

    我可以在 Eclipse 中成功加载 src 目录中某些包中的资源 现在 我导出 jar 右键单击 src 导出 jar 并保留默认设置 并且无法将资源加载到另一个 eclipse 项目中 我通过指示位于同一包名称中的类来构建资源的路径 U
  • 使用 fields_for 创建多个记录 - Rails

    我有两个模型 task and list items a task有很多list items 但我希望能够创造task还有很多list items如果用户想要所有内容都以一种形式 这是目前的样子 FORM
  • PHPDoc 文档生成器是在 Eclipse 中还是在 Eclipse 之外? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 Eclipse PDT 进行开发 我一直在代码中添加 phpdoc 注释 但实际上从未在
  • 导入 numpy 时出现 OpenBLAS 错误:`blas_thread_init 函数中的 pthread_creat 错误`

    突然间 我无法导入 numpy import numpy as np OpenBLAS pthread creat error in blas thread init function Error code 1 我正在运行 numpyAna
  • 使用 iPhone 的排序描述符对核心数据位置变化进行排序

    我有一个具有两个属性的 CoreData 实体 一个称为 position 另一个称为 positionChange 它们都是整数 其中position属性是当前位置 positionChange是前一个位置和新位置之间的差值 这意味着po
  • 颤动| Dart:URI 目标不存在

    我正在制作我的第一个应用程序来使用 Flutter 构建 Android 应用程序 我使用 Android Studio 作为 IDE 问题是当我导入 http 包时 import package http http dart as htt
  • scala 中两个数据帧的架构比较

    我正在尝试编写一些测试用例来验证源 csv 文件和目标 配置单元表 之间的数据 验证之一是表的结构验证 我已将 csv 数据 使用定义的架构 加载到一个数据框中 并将配置单元表数据提取到另一个数据框中 当我现在尝试比较两个数据帧的架构时 它
  • 用于验证邮政编码并检查无效字符的正则表达式

    我正在尝试验证邮政编码的输入 现在这个邮政编码应该适用于美国 加拿大 英国 所有国家 但省略任何特殊字符 所以我尝试 首先检查无效字符 如果通过 然后我检查邮政编码要么是美国 要么只是为了确保有有效字符且不超过 8 个 只要现在是美国 它们
  • 为什么第二次 cp 命令更快

    当我执行时cp folder1 folder2 rf 第一次大约需要10分钟 但是当我执行第二个命令时cp folder1 folder3 rf 大约需要 1 分钟 folder1包含大约 100 000 个文件 为什么第二次运行时间会有所
  • 强制使用 C++ override 关键字?

    我真的很喜欢 c 11 的新 override 关键字 我试图将它添加到我的代码中 如果编译器能够帮助我发现所有这些情况 那就太好了 有什么方法可以让编译器表现得好像 override 关键字是强制的吗 我正在使用 Visual Studi
  • 类模板的成员函数如果从未被调用,是否不会被实例化?

    我刚刚开始了解一些模板基础知识 实际上 直到现在我才接受它作为事实 但我不太明白为什么会这样 template
  • Django:使用 Ajax 获取模板中的数据库对象值

    我想根据用户选择获取数据库对象 我知道 Ajax 是一种可能的解决方案 但我不知道如何实现 这是代码 view py def automation request some code car CAR objects get ida name
  • 我可以在输入寄存器中写入吗? MODBUS

    我已经在一家公司工作了两个月MODBUS项目现在我发现了一个问题 我的客户要求我写入输入寄存器 地址 30001 到 40000 我认为这对我来说不是什么问题 因为每个modbus文档说 30001 到 40000 寄存器是只读的 甚至可以
  • PHP 相当于 JavaScript 绑定

    首先请原谅我的英语 我不是母语人士 很抱歉 如果它看起来很粗糙 这是我第一次在这个网站上发帖 我认为我的问题很简单 比方说 我们有 class A function foo function bar arg echo this gt baz