-2

私はPHPに関数を持っていますが、これにはデフォルトでいくつかの引数がありnull、引数の総数より少ない数で簡単に呼び出すことができます。問題は、nullのデフォルトの引数を直接使用すると、指定された引数を取得しますが、その値を別の変数にコピーしようとすると、変数はデフォルト値の。のみを取得することですnull。次のようになります。

// inside my MySQLI wrapper class...
public function bind(&$stmt, $types = "", &$arg1, &$arg2 = null, &$arg3 = null /* this goes up to 20; it's auto-generated by another script */)
{
    echo "dumping...";
    var_dump($arg1); // var_dump shows value from function call (string(0))
    var_dump($arg2); // ditto
    echo "...dumped";
    if ($arg2 != null) $foo = $arg2; var_dump($foo); echo "foo"; // var_dump shows that $foo is NULL
    /* ... */
}

別のスクリプトから次のような関数を呼び出します:(これは、トラックや車を処理するダミーのスクリプトです)。

$make = "";
$model = "";
$year = 0;
$license = "";
list($error, $message) = $mysql->bind($stmt, "", $make, $model, $year, $license);

私のbind()関数はMySQLIbind_param()bind_result()関数のラッパーです。実際のロジックに到達する前に、その時点ですでに失敗しているため、上位の2行のみを含めました。

今のところ、これはPHPのバグのように見えます。これは、変数、引数、デフォルト引数、および参照がどのように機能するかについて私が知っていることに従っていないためです。さらに、この問題は実際のコードにのみ現れるようであり、これをテストするためにコーディングした単純なphpファイルには現れません。

詳細情報:

$fooNULLが空の文字列の場合は、が割り当てられ、$arg2空でない文字列の場合は""適切に割り当てられます。空の文字列はまだ有効な文字列ですが、なぜPHPがこれを行うのですか?

4

1 に答える 1

1

問題は!=比較です。何が起こるかというと、PHPは少なくとも1つの変数を型ジャグリング"" != nullし、そのため、falseと評価されます。このページの途中の表は、異なるタイプ間の比較で何が起こるかを示しています。タイプ厳密なフォーム!==が必要です。

if ($arg2 !== null)
    $foo = $arg2;
于 2013-02-13T20:35:02.347 に答える