我正在阅读一本旧书,并正在使用
function_exists
进行练习
这是练习的代码
<?php
function tagWrap($tag, $txt, $func = "") {
if ((!empty($txt)) && (function_exists($func))) {
$txt = $func($txt);
return "<$tag>$txt</$tag>\n";
}
}
function underline($txt) {
return "<u>$txt</u>";
}
echo tagWrap('b', 'make me bold');
echo tagWrap('i', 'underline me too', "underline");
echo tagWrap('i', 'make me italic and quote me',
create_function("$txt", "return \""$txt"\";"));
?>
正如预期的那样,第一个函数调用没有显示任何内容,因为参数中没有函数,第二个函数调用正确显示,因为定义了
underline
函数,问题在于带有闭包的第三个调用:它应该显示文本,但它没有。
起初我心想“这很愚蠢,我正在编写一个函数,但将 return 作为字符串传递”,但是搞乱它只会让我的 IDE 对我尖叫,所以我猜 PHP 确实是这样工作的,所以我已经已经搞乱了 '' "" 和 `` 一段时间了,但是第三个函数调用无法显示输出。
我创建的闭包是错误的还是这是传递字符串时的一个简单语法问题?
function_exists()
的参数必须是一个字符串,它作为函数名进行查找。你不能向它传递一个闭包。正确的测试应该是 is_callable()
,对于函数名称、数组 [object, method_name]
或闭包来说都是如此。
由于
create_function()
已过时,您应该使用 匿名函数 或 箭头函数。
<?php
function tagWrap($tag, $txt, $func = "") {
if ((!empty($txt)) && (is_callable($func))) {
$txt = $func($txt);
return "<$tag>$txt</$tag>\n";
}
}
function underline($txt) {
return "<u>$txt</u>";
}
echo tagWrap('b', 'make me bold');
echo tagWrap('i', 'underline me too', "underline");
echo tagWrap('i', 'make me italic and quote me',
fn($txt) => , ""$txt"");
?>