2010-07-07 10 views
54

Inne języki z automatyczną deklaracją zmiennych - np. Perl - mają tryb ścisły.Ścisły tryb w PHP?

Aktywacja tego trybu ścisłego wymaga deklaracji zmiennej, a Perl zgłasza błąd, gdy spróbujesz użyć niezadeklarowanej zmiennej.

Czy PHP oferuje podobną funkcję?

+1

od wersji 7 [php obsługuje tryb ścisłe] (http://php.net/manual/en/migration70.new-features.php), wystarczy umieścić 'zadeklarować (strict_types = 1); 'u góry każdego (i każdego) pliku skryptu, przed deklaracją przestrzeni nazw. – Code4R7

+0

@ Code4R7 To inny rodzaj trybu ścisłego niż ten, o którym pytano w pytaniu. – Flimm

+0

Prawda. Powróć do 'error_reporting (E_STRICT);'. – Code4R7

Odpowiedz

60

Rodzaju. Możesz aktywować poziom E_NOTICE w swoim error reporting. (Lista stałych here.)

Każde użycie niezadeklarowanej zmiennej spowoduje wyświetlenie E_NOTICE.

Błąd na żywo E_STRICT wyświetli te powiadomienia, a także inne wskazówki dotyczące optymalizacji kodu.

error_reporting(E_STRICT); 

Zakończenie skryptu

Jeśli jesteś naprawdę poważne, a chcesz skrypt do zakończyć zamiast po prostu wyprowadzania zawiadomienie kiedy napotykają zmienną nierejestrowanej, można zbudować custom error handler.

przykład roboczych, który obsługuje tylko zawiadomień „Undefined zmiennej” w nich i przechodzi wszystko inne do obsługi domyślne błędów PHP:

<?php 

error_reporting(E_STRICT); 

function terminate_missing_variables($errno, $errstr, $errfile, $errline) 
{        
    if (($errno == E_NOTICE) and (strstr($errstr, "Undefined variable"))) 
    die ("$errstr in $errfile line $errline"); 

    return false; // Let the PHP error handler handle all the rest 
} 

$old_error_handler = set_error_handler("terminate_missing_variables"); 

echo $test; // Will throw custom error 

xxxx(); // Will throw standard PHP error 

?> 
+0

tak, jest to rodzaj, ale nie tak jak inne języki ścisłe. – Sarfraz

+1

@sAc yup, istnieją inne rzeczy, które są również wyprowadzane jako powiadomienia, więc pojawią się również po włączeniu tego. (I oczywiście, nie jest to tak ścisłe, jak w mocno napisanym języku). –

+0

Dzięki temu twój kod działa znakomicie! Zmieniłem 'die' w' throw', aby przekierować wyjście do widoku Zend Error Trace. – jantimon

3

Tak, wpisz error_reporting(E_STRICT|E_ALL); na początku skryptu.

+0

Tylko przed PHP 5.4.0, potrzebujesz 'E_STRICT' jawnie. Zobacz http://php.net/manual/en/function.error-reporting.php gdzie 'E_STRICT' stał się częścią' E_ALL' od wersji 5.4.0. – Roland

1

PHP jest ostrzeżenie o zmiennych niezadeklarowanych domyślnie wystarczy aby zmienić poziom error reporting, aby zobaczył powiadomienia. Zauważ jednak, że skoro nie ma specjalnej składni do zadeklarowania zmiennej w PHP, a po prostu zadeklarujesz ją przez przypisanie jej, może tylko ostrzec cię, gdy spróbujesz użyć wartości niezadeklarowanej zmiennej. W przeciwieństwie do innych języków, "przypisania do niezadeklarowanych zmiennych" nie istnieją, więc PHP nie może Cię tam ostrzec.

1

Zastosowanie

error_reporting(E_ALL); 

na początku kodu PHP. Albo wybrać ustawienie error_reporting w pliku php.ini, aby ustawić go dla wszystkich plików PHP

35

Zastosowanie

error_reporting(-1); 

pokazać wszelkich możliwych błędów, w tym E_STRICT a nawet jeśli nowe poziomy i stałe są dodane w przyszłych wersjach PHP.

(Reference)

+5

+1 dla tego -1 rzeczy i przyszłej kompatybilności. – Sarfraz

+1

To jest niesamowite, dzięki! –

+1

Czy zgłoszenie_zadania (-1) jest takie samo jak zgłoszenie_błędu błędu (E_STRICT)? – Pacerier

1

można zaimplementować własną funkcję obsługi błędów z set_error_handler().

Następnie można reagować na niektóre poziomy błędów, jak chcesz.

Na przykład, zamiast tylko wyświetlać i rejestrować komunikaty o błędach, można zakończyć skrypt, jeśli zmienna nie została zadeklarowana prawidłowo lub jeśli spełniony jest dowolny warunek, który nie odpowiada użytkownikowi.

W ten sposób można wymusić bardzo restrykcyjną politykę dla dowolnego kodu działającego na instancji tłumacza PHP.

0

Sugerowałbym, że wymagania dotyczące błędów raportowania i obsługi różnią się w środowisku programistycznym i środowisku produkcji na żywo (WWW, firmowy intranet itp.). Podczas opracowywania będziesz chciał zobaczyć jak najwięcej szczegółów, aby znaleźć i rozwiązać problemy.

Myślę, że w środowisku na żywo nie chcemy wyświetlać komunikatów o błędach PHP użytkownikom, ale raczej pozwolić, aby skrypt działał dalej z ograniczoną funkcjonalnością (np. Komunikat "Przepraszamy, że nie możemy zaktualizować profilu użytkownika moment "lub przekieruj użytkownika na stronę główną, itp.). Sposobem na osiągnięcie tego byłoby użycie niestandardowych procedur obsługi błędów dla każdego środowiska.

+0

Zaimplementowałem kod Pekka na moich etapach testowania/programowania. – jantimon

Powiązane problemy