gpt4 book ai didi

php - 在 PHP 中执行委托(delegate)或回调的正确方法

转载 作者:可可西里 更新时间:2023-11-01 12:17:36 25 4
gpt4 key购买 nike

我需要在 php 中实现以下模式:

class EventSubscriber
{
private $userCode;
public function __construct(&$userCode) { $this->userCode = &$userCode; }
public function Subscribe($eventHandler) { $userCode[] = $eventHandler; }
}

class Event
{
private $subscriber;
private $userCode = array();

public function __construct()
{
$this->subscriber = new Subscriber($this->userCode)
}

public function Subscriber() { return $this->subscriber; }

public function Fire()
{
foreach ($this->userCode as $eventHandler)
{
/* Here i need to execute $eventHandler */
}
}
}

class Button
{
private $eventClick;

public function __construct() { $this->eventClick = new Event(); }

public function EventClick() { return $this->eventClick->Subscriber(); }

public function Render()
{
if (/* Button was clicked */) $this->eventClick->Fire();

return '<input type="button" />';
}
}

class Page
{
private $button;

// THIS IS PRIVATE CLASS MEMBER !!!
private function ButtonClickedHandler($sender, $eventArgs)
{
echo "button was clicked";
}

public function __construct()
{
$this->button = new Button();
$this->button->EventClick()->Subscribe(array($this, 'ButtonClickedHandler'));
}

...

}

这样做的正确方法是什么。

附言

我为此目的使用了 call_user_func,不管你信不信,它能够调用私有(private)类成员,但经过几周的开发,我发现它停止工作了。是我的代码中的错误还是其他原因让我认为“call_user_func”能够调用私有(private)类函数,我不知道,但现在我正在寻找一种简单、快速和优雅的安全方法从其他类(class)调用自己的私有(private)类(class)成员。我现在正在寻找闭包,但是闭包内部的“$this”有问题...

最佳答案

PHP 中的回调与大多数其他语言中的回调不同。典型的语言将回调表示为指针,而 PHP 将它们表示为字符串。字符串或 array() 语法和调用之间没有“魔法”。 call_user_func(array($obj, 'str')) 在语法上与 $obj->str() 相同。如果 str 是私有(private)的,调用将失败。

您应该简单地公开您的事件处理程序。这具有有效的语义,即“旨在从我的类(class)之外调用。”

这个实现选择还有其他有趣的副作用,例如:

class Food {
static function getCallback() {
return 'self::func';
}

static function func() {}

static function go() {
call_user_func(self::getCallback()); // Calls the intended function
}
}

class Barf {
static function go() {
call_user_func(Food::getCallback()); // 'self' is interpreted as 'Barf', so:
} // Error -- no function 'func' in 'Barf'
}

关于php - 在 PHP 中执行委托(delegate)或回调的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4584182/

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