4

私は__isset()すでに長い間カスタム関数を使用してきました。これは基本的に、コードの見栄えを良くし、入力時間を節約するためにのみ存在します。

function __isset(&$aVariable, $aDefault = null) {
    return isset($aVariable) ? $aVariable : $aDefault;
}

しかし、今日、この関数が存在しない場合、実際に変数を作成していることがわかりました! これは、配列のプロパティをチェックしているときに大きな問題になります。

$lArray = ('A', 'B', 'C');
$lValue = __isset($lArray[4], 'D');
print_r($lArray); // Outputs 0=>'A', 1=>'B', 2=>'C', 3=>NULL

isset()だから私が望むのは、PHPから現在の関数を複製し、それを変更して私が望むことをすることです。isset()問題は、PHP ソース コードで実際の関数が見つからないことです...

多くのフレームワークがisset()最初の例で示したような関数を使用しており、この問題に遭遇したのは私が最初だとは思えません。

だから私の質問は:

  1. isset()実際のPHP 関数はどこにありますか?
  2. 実際のisset()C 関数 (実際の実装) はどこにありますか?
  3. 値または指定されたデフォルト値を返すようにコードを変更する方法は?
4

3 に答える 3

3

なぜこれが?削除&して、それだけです:

function __isset($aVariable, $aDefault = null) {
    return isset($aVariable) ? $aVariable : $aDefault;
}
于 2012-10-04T09:44:33.383 に答える
0

array_key_existを使用して、実際の比較の前に配列キーが存在するかどうかを確認します

$lArray = array('A','B','C');
$LValue = array_key_exists(2, $lArray)?$lArray[2]:'D';
echo $LValue;

__isset を特別なハンドル配列に変更する必要があることを確認してください

于 2012-10-04T09:42:46.220 に答える
0

&記号を削除するとalone生成されNotice: Undefined offset: 4 inます。&E_NOTICE error@

$lArray = array('A', 'B', 'C');
$lValue = __isset(@$lArray[4], 'D'); // or @__isset($lArray[4], 'D');

var_dump($lValue);
var_dump($lArray);

function __isset($aVariable, $aDefault = null) {
    return isset($aVariable) ? $aVariable : $aDefault ;
}

出力 (E_NOTICE エラーなし)

string 'D' (length=1)
array
  0 => string 'A' (length=1)
  1 => string 'B' (length=1)
  2 => string 'C' (length=1)

別の解決策は、isset配列とオブジェクトを管理するために別のものを使用することです

$lArray = array('A','B','C');
$lValue = __issetComplex($lArray, 4, 'D');

var_dump($lValue);
var_dump($lArray);


function __issetComplex($mixed, $key, $aDefault = null) {
    if (is_array($mixed))
        return array_key_exists($key, $mixed) ? $mixed[$key] : $aDefault;
    if (is_object($mixed))
        return isset($mixed->key) ? $mixed->key : $aDefault;
    return $aDefault;
}

最後に、PHP の isset 関数を自分でオーバーライドすることができます。override_function を参照してください

于 2012-10-04T10:03:01.243 に答える