在PHP中打印可调用的名称或定义

在PHP中打印可调用的名称或定义,php,callable,Php,Callable,PHP中的可调用项可以有多种形式,如对象、数组或包含函数名的字符串 如果我在一个变量中得到了这样一个可调用变量,我如何在日志中打印一些用户友好的“定义” 想想这段代码: call_user_func($callable); $logger->log("Provided callable " . (string) $callable . " called"); 问题是,这会引发错误,例如数组到字符串的转换错误。打印出该可调用项有用信息的最佳方法是什么?类似的方法应该可以: 你考虑过吗?还是

PHP中的可调用项可以有多种形式,如对象、数组或包含函数名的字符串

如果我在一个变量中得到了这样一个可调用变量,我如何在日志中打印一些用户友好的“定义”

想想这段代码:

call_user_func($callable);
$logger->log("Provided callable " . (string) $callable . " called");

问题是,这会引发错误,例如数组到字符串的转换错误。打印出该可调用项有用信息的最佳方法是什么?

类似的方法应该可以:


你考虑过吗?还是说细节太多了?@dave如果涉及到一个物体,那么细节就太多了。理想情况下,如果它是一个匿名函数,那么它应该是类名、函数/方法名或描述性字符串。我想我可以编写自定义代码来处理所有可能的情况,但我不想重新发明轮子。你的typehint已经可以调用了,那么为什么要检查is\u字符串和is\u数组呢?传递字符串或数组会引发致命错误。普通字符串和数组也是可调用的。您可以在这里检查什么是可调用的:字符串是字符串的类型,而不是可调用的。你测试过了吗?我以1:1测试了你的代码,看你是绝对正确的,typehint是错误的,我的错。我将编辑答案。谢谢你让我知道!
function getCallableName($callable) {
    if (is_string($callable)) {
        return trim($callable);
    } else if (is_array($callable)) {
        if (is_object($callable[0])) {
            return sprintf("%s::%s", get_class($callable[0]), trim($callable[1]));
        } else {
            return sprintf("%s::%s", trim($callable[0]), trim($callable[1]));
        }
    } else if ($callable instanceof Closure) {
        return 'closure';
    } else {
        return 'unknown';
    }
}