Кажется, проблема в том, что ваша глобальная функция isCallable иногда захочет вернуть false для частного метода, но в этом случае true.У него нет контекста, который находится в области видимости объекта.
Один из обходных путей - использовать метод isCallable в вашей черте:
trait helper
{
public function show()
{
echo "show!";
if($this->isCallable($this, "afterShow"))
{
$this->afterShow();
}
}
private function isCallable($obj, $method)
{
return (method_exists($obj, $method) && is_callable([$obj, $method]));
}
}
Если вы предпочитаете использовать открытую функцию,вы можете передать в него необязательный параметр, например, так:
function isCallable($obj, $method, $syntax_only = false)
{
$test1 = method_exists($obj, $method);
var_dump($test1);
//TRUE
$test2 = is_callable([$obj, $method], $syntax_only);
var_dump($test2);
//FALSE
return (method_exists($obj, $method) && is_callable([$obj, $method], $syntax_only));
}
, а затем измените свой вызов на isCallable($this, "afterShow", true)