2015-01-12 11 views
5

Ich habe den folgenden Code in zahlreichen Orten (in Tausend Plätzen) um mein Projekt:php: schreiben isset Funktion, den Wert oder null zurückgibt

$foo = isset($mixed) ? $mixed : null; 

Wo $mixed kann alles sein: Array, Array-Element, Objekt, Objekteigenschaft, Skalar usw. Zum Beispiel:

$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; 

Gibt es eine Möglichkeit, diese wiederholte Logik als (einfache) Funktion zu schreiben? Zum Beispiel habe ich versucht:

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

Die obige Funktion sieht aus wie es funktionieren würde, aber es nicht in der Praxis. Zum Beispiel, wenn $object->prop nicht existiert, und ich rufe myIsset($object->prop)), dann bekomme ich fatalen Fehler: Undefined property: Object::$prop bevor die Funktion sogar aufgerufen wurde.

Irgendwelche Ideen, wie ich eine solche Funktion schreiben würde? Ist es überhaupt möglich?

Ich weiß, dass einige Lösungen here und here geschrieben wurden, aber diese Lösungen sind nur für Arrays.

+3

Ich glaube nicht, dass Sie das effizienter machen können. Stattdessen würde ich versuchen, die Anzahl der Male, die Sie verwenden, zu reduzieren, * Tausende * scheint viel zu viel. Ich würde vermuten, dass ganze Blöcke von Variablen entweder gesetzt sind oder nicht, so dass Sie die Möglichkeit haben, verschiedene zu setzen. – jeroen

+2

@jeroen Es ist ein "Code-Geruch", wenn Sie dies so oft überprüfen müssen –

Antwort

7

Ich stolperte über die Antwort auf meine eigene Frage beim Lesen über . Meine Lösung ist wie folgt:

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

Anrufe auf diese Funktion nun so aussehen:

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

Hoffentlich hilft dies jemand da draußen für eine ähnliche Lösung.

+0

Dies ist ein erstaunlicher Fund! Danke für das Posten! –

0

Sie könnten eigentlich nur schreiben es mag:

$foo = $mixed?:null; 
+1

Nein, das würde eine Warnung erzeugen, wenn '$ mixed' nicht gesetzt ist. – jeroen

+0

Es würde eine Benachrichtigung generieren. Und Sie haben nichts zu tun, wenn Benachrichtigungen oder Warnungen in einer Produktionsumgebung angezeigt werden. –

+0

Wenn Sie Code wie diesen schreiben, können Sie genauso gut den ganzen ternären Ausdruck überspringen, wenn eine nicht gesetzte Variable "NULL" ergibt. – jeroen

-2

Wenn Sie wollen einfach nur überprüfen, ob es existieren diese

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

Warum eine Funktion schreiben, die nur das Ergebnis einer globalen Funktion zurückgibt? Semantik? – Leo

+1

ich stimme zu, es ist redundant. – Rafael

2

isset ist ein Sprachkonstrukt, keine reguläre Funktion. Daher kann es annehmen, was sonst einen Fehler verursachen würde, und einfach false zurückgeben.

Wenn Sie myIsset($object->prop)) aufrufen, tritt die Auswertung auf und Sie erhalten den Fehler.

Siehe http://php.net/manual/en/function.isset.php

Dies ist das gleiche Problem wie typeof nonExistentVariable in JavaScript verwenden. typeof ist ein Sprachkonstrukt und verursacht keinen Fehler.

Wenn Sie jedoch versuchen, eine Funktion zu erstellen, erhalten Sie einen Fehler beim Versuch, eine undefinierte Variable zu verwenden.

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

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

    return $r; 
}