DLACZEGO TO SIĘ DZIEJE?
Z czasem PHP stało się językiem bardziej skoncentrowanym na bezpieczeństwie. Ustawienia, które wcześniej były domyślnie wyłączone, teraz są domyślnie włączone. Doskonałym tego przykładem jest E_STRICT
, który został domyślnie włączony od wersji PHP 5.4.0 .
Ponadto, zgodnie z dokumentacją PHP, domyślnie E_NOTICE
jest wyłączona w php.ini. Dokumenty PHP zalecają włączenie go w celu debugowania . Jednak gdy pobieram PHP z repozytorium Ubuntu - i ze stosu Windows BitNami - widzę coś innego.
; Common Values:
; E_ALL (Show all errors, warnings and notices including coding standards.)
; E_ALL & ~E_NOTICE (Show all errors, except for notices)
; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.)
; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
Zauważ, że error_reporting
tak naprawdę domyślnie jest ustawiona wartość produkcyjna, a nie domyślna wartość „domyślna”. Jest to nieco mylące i nie jest udokumentowane poza php.ini, więc nie sprawdziłem tego w innych dystrybucjach.
Aby odpowiedzieć na twoje pytanie, ten błąd pojawia się teraz, gdy nie pojawiał się wcześniej, ponieważ:
Zainstalowałeś PHP i nowe ustawienia domyślne są nieco słabo udokumentowane, ale nie wykluczają E_NOTICE
.
E_NOTICE
ostrzeżenia takie jak niezdefiniowane zmienne i niezdefiniowane indeksy faktycznie pomagają uczynić kod czystszym i bezpieczniejszym. Mogę ci powiedzieć, że lata temu utrzymywanie E_NOTICE
włączone zmusiło mnie do zadeklarowania moich zmiennych. Dzięki temu dużo łatwiej było nauczyć się C, ponieważ nie deklarowanie zmiennych jest znacznie bardziej uciążliwe.
CO MOGĘ Z TYM ZROBIĆ?
Wyłącz E_NOTICE
, kopiując „Wartość domyślną” E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
i zastępując ją tym, co jest obecnie niezakomentowane po zalogowaniu do znaku równości error_reporting =
. Uruchom ponownie Apache lub PHP, jeśli używasz CGI lub FPM. Upewnij się, że edytujesz „właściwy” plik php.ini. Prawidłowym będzie Apache, jeśli używasz PHP z Apache, fpm lub php-fpm, jeśli używasz PHP-FPM, cgi, jeśli uruchamiasz PHP-CGI itp. To nie jest zalecana metoda, ale jeśli masz starszy kod, który będzie być wyjątkowo trudnym do edycji, to może być twój najlepszy zakład.
Wyłącz E_NOTICE
na poziomie pliku lub folderu. Może to być lepsze, jeśli masz jakiś starszy kod, ale chcesz robić rzeczy „we właściwy” sposób. Aby to zrobić, powinieneś skonsultować się z Apache2, Nginx lub jakimkolwiek innym wybranym serwerem. W Apache można użyć php_value
wewnątrz <Directory>
.
Przepisz kod, aby był czystszy. Jeśli musisz to zrobić podczas przenoszenia do środowiska produkcyjnego lub nie chcesz, aby ktoś zobaczył Twoje błędy, upewnij się, że wyłączasz wyświetlanie błędów i rejestrujesz tylko błędy (zobacz display_errors
i log_errors
w php.ini i ustawieniach serwera) .
Aby rozwinąć opcję 3: Jest to ideał. Jeśli możesz wybrać tę trasę, powinieneś. Jeśli początkowo nie wybierasz tej trasy, rozważ przemieszczenie tej trasy, testując kod w środowisku programistycznym. Gdy już to robisz, pozbądź się ~E_STRICT
i ~E_DEPRECATED
zobacz, co może pójść nie tak w przyszłości. Zobaczysz Mnóstwo nieznanych błędów, ale powstrzyma Cię to od nieprzyjemnych problemów, kiedy będziesz musiał zaktualizować PHP w przyszłości.
CO OZNACZAJĄ BŁĘDY?
Undefined variable: my_variable_name
- Dzieje się tak, gdy zmienna nie została zdefiniowana przed użyciem. Kiedy skrypt PHP jest wykonywany, wewnętrznie przyjmuje po prostu wartość zerową. Jednak w jakim scenariuszu trzeba by sprawdzić zmienną przed jej zdefiniowaniem? Ostatecznie jest to argument za „niechlujnym kodem”. Jako programista mogę powiedzieć, że uwielbiam, gdy widzę projekt typu open source, w którym zmienne są zdefiniowane tak wysoko, jak to możliwe. Ułatwia określenie, które zmienne będą się pojawiać w przyszłości, oraz ułatwia czytanie / uczenie się kodu.
function foo()
{
$my_variable_name = '';
//....
if ($my_variable_name) {
// perform some logic
}
}
Undefined index: my_index
- Dzieje się tak, gdy próbujesz uzyskać dostęp do wartości w tablicy i nie istnieje ona. Aby zapobiec temu błędowi, wykonaj sprawdzenie warunkowe.
// verbose way - generally better
if (isset($my_array['my_index'])) {
echo "My index value is: " . $my_array['my_index'];
}
// non-verbose ternary example - I use this sometimes for small rules.
$my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
echo "My index value is: " . $my_index_val;
Inną opcją jest zadeklarowanie pustej tablicy u góry funkcji. Nie zawsze jest to możliwe.
$my_array = array(
'my_index' => ''
);
//...
$my_array['my_index'] = 'new string';
(dodatkowa wskazówka)
- Kiedy napotykałem te i inne problemy, korzystałem z NetBeans IDE (darmowy), co dało mi wiele ostrzeżeń i uwag. Niektóre z nich oferują bardzo pomocne wskazówki. Nie jest to wymagane i nie używam już IDE, z wyjątkiem dużych projektów. W
vim
dzisiejszych czasach jestem bardziej osobą :).