1

それが苛立たしい質問であるならば申し訳ありません(私はルビーのバックグラウンドから来て、私はPHPに不慣れです)。

私はあなたができないのはちょっと奇妙だと思います:

 if($defined_array['undefined_index'] == 'a string') {
     do_something();
 }

警告で顔を叩かれることなく。

  1. この特定のケースでは、変数が存在しない場合、どうして警告が表示されますか?これは、緩く型付けされた言語の平等の奇妙な実装です。だけを取得する方がはるかに理にかなっていますfalse。通訳の制限によるものですか?この背後にある技術的な理由は何ですか?私はただ興味があります。
  2. 4行ごとにこれを実行することを回避する関数、構成、イディオム、または私が知らないものはありますか?

    if(isset($defined_array['undefined_index']) && $defined_array['undefined_index'] == 'a string') {
         do_something();
    }
    

    使用するすべての配列キーを宣言できることは知っていますが、PHPが毎回あなたを平手打ちするつもりなら、使用する前に変数を宣言するように強制されないのはどういう意味ですか?

4

6 に答える 6

3

警告の理由は、コードの安全上の理由によるものです。配列キーが存在しない理由は、このインスタンスでは提供されていないためである可能性がありますが、要素の設定または取得のいずれかにタイプミスがあった可能性もあります。警告がなければ、そのようなコーディングエラーは気づきにくいでしょう。

于 2012-11-15T09:16:34.963 に答える
2

いいえ、同じ表現ではありません。ただし、独自の比較関数を作成するか、(絶対に恐ろしい)エラー抑制演算子@を使用することができます。エラー抑制は常に悪い考えですが、代わりに問題を解決することをお勧めします。

1:独自の機能:

function setAndEq($a, $b){
    if(isset($a, $b))
        return $a === $b;
    else
        return false;
}

if(setAndEq($array['undefined_index'], "hello")) {
    // hello
}

2:エラー抑制:

if(@strcmp($array['undefined_index'], "hello") === 0) {

}
于 2012-11-15T08:57:16.703 に答える
1

状況によって異なりますが、まずはerror_reportingを無効にすることができますが、お勧めしません。

同じ配列キーに対して複数のチェックがある場合は、次のことも試すことができます。

if (isset($defined_array['undefined_index'])) :
switch ($defined_array['undefined_index']) :
    case 'a string' :
        do_something();
    break;
    case 'b string' :
        do_anotherthing();
    break;    
endswitch;
endif;

その場合、各行のすべての警告について心配する必要はありません。

于 2012-11-15T08:48:03.230 に答える
1

適切なエラーレベルを設定することで警告を消音することもできますが、それはあまり良い考えではありません。個人的に私はタイピングを容易にするために小さな関数を使用しています:

/**
 * nullsafe
 *
 * returns values from array like objects
 *
 * Usage:
 *    nullsafe($array, 'key'); - returns the $array['key'] if it is set
 *    nullsafe($array, 'key', 'foo'); - returns the $array['key'] if it is set, 'foo' otherwise
 *    nullsage($array, array('level0', 'level1')); returns $array['level0']['level1'] if it is set, null otherwise
 *
 * returns value indexed by $key from the $from, or the $default if its not present
 * if the key is an array then it will descend it into the $from like $from[$key[0]][$key[1]][$key[2]]...
 *
 * @param mixed $from
 * @param mixed $key
 * @param mixed $default
 * @return mixed
 */
function nullsafe($from, $key, $default = null) {
    if (!is_array($key)) {
        if (isset($from[$key])) {
            return $from[$key];
        }
    } else {
        foreach ($key as $k) {
            if (!isset($from[$k])) {
                return $default;
            } else {
                $from = $from[$k];
            }
        }
        return $from;
    }
    return $default;
}
于 2012-11-15T08:52:19.703 に答える
1

1について:変数が存在しない場合は、常に警告が表示されます。これは、コードを正しく記述しなかったことを示しています。未設定の変数(または配列キー)がFALSEと評価される場合、これはまったく間違っています。問題は技術的な理由ではないと思います-それは常識です。

2について:いいえ。empty()またはを使用して、厳密な型チェックを使用してください。.の代わりにisset()peを使用してください。if ($x === FALSE)if ($x == NULL)

于 2012-11-15T09:15:42.640 に答える
0

編集: issetエラー制御演算子を組み合わせて、変数の値を常に返す関数を宣言するか、変数nullが設定されていない場合は次のように宣言できます。

$ php -a
Interactive shell

php > function getvalue($var) {
php { return isset($var) ? $var: null;
php { }
php > $testarray['key1'] = "hello";
php > if ($myvar = @getvalue($testarray['key1'])) echo "var: " . $myvar;
var: hello
php > if ($myvar = @getvalue($testarray['key2'])) echo "var: " . $myvar;
php >

存在しない変数と存在するがその値が。である変数を区別できないことに注意してくださいnull

于 2012-11-15T08:47:08.687 に答える