Przy włączonym raportowaniu błędów, a nawet dla najlepszych praktyk, podczas kasowania zmiennej w PHP, czy powinieneś najpierw sprawdzić, czy istnieje (w tym przypadku nie zawsze istnieje) i usunąć ją, czy po prostu usunąć?
<?PHP
if (isset($_SESSION['signup_errors'])){
unset($_SESSION['signup_errors']);
}
// OR
unset($_SESSION['signup_errors']);
?>
NOT
użyciuisset
. Spójrz na moją odpowiedź. Zrobiłem testy, aby znaleźć różnicę prędkości.Odpowiedzi:
Po prostu go rozłącz, jeśli nie istnieje, nic nie zostanie zrobione.
źródło
if set
może mieć lepszy schemat indeksowania. (Tylko przykład, poprzedni to prawdopodobnie szewc i oba podejścia używają tej samej metody sprawdzania danych).isset
wersetów nieużywanychisset
.Z podręcznika PHP :
źródło
Użycie
unset
na niezdefiniowanej zmiennej nie spowoduje żadnych błędów (chyba że zmienna jest indeksem tablicy (lub obiektu), który nie istnieje).Dlatego jedyne, co musisz wziąć pod uwagę, to to, co jest najbardziej wydajne. Bardziej efektywne jest nie testowanie z „isset”, jak pokaże mój test.
Test:
function A() { for ($i = 0; $i < 10000000; $i++) { $defined = 1; unset($defined); } } function B() { for ($i = 0; $i < 10000000; $i++) { $defined = 1; unset($undefined); } } function C() { for ($i = 0; $i < 10000000; $i++) { $defined = 1; if (isset($defined)) unset($defined); } } function D() { for ($i = 0; $i < 10000000; $i++) { $defined = 1; if (isset($undefined)) unset($undefined); } } $time_pre = microtime(true); A(); $time_post = microtime(true); $exec_time = $time_post - $time_pre; echo "Function A time = $exec_time "; $time_pre = microtime(true); B(); $time_post = microtime(true); $exec_time = $time_post - $time_pre; echo "Function B time = $exec_time "; $time_pre = microtime(true); C(); $time_post = microtime(true); $exec_time = $time_post - $time_pre; echo "Function C time = $exec_time "; $time_pre = microtime(true); D(); $time_post = microtime(true); $exec_time = $time_post - $time_pre; echo "Function D time = $exec_time"; exit();
Wyniki:
Function A time = 1.0307259559631
Function B time = 0.72514510154724
Function C time = 1.3804969787598
Function D time = 0.86475610733032
Wniosek:
Jest zawsze mniej efektywny w użyciu
isset
, nie wspominając o niewielkiej ilości dodatkowego czasu potrzebnego na napisanie. Szybciej jest spróbowaćunset
użyć niezdefiniowanej zmiennej niż sprawdzić, czy to możliweunset
.źródło
Jeśli chcesz usunąć ustawienie zmiennej, możesz po prostu użyć
unset
unset($any_variable); // bool, object, int, string etc
Sprawdzanie jej istnienia nie przynosi żadnych korzyści przy próbie cofnięcia ustawienia zmiennej.
Jeśli zmienna jest tablicą i chcesz usunąć ustawienie elementu, musisz upewnić się, że rodzic istnieje jako pierwszy, dotyczy to również właściwości obiektu.
unset($undefined_array['undefined_element_key']); // error - Undefined variable: undefined_array unset($undefined_object->undefined_prop_name); // error - Undefined variable: undefined_object
To jest rozwiązywane przez owijanie
unset
wif(isset($var)){ ... }
bloku.if(isset($undefined_array)){ unset($undefined_array['undefined_element_key']); } if(isset($undefined_object)){ unset($undefined_object->undefined_prop_name); }
Powodem, dla którego sprawdzamy tylko zmienną ( rodzica ), jest po prostu to, że nie musimy sprawdzać właściwości / elementu, a pisanie i obliczanie byłoby dużo wolniejsze, ponieważ wymagałoby to dodatkowego sprawdzenia.
if(isset($array)){ ... } if(isset($object)){ ... }
.vs
$object->prop_name = null; $array['element_key'] = null; // This way elements/properties with the value of `null` can still be unset. if(isset($array) && array_key_exists('element_key', $array)){ ... } if(isset($object) && property_exists($object, 'prop_name')){ ... } // or // This way elements/properties with `null` values wont be unset. if(isset($array) && $array['element_key'])){ ... } if(isset($object) && $object->prop_name)){ ... }
Jest to oczywiste, ale ważne jest również, aby znać
type
zmienną podczas pobierania, ustawiania i rozbrajania elementu lub właściwości; użycie złej składni spowoduje zgłoszenie błędu.To samo dzieje się przy próbie cofnięcia wartości wielowymiarowej tablicy lub obiektu. Musisz upewnić się, że klucz / nazwa nadrzędna istnieje.
if(isset($variable['undefined_key'])){ unset($variable['undefined_key']['another_undefined_key']); } if(isset($variable->undefined_prop)){ unset($variable->undefined_prop->another_undefined_prop); }
Kiedy mamy do czynienia z przedmiotami, należy pomyśleć o innej rzeczy, a jest to widoczność.
To, że istnieje, nie oznacza, że masz uprawnienia do jego modyfikacji.
źródło
unset
właściwość nieistniejącego obiektu nadrzędnego. Jednak rozłożenie klucza w nieistniejącej tablicy w PHP8 powoduje nie tylko powiadomienie, ale także ostrzeżenie (może ulec zmianie).Sprawdź ten link https://3v4l.org/hPAto
Narzędzie online pokazuje zgodność kodu z różnymi wersjami PHP
Zgodnie z tym narzędziem kod
unset($_SESSION['signup_errors']);
działałoby dla PHP> = 5.4.0 bez podawania żadnych powiadomień / ostrzeżeń / błędów.
źródło