Dla zainteresowanych rozszerzyłem ten temat do małego artykułu, który zawiera poniższe informacje w nieco lepiej zorganizowanej formie: The Definitive Guide to PHP isset And empty
IMHO, powinieneś pomyśleć nie tylko o uczynieniu aplikacji „kompatybilną z E_NOTICE”, ale także o zmianie całości. Posiadanie setek punktów w kodzie, które regularnie próbują używać nieistniejących zmiennych, brzmi jak raczej źle skonstruowany program. Próba uzyskania dostępu do nieistniejących zmiennych nigdy nie powinna się zdarzyć, inne języki narzekają na to w czasie kompilacji. Fakt, że PHP pozwala ci to zrobić, nie oznacza, że powinieneś.
Te ostrzeżenia mają ci pomóc , a nie drażnić. Jeśli pojawi się ostrzeżenie „Próbujesz pracować z czymś, co nie istnieje!” Twoja reakcja powinna brzmieć: „Ups, moja wina, naprawię to jak najszybciej”. Jak inaczej zamierzasz odróżnić „zmienne, które działają dobrze, nieokreślone”, a szczerze błędny kod, który może prowadzić do poważnych błędów ? Jest to również powód, dla którego zawsze, zawsze , opracowujesz program z raportowaniem błędów ustawionym na 11 i ciągle podłączasz swój kod, dopóki nie ma ani jednejNOTICE
jest wydane. Wyłączenie raportowania błędów dotyczy tylko środowisk produkcyjnych, aby uniknąć wycieku informacji i zapewnić lepsze wrażenia użytkownika, nawet w przypadku błędnego kodu.
Opracować:
Zawsze będziesz potrzebować isset
lub empty
gdzieś w kodzie, jedynym sposobem na ograniczenie ich występowania jest prawidłowe zainicjowanie zmiennych. W zależności od sytuacji można to zrobić na różne sposoby:
Argumenty funkcji:
function foo ($bar, $baz = null) { ... }
Nie ma potrzeby sprawdzania, czy są ustawione $bar
lub $baz
są ustawione w funkcji, ponieważ po prostu je ustawiasz, jedyne, o co musisz się martwić, to to, czy ich wartość wyniesie true
lub false
(lub cokolwiek innego).
Zwykłe zmienne w dowolnym miejscu:
$foo = null;
$bar = $baz = 'default value';
Zainicjuj swoje zmienne u góry bloku kodu, w którym zamierzasz ich użyć. To rozwiązuje !isset
problem, zapewnia, że zmienne zawsze mają znaną wartość domyślną, daje czytelnikowi wyobrażenie o tym, na czym będzie działać poniższy kod, a tym samym służy również jako rodzaj samodokumentacji.
Tablice:
$defaults = array('foo' => false, 'bar' => true, 'baz' => 'default value');
$values = array_merge($defaults, $incoming_array);
Tak samo jak powyżej, inicjalizujesz tablicę wartościami domyślnymi i nadpisujesz je rzeczywistymi wartościami.
W pozostałych przypadkach, powiedzmy, szablon, w którym wyprowadzasz wartości, które mogą, ale nie muszą być ustawione przez kontroler, wystarczy sprawdzić:
<table>
<?php if (!empty($foo) && is_array($foo)) : ?>
<?php foreach ($foo as $bar) : ?>
<tr>...</tr>
<?php endforeach; ?>
<?php else : ?>
<tr><td>No Foo!</td></tr>
<?php endif; ?>
</table>
Jeśli regularnie używasz array_key_exists
, powinieneś ocenić, do czego go używasz. To robi różnicę tylko tutaj:
$array = array('key' => null);
isset($array['key']); // false
array_key_exists('key', $array); // true
Jak wspomniano powyżej, jeśli poprawnie inicjalizujesz zmienne, nie musisz sprawdzać, czy klucz istnieje, czy nie, ponieważ wiesz, że tak. Jeśli otrzymujesz tablicę z zewnętrznego źródła, wartość najprawdopodobniej nie będzie null
jednak ''
, 0
, '0'
, false
lub coś podobnego, to znaczy wartość można ocenić z isset
lub empty
, w zależności od intencji. Jeśli regularnie ustawiasz klucz tablicy na null
i chcesz, aby miał jakiekolwiek znaczenie, ale false
np. Jeśli w powyższym przykładzie różne wyniki isset
i array_key_exists
wpływają na logikę programu, powinieneś zadać sobie pytanie, dlaczego. Samo istnienie zmiennej nie powinno być ważne, tylko jej wartość powinna mieć znaczenie. Jeśli klucz to true
/ false
flaga, użyjtrue
albo false
nie null
. Jedynym wyjątkiem byłyby biblioteki innych firm, które chcą null
coś znaczyć, ale ponieważ null
jest to tak trudne do wykrycia w PHP, nie znalazłem jeszcze żadnej biblioteki, która to robi.