将方法作为参数发送给其他 class 构造函数并执行它

Send method as parameter to other class constructor and execute it

我有两个 class AB

我想通过 B 构造函数 'send' 从 AB 的方法,然后在 B 中执行它。我一直在尝试像这样使用匿名函数:

    class A 
    {
        public function __construct()
        {
            // Send testMethod() to B with an anonymous function
            new B(function (string $test) {
                $this->testMethod($test);
            });
        }

        protected function testMethod(string $test) {
            echo ($test);
        }
    }


    class B 
    {
        protected $testFct;

        public function __construct($fctToExecute)
        {
            // Asign anonymous function to $testFct to be executed in all object
            $this->testFct= function (string $test) {
                $fctToExecute($test);
            };
        }

        // Want to be able now to call this $testFct function in a method like :
        protected function methodWhereICallTestfct() {
            $this->testFct("I'm dumb!"); // It has to echo "I'm dumb!"
        }        
    }

但是当我尝试设置它时,我总是会遇到这样的错误:

Uncaught Error: Call to undefined method testFct()

你知道问题出在哪里吗?我想指定我的 php 版本是 PHP 7.1.3.

编辑:

Here 是否有可能看到与我的代码更相似的代码,其中 return 错误

您的代码中有 2 个错误。

第一个错误是你忽略了B::__construct()中的参数$fctToExecute。如果您想将传递的闭包保存到对象 B 的 属性 中,那么您不需要另一个闭包。

public function __construct(closure $fctToExecute) {
    // Asign anonymous function to $testFct to be executed in all object
    $this->testFct = $fctToExecute;
}

第二个问题是,当您尝试执行闭包时,您实际上是在尝试执行一个名为 testFct 的函数。您应该使用括号来声明操作的优先级。

$this->testFct("I'm dumb!"); // This looks for a function called testFct

($this->testFct)("I'm dumb!"); // This will execute the closure stored in the property called $testFct

括号在这里有很大的不同。