gpt4 book ai didi

php - call_user_func() : cannot access private method

转载 作者:行者123 更新时间:2023-12-02 03:06:12 24 4
gpt4 key购买 nike

此代码不起作用:

class A {
public function b() {
(new B)->d([$this, 'c']); // Error is here
}
private function c() {
echo 'test';
}
}

class B {
public function d($e) {
call_user_func($e);
}
}

(new A)->b();

运行此代码给出:

call_user_func() [...] cannot access private method A::c()



我可以理解为什么它不起作用。但我不知道真正的原因。在 A::b() , 我在 A上下文,这就是为什么我想 c()可以被调用( $this 是众所周知的并且 do 指的是 A ,所以我在 A 上下文中)。

对我来说真正奇怪的是,如果我替换它,它会起作用:
(new B)->d([$this, 'c']);

经过:
(new B)->d(function() { $this->c(); });

所以现在调用私有(private)函数是没有问题的。我不明白为什么。我在文档中没有找到任何关于此的内容。

为什么 (new B)->d(function() { $this->c(); });有效但无效 (new B)->d([$this, 'c']);当我调用 (new A)->b(); ?

最佳答案

当您使用 [$this, 'c']一个 数组 使用索引 [0] 传递作为 A 类对象的引用和索引 [1]作为字符串 c,因此它尝试从方法 d 调用函数使用存储在数组索引 [1] 中的字符串.

当您直接传递函数时,closure通过绑定(bind)到类 A所以它可以用来调用函数c因为它绑定(bind)到类 A .

然而您也可以使用第一种方法,并且通过这样的小技巧不会出现任何错误:

class A {
public function b() {
(new B)->d([$this, 'c']);// NO ERROR NOW!
}
private function c() {
echo 'test';
}
}

class B {
public function d($e) {
// Here is the trick :
$f = function() { $this->c(); };
$f = Closure::bind($f, $e[0], 'A');
$f();
}
}

(new A)->b();

我所做的是创建一个闭包,然后使用 ::bind 绑定(bind)使用在 $e[0] 中收到的对象引用将它传递给 A 类.

关于php - call_user_func() : cannot access private method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42651099/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com