2012-07-27 68 views
0

问题:

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

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

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内容。

+4

您没有向'foo()'传递函数,而是将内部'foo()'函数的返回值传递给外部'foo()',这是一个字符串。 – nickb 2012-07-27 15:19:09

+0

即便如此,有没有办法检查一个函数是否返回一个值?一些方法来检测功能输入? @nickb – 2012-07-27 15:20:00

+0

可能的重复:http://stackoverflow.com/questions/2835627/php-is-function-to-determine-if-a-variable-is-a-function第二个答案应该可以解决您的问题 – nybbler 2012-07-27 15:22:29

回答

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'); 

所以函数现在可以告诉你没有通过一个字符串,但你仍然可以使用它完全一样的功能,里面的字符串。

+0

这看起来和我一直在寻找的一样,谢谢。 – 2012-07-27 16:11:51

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); 
+0

这似乎是目前的答案的最佳途径,但如果我最终添加更多的参数,需要接受函数返回字符串等?我需要每一个真/假。 – 2012-07-27 15:36:55

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>'); 
相关问题