2012-07-27 102 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>'); 
相關問題