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

时间:2012-07-27 15:17:23

标签: php

问题:

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

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

以下示例中的IE我不希望将函数html作为参数传递给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');

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

3 个答案:

答案 0 :(得分: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');

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

答案 1 :(得分: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);

答案 2 :(得分: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>');