如何检查函数是否作为参数传递?
问题:
如何检查函数是否作为参数传递?如何检查函数是否作为参数传递?
特别是如果被传递的函数返回一个字符串等?
IE在下面的例子中我不希望htmlentities函数html被作为参数传递,但我确实想要其他的东西。另外假设可能有多个参数需要稍后才能使用。
例子:
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内容。
虽然你如果被传递给函数的字符串是另一个函数的结果不能检测,可以传递的东西是不是一个字符串,但就像一个字符串。
虽然我不真的推荐这个,并且副作用可能很充足,但这里是可能的解决方案。
伪装成字符串的助手类,但它是一个类。
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-27 16:11:51
从我可以在你的例子来讲,最好的方式来实现你要找什么是第三个参数,$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-27 15:36:55
不,你不能检查,你不及格一个函数,只是超过函数的返回值。
相反,你可以根据你的需要做下面的事情。
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>');
您没有向'foo()'传递函数,而是将内部'foo()'函数的返回值传递给外部'foo()',这是一个字符串。 – nickb 2012-07-27 15:19:09
即便如此,有没有办法检查一个函数是否返回一个值?一些方法来检测功能输入? @nickb – 2012-07-27 15:20:00
可能的重复:http://stackoverflow.com/questions/2835627/php-is-function-to-determine-if-a-variable-is-a-function第二个答案应该可以解决您的问题 – nybbler 2012-07-27 15:22:29