提问人: 提问时间:5/1/2022 最后编辑:user3840170 更新时间:5/1/2022 访问量:210
将变量$this绑定到可调用对象字段的最短方法是什么?
What's the shortest way to bind variable $this to a callable object field?
问:
我将变量与 method(第 12-13 行)绑定到 my 和 methods(第 4 行和第 7 行),以便它们可以在 的实例中引用自己的成员字段(第 2-3 行)。它有效,但我觉得这有点乏味。$this
Closure::bind()
getName()
getAge()
stdClass
是否有任何特殊变量或内置函数可以在不调用 method 的情况下引用 my 和 methods(第 4 行和第 7 行)中的当前实例?或者,是否有任何解决方法(如果有)?stdClass
getName()
getAge()
Closure::bind()
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)
答:
我认为你应该提出一个更好的理由来解释你为什么要这样做。也就是说,确实有点乏味。你可以做一些事情,但我怀疑你会喜欢它。它是这样的: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 fiddle
在这里,你承认,在创建时,函数并不知道它们是对象的一部分,什么时候才有意义。因此,您稍后提供所需的对象作为参数,一切都很好。$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 fiddle
评论
Closure::bind()
stdClass
$human
$this
getName
$human
global
首先:尽管问题机构这样称呼它们,但不是方法。在 PHP 中,方法和字段位于不同的命名空间中:方法总是在类上查找,而字段在实例上查找。如果调用表达式看起来像 和 而不是 和 ,它们将查找相应的方法,当然这些方法不存在,因此它们会失败。getName
getAge
$human->getName()
$human->getAge()
($human->getName)()
($human->getAge)()
stdClass
此外,一旦读取了字段值,从中读取该值的对象将被丢弃,并且不再使用;获得的值恰好是可调用的,这没有区别。由于对象被丢弃,因此在闭包内没有任何东西可以绑定变量。这与 JavaScript 不同,JavaScript 的方法与字段完全相同,它们共享一个命名空间,并且调用刚刚在对象上查找的函数会将该对象绑定到被调用的函数的主体中。$this
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
评论
stdClass
stdClass
上一个:对象文字/初始值设定项中的自引用
下一个:PHP 返回$this;
评论
get_object_vars()
$this
stdClass