我将$this变量与Closure::bind()方法(第12-13行)绑定到我的getName()和getAge()方法(第4和第7行),以便它们能够在stdClass实例中引用自己的成员字段(第2-3行)。很管用,但我觉得有点乏味。
是否有任何特殊的变量或内置函数可以在不调用stdClass方法的情况下引用getName()和getAge()方法(第4和第7行)中的当前getAge()实例?或者,有什么解决办法吗,如果有的话?
PHP代码
$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)();样本输出
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)发布于 2022-05-01 11:48:06
首先,尽管问题主体这样称呼他们,getName和getAge并不是方法。在PHP中,方法和字段位于单独的名称空间中:方法总是在类上查找,而字段则在实例上查找。如果调用表达式看起来像$human->getName()和$human->getAge(),而不是($human->getName)()和($human->getAge)(),那么它们将查找相应的stdClass方法,这些方法当然不存在,因此它们将失败。
此外,一旦读取字段值,从其中读取的对象就会被丢弃,不再使用;所获得的值碰巧是可调用的,这并没有什么区别。由于对象被丢弃,所以没有任何东西可以将$this变量绑定到闭包中。这与JavaScript不同,其中的方法与字段完全等价,它们共享一个名称空间,调用只是在对象上查找的函数将该对象绑定为被调用函数的主体中的this。
我认为你真正想要完成的事情最好是用匿名类来实现
$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();这使得getName和getAge实际上是方法,它们接收适当的$this绑定。
如果坚持的话,甚至可以将匿名类作为stdClass的子类,尽管我没有看到具体的原因。
发布于 2022-04-30 18:35:16
我认为你应该提出更好的理由来解释你为什么要这么做。尽管如此,Closure::bind()确实有点乏味。有些事你可以做,但我怀疑你会喜欢它。事情是这样的:
$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是有意义的。因此,您稍后提供所需的对象作为参数,一切都很好。
同样,创建一个正常的类会更好,如果只是因为它更容易理解。记住,你编写代码来做一些事情,也是因为它是一种向你自己和他人传达你的意图的方式。
我想了另一种方法来做这个。也不是你想要的,但它是可行的:
$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小提琴
https://stackoverflow.com/questions/72070645
复制相似问题