PHP:这个闭包语法有问题吗?

问题描述 投票:0回答:1

我正在阅读一本旧书,并正在使用

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 \"&quot;$txt&quot;\";"));
?>

正如预期的那样,第一个函数调用没有显示任何内容,因为参数中没有函数,第二个函数调用正确显示,因为定义了

underline
函数,问题在于带有闭包的第三个调用:它应该显示文本,但它没有。

起初我心想“这很愚蠢,我正在编写一个函数,但将 return 作为字符串传递”,但是搞乱它只会让我的 IDE 对我尖叫,所以我猜 PHP 确实是这样工作的,所以我已经已经搞乱了 '' "" 和 `` 一段时间了,但是第三个函数调用无法显示输出。

我创建的闭包是错误的还是这是传递字符串时的一个简单语法问题?

php string syntax closures
1个回答
0
投票

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) => , "&quot;$txt&quot;");
?>
© www.soinside.com 2019 - 2024. All rights reserved.