2015-01-12 16 views
5

Mam następujący kod w wielu miejscach (w tysiącach miejsc) wokół mojego projektu:php: napisać Isset funkcję, która zwraca wartość lub wartość null

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

Gdzie $mixed może być cokolwiek: tablica, element tablicy, obiekt, właściwość obiektu, skalar itd. Na przykład:

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

Czy istnieje sposób na zapisanie tej powtarzającej się logiki jako (prostej) funkcji? Na przykład próbowałem:

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

Powyższa funkcja wygląda na to, że zadziała, ale nie sprawdza się w praktyce. Na przykład, jeśli $object->prop nie istnieje, a ja dzwonię pod numer myIsset($object->prop)), otrzymuję błąd krytyczny: Undefined property: Object::$prop, zanim funkcja zostanie wywołana.

Jakieś pomysły dotyczące napisania takiej funkcji? Czy to możliwe?

Zdaję sobie sprawę, niektóre rozwiązania zostały opublikowane here i here, ale te rozwiązania są tylko dla tablic.

+3

Nie sądzę, że można to zrobić bardziej efektywnie. Zamiast tego spróbowałbym zmniejszyć liczbę razy, kiedy go używasz, * tysiące * wydaje się zdecydowanie za dużo. Domyślam się, że całe bloki zmiennych są ustawione, czy nie, więc sprawdzanie, czy można dać możliwość ustawienia różnych. – jeroen

+2

@jeroen To jest "zapach kodu", jeśli musisz sprawdzać to tak często wszędzie –

Odpowiedz

7

natknąłem odpowiedzi na moje własne pytanie podczas czytania o php references. Moje rozwiązanie jest następujące:

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

apeluje do tej funkcji teraz wyglądać następująco:

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

Mam nadzieję, że to pomoże ktoś tam szuka podobnego rozwiązania.

+0

To jest niesamowite znalezisko! Dziękujemy za opublikowanie tego! –

0

Można było rzeczywiście tylko napisać to podoba:

$foo = $mixed?:null; 
+1

Nie, to generuje ostrzeżenie, jeśli '$ mixed' nie jest ustawione. – jeroen

+0

Generowałby komunikat. Nie musisz mieć żadnych powiadomień o wyświetlaniu ostrzeżeń w środowisku produkcyjnym. –

+0

Jeśli piszesz taki kod, równie dobrze możesz pominąć całe potrójne wyrażenie, ponieważ zmienna nieprzypisana zwraca wartość "NULL". – jeroen

-2

Jeśli chcesz po prostu sprawdzić, czy istnieje to zrobić

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

Po co pisać funkcję, która właśnie zwraca wynik funkcji globalnej? Semantyka? – Leo

+1

Zgadzam się, że jest zbędny. – Rafael

2

isset jest konstruktem język, a nie regularny funkcja. Dlatego może wziąć to, co w przeciwnym razie spowoduje błąd, i po prostu zwróci false.

Po wywołaniu myIsset($object->prop)) następuje ocena i pojawia się błąd.

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

To jest ten sam problem, jak za pomocą typeof nonExistentVariable w JavaScript. typeof jest konstrukcją językową i nie spowoduje błędu.

Jednak próba utworzenia funkcji powoduje błąd przy próbie użycia niezdefiniowanej zmiennej.

function isDef(val) { 
    return typeof val !== 'undefined'; 
} 

console.log(typeof nonExistent !== 'undefined'); // This is OK, returns false 
isDef(nonExistent); // Error nonExistent is not defined 
-1
function f(&$v) 
{ 
    $r = null; 

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

    return $r; 
} 
Powiązane problemy