Php 在类C中委托模块M的钩子处理程序不会';t工作:未触发此处理程序

Php 在类C中委托模块M的钩子处理程序不会';t工作:未触发此处理程序,php,delegates,prestashop,hook,prestashop-1.7,Php,Delegates,Prestashop,Hook,Prestashop 1.7,考虑这一Prestashop 1.7模块M: class M extends Module { public function __construct() { $this->c = new Negoce\Classes\C($this); } } 如您所见,我将其实例赋给类C。后者的代码是: class C { public function __construct($mod) { $mod->registerH

考虑这一Prestashop 1.7模块M:

class M extends Module
{

    public function __construct()
    {
         $this->c = new Negoce\Classes\C($this);
    }
}
如您所见,我将其实例赋给类
C
。后者的代码是:

class C {

    public function __construct($mod) {
        $mod->registerHook('actionObjectCustomerAddAfter');
    }

    public function hookActionObjectCustomerAddAfter($data) {
        $client = $data['object'];
        echo '<pre>';
            echo ' $client ';
            var_dump($client);
        echo '</pre>';
        exit;
    }

}
C类{
公共函数构造($mod){
$mod->registerHook('actionObjectCustomerAddAfter');
}
公共函数hookActionObjectCustomerAddAfter($data){
$client=$data['object'];
回声';
class M extends C

class C extends Module
回显“$client”;
class M extends C

class C extends Module
var_dump($客户); 回声';
class M extends C

class C extends Module
出口 } }
预期的行为是:如果我在Prestashop中创建了一个客户,那么转储将被执行,
退出
,从而产生一个包含转储文本的空白页面

实际行为是:如果我在Prestashop中创建了一个客户,则转储不会执行,
退出
也不会执行,从而导致客户列表页面显示新创建的客户,并显示一条通知,告诉我新客户已创建

通过不使用类
C
并在类
M
中移动后者的代码,可以获得预期的行为。然而,出于可实现性和可维护性的目的,我真的想委托给
C


我怎么做呢?为什么不起作用?

我认为这是一种更好的方式:

提示:您的“registerHook”函数不应位于构造函数中。它必须在安装功能中