如何检查函数是否作为参数传递?
特别是如果传递的函数返回一个字符串等?
以下示例中的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');
这个例子似乎对我不起作用。当它是一个函数时,我仍然得到了很多内容。
答案 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>');