2010-04-08 17 views
10

Czy jest to dobra praktyka lub dopuszczalny sposób na użycie tłumienia błędów PHP?

if (isset($_REQUEST['id']) && $_REQUEST['id'] == 6) { 
    echo 'hi'; 
} 

if (@$_REQUEST['id'] == 6) { 
    echo 'hi'; 
} 

EDIT:
tak myślałem. Kod (i pomysł) pochodzi od przyjaciela.
Dzięki za udowodnienie, że mam rację. :)

+1

EDYCJA: Dodanie nawiasu zamykającego do wywołania 'isset()'. –

Odpowiedz

12

Nie jest dobrą praktyką stosowanie tłumienia błędów. Nie jest nawet dobrą praktyką używanie $ _REQUEST w ogóle. Po prostu użyj isset() lub! Empty() lub cokolwiek, nie bądź leniwy.

I jeszcze jedno, to jest „dobra praktyka”, aby zamknąć nawias przy użyciu isset() :)

+1

Możesz również użyć 'array_key_exists' aby sprawdzić, czy zmienna wysłana przez przeglądarkę –

+0

tak, dlatego dodałem" lub cokolwiek ":) – Kemo

+1

Poddałem się temu, ale dla kompletności możesz dodać wyjaśnienie dla OP o powodach. – Gordon

2

Zawsze używam isset(), ponieważ jest bardziej szczegółowy. Ponadto użyłbym bardziej specyficznej zmiennej superglobalnej, więc używaj $ _POST, $ _GET, $ _SESSION. Być jasne, z kodem unika bólu głowy później :)

ten sposób uruchomić mój kontrole:

if(isset($_POST['id']) && $_POST['id'] == '6') 
{ 
    // do stuff 
} 

Jest to dość dokładne sprawdzanie, ponieważ sprawdza dla istnienia urzędu, to czy mój zmiennej jest częścią postu, a na końcu, jeśli te dwie osoby przejdą, sprawdza, czy moja zmienna jest równa 6.

+2

Początkowa kontrola boolowska dla '$ _POST' jest niepotrzebna. Również użycie 'isset' jest preferowane w stosunku do' array_key_exists', jest to wiele razy szybsze. Jedyną zaletą jest to, że chcesz sprawdzić, czy "id" istnieje, ale ma wartość null. – ryeguy

+0

@ryeguy dzięki za poradę! :) myślenie o tym teraz tak, to trochę głupie, ponieważ array_key_exists iteruje nad tablicą, prawda? – studioromeo

+0

Początkowo też to pomyślałem, ale to nieprawda. Jeśli testujesz 'array_key_exists' zobaczysz, że to' O (1) ', tak jak' isset'. Myślę, że 'isset' jest szybszy po prostu dlatego, że jest konstrukcją językową, więc nie ma żadnego wezwania do wywołania funkcji, jak w przypadku' array_key_exists'. – ryeguy

3

Nie, to naprawdę nie jest do przyjęcia praktyka moim zdaniem. Oprócz tego, że wygląda to niechlujnie, niestandardowe procedury obsługi błędów są nadal wyzwalane, nawet przy użyciu tłumienia błędów.

manual oferuje więcej powodów, aby uniknąć jego stosowanie całkowicie:

Obecnie „@” Błąd sterowania prefiks operator raportowania dla krytycznych błędów, które zakończy wykonywanie skryptu nawet błąd wyłączyć. Między innymi oznacza to, że jeśli użyjesz "@" do stłumienia błędów z określonej funkcji i albo nie będzie dostępny lub został źle wpisany, skrypt zginie dokładnie tam, bez wskazania, dlaczego.

16

Pomijanie błędów za pomocą @ tylko pomija wyświetlanie błędu, a nie tworzenie. Otrzymujesz małe trafienie wydajnościowe od błędu, jeśli nie sprawdzasz najpierw isset().

+0

To jest najlepsza właściwa odpowiedź –

1

Oprócz tego, że nie jest to dobra praktyka, ponieważ @ może zżerać naprawdę ważne błędy w stosie wywołań, kara wykonania jest niewielka.

Sprawdźmy to za pomocą testu porównawczego.

<?php 
error_reporting(-1); 

$limit = 10000; 

$start = microtime(true); 
for ($i = 0; $i < 10000; $i++) { 
    echo !isset($_GET['aaa']) ? '' : $_GET['aaa']; 
} 
$total = 1000000 * (microtime(true) - $start)/$limit; 
echo "With isset: $total μs\n"; 

$start = microtime(true); 
for ($i = 0; $i < 10000; $i++) { 
    echo @$_GET['aaa']; 
} 
$total = 1000000 * (microtime(true) - $start)/$limit; 
echo "With @: $total μs\n"; 

Na moim nie tak niedawno komputera wyprowadza:

With isset: 0.295 μs 
With @: 0.657 μs 

mikrosekund jest milionowa sekundy. Obie metody zajmują blisko połowę jednej milionowej sekundy.

Można powiedzieć, ale co jeśli zrobię to setki lub tysiące razy, czy będzie jakakolwiek różnica? Jeśli musisz zrobić milion razy, to twój program spędził około 0,3 sekundy, robiąc to! Co oznacza, że ​​nie powinieneś tego robić w pierwszej kolejności.

Mimo to, @ jest złą praktyką dla wszystkiego, co jest bardziej skomplikowane niż prosta tablica, a więc , nie używaj go jako, nawet jeśli wiesz, że różnica w wydajności jest niewielka.

Powiązane problemy