2015-01-12 15 views
5

を返すISSET関数を記述、配列、配列要素、オブジェクト、例:

$foo = isset($array['element']) ? $array['element'] : null; 
$foo = isset($nestedArray['element']['key']) ? $nestedArray['element']['key'] : null; 
$foo = isset($object->prop) ? $object->prop : null; 
$foo = isset($object->chain->of->props) ? $object->chain->of->props : null; 

この繰り返し論理を(単純な)関数として書く方法はありますか?たとえば、私は試しました:

function myIsset($mixed) 
{ 
    return isset($mixed) ? $mixed : null; 
} 

上記の機能は動作するように見えますが、実際にはそうではありません。たとえば、$object->propが存在せず、私がmyIsset($object->prop))を呼び出した場合、関数が呼び出される前に致命的なエラー:Undefined property: Object::$propが発生します。

どのように私はそのような関数を書くだろうか?それも可能ですか?

herehereといういくつかのソリューションが掲載されていますが、これらのソリューションはアレイ専用です。あなたは、実際にはそれが好きで書くことができる

+3

私はそれをより効率的に行うことはできません。代わりに、私はあなたがそれを使用する回数を減らすように努力するだろう、*千人*はあまりにも多くのようだ。私は、変数のブロック全体が設定されているかどうかを確認するので、1つをチェックすることで、さまざまな設定を行う機会が与えられます。 – jeroen

+2

@jeroenこれはどこでも頻繁にチェックしなければならない場合は "コードの匂い"です。 –

答えて

7

php referencesを読んでいる間に私自身の質問に対する答えが見つけ出されました。次のように私の解決策は次のとおりです。うまくいけば、これはそこに誰もが同様のソリューションを探しているのに役立ちます

$foo = issetValueNull($array['element']); 
$foo = issetValueNull($nestedArray['element']['key']); 
$foo = issetValueNull($object->prop); 
$foo = issetValueNull($object->chain->of->props); 

:この機能に

function issetValueNull(&$mixed) 
{ 
    return (isset($mixed)) ? $mixed : null; 
} 

コールは今のように見えます。

+0

これは素晴らしい発見です!これを投稿していただきありがとうございます! –

0

$foo = $mixed?:null; 
+1

いいえ、 '$ mixed'が設定されていないと警告が表示されます。 – jeroen

+0

通知を生成します。また、本番環境では通知や警告が表示されることはありません。 –

+0

そのようなコードを書いているならば、未設定の変数が 'NULL'と評価されるので、その全体の3進表現をスキップするかもしれません。 – jeroen

-2

あなたはちょうどそれがこの

function myIsset($mixed) 
{ 
    return isset($mixed); // this is a boolean so it will return true or false 
} 
+1

なぜグローバル関数の結果を返す関数を書くのですか?セマンティクス? – Leo

+1

私はそれが冗長であることに同意します。 – Rafael

2

issetを行う存在するかどうかを確認したい場合は、言語構造ではなく、通常の関数です。したがって、それ以外の場合にはエラーが発生する可能性があり、falseを返すだけです。

myIsset($object->prop))を呼び出すと、評価が行われ、エラーが発生します。

これはJavaScriptでtypeof nonExistentVariableを使用するのと同じ問題であるhttp://php.net/manual/en/function.isset.php

を参照してください。 typeofは言語構成であり、エラーは発生しません。

しかし、関数を作成しようとすると、未定義の変数を使用しようとするとエラーが発生します。

-1
function f(&$v) 
{ 
    $r = null; 

    if (isset($v)) { 
     $r = $v; 
    } 

    return $r; 
} 
関連する問題

 関連する問題