PHP-nagate回调结果



有什么方法可以否定回调的结果吗?

$this->myInjectedService->doSomething([$this, 'myCallback']);

我需要nagatemyCallback方法的结果。我知道我可以通过嵌套函数来实现,但还有更干净的方法吗(感叹号(?

$this->myInjectedService->doSomething(function() {
return !$this->myCallback();
});

不,没有直接的方法可以这样做。

您可以做的是创建一个回调包装器,该包装器否定您要调用的回调。每当你想否定回调时,你可以使用包装器而不是回调本身:

<?php
class SomeService
{
public function doSomething(callable $callback)
{
return call_user_func($callback);
}
}
final class CallbackWrapper
{
public static function call(callable $callback, bool $negate = false): callable
{
if ($negate) {
return function() use ($callback) {
return !call_user_func($callback);
};
}
return $callback;
}
}
class Test
{
public function __construct()
{
$this->someService = new SomeService();
}
public function doSomething()
{
// Scenario 1: use direct callback
$result = $this->someService->doSomething([$this, 'thisIsACallback']);
var_dump($result);
// Scenario 2: use wrapper without negating
$result = $this->someService->doSomething(
call_user_func_array('CallbackWrapper::call', [[$this, 'thisIsACallback']])
);
var_dump($result);
// Scenario 3: use wrapper with negation
$result = $this->someService->doSomething(
call_user_func_array('CallbackWrapper::call', [[$this, 'thisIsACallback'], true])
);
var_dump($result);
}
public function thisIsACallback(): bool
{
return true;
}
}
$test = new Test();
$test->doSomething();

结果是:

// Scenario 1
bool(true)
// Scenario 2
bool(true)
// Scenario 3
bool(false)

请注意,这是我能想到的最简单的方法,但如果您需要调用更复杂的回调,那么您可能需要更新包装器。

附言:即使可能,我也不建议使用这种方法,因为使用嵌套函数,就像你已经做过的那样,会更清晰,更容易阅读/理解。

最新更新