0

質問:

関数がパラメーターとして渡されているかどうかを確認するにはどうすればよいですか?

特に、渡される関数が文字列などを返す場合は?

以下の例の IE では、パラメーターとして渡される関数 html を htmlentities したくありませんが、それ以外は 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');

この例は私にはうまくいかないようです。関数の場合でも、htmlentitied コンテンツを取得します。

4

3 に答える 3

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

そのため、関数は文字列を渡していないことを伝えることができますが、関数内で文字列とまったく同じように使用できます。

于 2012-07-27T16:00:28.757 に答える
1

あなたの例で私が言えることから、あなたが探しているものを達成するための最良の方法は、3番目のパラメータです$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-27T15:23:14.517 に答える
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>');
于 2012-07-27T15:26:14.527 に答える