0

问题:

如何检查函数是否作为参数传递?

特别是如果正在传递的函数返回一个字符串等?

IE 在下面的示例中,我不想将函数 html 作为参数传递给 htmlentities,但我确实想要 htmlentities 其他任何东西。还假设可能有多个参数需要稍后使用函数。

例子:

function html($tag,$content)
{

if(!is_callable($content)){$var=htmlentities($var, ENT_NOQUOTES, "UTF-8");}

return "<".$tag.">".$content."</".$tag.">";

}


echo html(html('Example','Example'),'Example');

这个例子似乎对我不起作用。当它是一个函数时,我仍然会得到 htmlentitied 内容。

4

3 回答 3

2

虽然您无法检测传递给函数的字符串是否是另一个函数的结果,但您可以传递不是字符串但行为类似于字符串的内容。

虽然我并不真正推荐这个,而且副作用可能很多,但这里有一个可能的解决方案。

一个假装成字符串的助手类,但它是一个类。

class sillyString
{
    private $string = '';

    public function __construct($string)
    {
        $this->string = $string;
    }

    public function __toString()
    {
        return $this->string;
    }
}

你的功能。我稍微调整了一下,但它会检查内容的类型。

function html($content, $tag)
{
    if (!is_object($content)) {
        $content = htmlentities($content, ENT_NOQUOTES, "UTF-8");
    }

    return new sillyString("<".$tag.">".$content."</".$tag.">");
}

像以前一样调用你的函数。

print html(html('content','tag1'),'tag2');

所以函数现在可以告诉你没有传递一个字符串,但你仍然可以像函数内部的字符串一样使用它。

于 2012-07-27T16:00:28.757 回答
1

从我在您的示例中可以看出,实现您正在寻找的最佳方法是第三个参数$escape_var

function foo( $var, $var2, $escape_var = true)
{
    if( $escape_var === true)
        $var = htmlentities( $var, ENT_NOQUOTES, "UTF-8");

    return $var." ".$var2;
}

echo foo(foo('<Example>','<Example>'),'<Example>', false);
于 2012-07-27T15:23:14.517 回答
0

不,您无法检查,您没有传递函数,只是传递了函数的返回值。

相反,您可以根据需要执行以下操作。

function foo() {
  $vars = func_get_args();
  foreach ($vars as &$var) {
    $var = htmlentities($var, ENT_NOQUOTES, "UTF-8");
  }
  return implode(" ", $vars);
}

// usage
foo('<Example>', '<Example>', '<Example>');
于 2012-07-27T15:26:14.527 回答