首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将变量$this绑定到可调用对象字段的最短方法是什么?

将变量$this绑定到可调用对象字段的最短方法是什么?
EN

Stack Overflow用户
提问于 2022-04-30 17:24:40
回答 2查看 136关注 0票数 2

我将$this变量与Closure::bind()方法(第12-13行)绑定到我的getName()getAge()方法(第4和第7行),以便它们能够在stdClass实例中引用自己的成员字段(第2-3行)。很管用,但我觉得有点乏味。

是否有任何特殊的变量或内置函数可以在不调用stdClass方法的情况下引用getName()getAge()方法(第4和第7行)中的当前getAge()实例?或者,有什么解决办法吗,如果有的话?

PHP代码

代码语言:javascript
复制
$human = (object) [
    'name' => 'John Doe',
    'age'  => 25,
    'getName' => function() {
        var_dump($this->name);
    },
    'getAge' => function() {
        var_dump($this->age);
    },
];

$human->getName = Closure::bind($human->getName, $human);
$human->getAge = Closure::bind($human->getAge, $human);

print_r($human);

($human->getName)();
($human->getAge)();

样本输出

代码语言:javascript
复制
stdClass Object
(
    [name] => John Doe
    [age] => 25
    [getName] => Closure Object
        (
            [this] => stdClass Object
 *RECURSION*
        )

    [getAge] => Closure Object
        (
             [this] => stdClass Object
 *RECURSION*
        )

)
string(8) "John Doe"
int(25)
EN

回答 2

Stack Overflow用户

发布于 2022-05-01 11:48:06

首先,尽管问题主体这样称呼他们,getNamegetAge并不是方法。在PHP中,方法和字段位于单独的名称空间中:方法总是在类上查找,而字段则在实例上查找。如果调用表达式看起来像$human->getName()$human->getAge(),而不是($human->getName)()($human->getAge)(),那么它们将查找相应的stdClass方法,这些方法当然不存在,因此它们将失败。

此外,一旦读取字段值,从其中读取的对象就会被丢弃,不再使用;所获得的值碰巧是可调用的,这并没有什么区别。由于对象被丢弃,所以没有任何东西可以将$this变量绑定到闭包中。这与JavaScript不同,其中的方法与字段完全等价,它们共享一个名称空间,调用只是在对象上查找的函数将该对象绑定为被调用函数的主体中的this

我认为你真正想要完成的事情最好是用匿名类来实现

代码语言:javascript
复制
$human = new class {
    public $name = 'John Doe';
    public $age = 25;

    public function getName() {
        var_dump($this->name);
    }

    public function getAge() {
        var_dump($this->age);
    }
};

$human->getName();
$human->getAge();

这使得getNamegetAge实际上是方法,它们接收适当的$this绑定。

如果坚持的话,甚至可以将匿名类作为stdClass的子类,尽管我没有看到具体的原因。

票数 2
EN

Stack Overflow用户

发布于 2022-04-30 18:35:16

我认为你应该提出更好的理由来解释你为什么要这么做。尽管如此,Closure::bind()确实有点乏味。有些事你可以做,但我怀疑你会喜欢它。事情是这样的:

代码语言:javascript
复制
$human = (object) [
    'name' => 'John Doe',
    'age'  => 25,
    'getName' => function($object) {
        var_dump($object->name);
    },
    'getAge' => function($object) {
        var_dump($object->age);
    },
];

($human->getName)($human);
($human->getAge)($human);

请参阅:PHP小提琴

在这里,您可以承认,在创建时,函数并不知道它们是对象的一部分,而$this是有意义的。因此,您稍后提供所需的对象作为参数,一切都很好。

同样,创建一个正常的类会更好,如果只是因为它更容易理解。记住,你编写代码来做一些事情,也是因为它是一种向你自己和他人传达你的意图的方式。

我想了另一种方法来做这个。也不是你想要的,但它是可行的:

代码语言:javascript
复制
$human = (object) [
    'name' => 'John Doe',
    'age'  => 25,
    'getName' => function() {
        global $human;
        var_dump($human->name);
    },
    'getAge' => function() {
        global $human;
        var_dump($human->age);
    },
];

($human->getName)();
($human->getAge)();

请参阅:PHP小提琴

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72070645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档