13

非常に単純な質問ですが、E_NOTICEエラーなしで未定義の変数を関数に渡すにはどうすればよいですか?

isset()などの関数に未定義の変数を渡す場合、エラーは発生しませんが、同じものを独自の関数に送信すると、通知:未定義のオフセットなどが表示されます。

今日これが必要な理由をいくつか考えましたが、現在の関数は、isset(a、b、c)のようにすべてではなく、引数のいずれかが設定されているかどうかをチェックすることを除いて、ほとんどissetのクローンです。

function anyset()
{
    $argc = func_num_args();
    $argv = func_get_args();
    for ($i = 0; $i < $argc; $i++) 
        if (isset($argv[$i])) return true;
    else return false;
}

ここで、たとえば[x] [y]の巨大な2次元配列があり、その中に値がランダムに配置されます。ランダム化された座標にその「隣」(x-1、y-1からx + 1、y + 1)などが含まれていることを確認する必要があります。

20,000,000のループを実行して、各変数を初期化する必要はありません。9つの変数を送信して、すでに設定されているかどうかを確認したいだけです。

while (anyset($items[$x-1][$y-1],$items[$x][$y-1],$items[$x+1][$y-1],
              $items[$x-1][$y],$items[$x][$y],$items[$x+1][$y],
              $items[$x-1][$y+1],$items[$x][$y+1],$items[$x+1][$y+1]));

そのようです。

isset(x)を実行できます|| isset(x)|| isset(x)ですが、あまり見栄えがよくありません。

エラーを発生させることなく、未定義の変数を関数に渡すことができるようにする方法はありますか?

簡単なオプションを取ることに興味がない;)

読んでくれてありがとう!

\ o

更新: 2012年4月12日21:03これを可能にする特別な機能はないようです。したがって、anyset(@ $ array [0]、@ $ array [1])などのように渡すか、次のようにすべてを1000のissetでラップします。

while (isset($items[$x-1][$y-1]) || isset($items[$x][$y-1]) || isset($items[$x+1][$y-1]) || 
       isset($items[$x-1][$y])   || isset($items[$x][$y])   || isset($items[$x+1][$y]) || 
       isset($items[$x-1][$y+1]) || isset($items[$x][$y+1]) || isset($items[$x+1][$y+1]));

これが将来誰か他の人に役立つことを願っています!

4

4 に答える 4

10

3つのオプションがあります。

  • issetを使用してロジックを適切に処理します(isset($ x)|| isset($ y)|| isset($ z))
  • すべてをisset()でラップしてから、関数に引数のいずれかが真であるかどうかをチェックさせます(一種のbleh)
  • @を使用してエラーを抑制します(これもbleh)

@の例は次のようになります。

function a($a) { } a(@$x);

ただし、その通知には理由があることを覚えておく必要があります。エラー抑制を避けます。それは私にはハッキーのようです。すべてをisset()で適切にラップします。それはもっと冗長ですが、とにかく、私の意見では、より正確です。

于 2012-04-12T19:54:09.140 に答える
10

参照渡しは、定義された引数に対して機能します。

function my_isset(&$k) { ... }

$bool = my_isset($_POST['hi']);
于 2012-04-12T19:58:31.267 に答える
5

issetこれは、実際には関数ではなくPHP言語の構成要素であるため、少し特殊です[1]

変数が未定義の場合、定義されていないため、実際に渡すことはできません(したがって警告)。

@コメントで述べられているように、変数の前にanを付けることで警告を抑制できます。これにより、設定されていない場合に警告が発行されるのを防ぐことができます。次に、関数内で値がnullかどうかを確認するか、を使用して値issetが登録されているかどうかを確認できます。

于 2012-04-12T19:56:43.163 に答える
-1

たぶん、このようなものがあなたのために働くでしょうか?少しハックですが、関数の引数の遅延評価なしでは、あなたが望むことは完全には不可能だと思います。

if (atLeastOneIsSet($myArray, 1, 3, 4, 6)) doSomething();

function atLeastOneIsSet(array $arr) {
    $args = func_get_args();
    for ($i = 1; $i < func_num_args(); ++$i)
        if (isset($arr[$args[$i]])) return true;
    return false;
}

編集:おっと、論理的な問題。

于 2012-04-12T19:58:05.680 に答える