W związku z wycofaniem wsparcia dla PHP starszych niż 5.6 przez wydawców PHP, osoby, których aplikacje od lat były stworzone do pracy z PHP w wersji 5.5 czy starszych mogą spotkać się z kilkoma problemami, które uniemożliwiają im działanie strony na nowej wersji PHP lub strona wyświetla się z błędami.

Nasza firma oferuje także migrację starych aplikacji do wymogów nowych wersji PHP. W przypadku pytań zapraszamy do kontaktu w celu wyceny migracji.

Poniżej prezentujemy najczęstsze problemy dot. migracji do nowej wersji PHP.

Brak polskich znaków

Pomimo że Twoja strona poprawnie wyświetlała do tej pory polskie znaki, po przejściu na wersję PHP 5.6 na stronie pojawiły się krzaczki zamiast znaków z polskimi akcentami.

Spowodowane jest to zastosowaniem tzw. domyślnego kodowania ( zmienna default_charset w php.ini http://php.net/manual/en/ini.core.php#ini.default-charset)


Stara strona wymaga przebudowy?

Jeżeli Twoja strona jest zakodowana w formacie Latin 2 (czyli ISO-8859-2), popularnym na starych wersjach systemów operacyjnych, musisz poinformować interpreter PHP o tym aby wysyłał odpowiednie nagłówki dla przeglądarki informujące o stosowanym formacie kodowania.

PHP w wersji starszej niż PHP 5.6 wysyłała nagłówki HTTP do przeglądarki z następującą informacją:

Content-Type: text/html

Informuje on o formacie przesyłanego pliku. Od wersji PHP 5.6, jeżeli Twój skrypt nie wysyła informacji o stosowanym kodowaniu, interpreter wyśle automatycznie nagłówek wraz z informacją o domyślnym kodowaniu, który w PHP 5.6 jest ustawiony wg zaleceń autorów na kodowanie UFT8:

Content-Type: text/html; charset=utf-8

W przypadku stron stosujących kodowanie inne niż UTF-8 (np. ISO-8859-2) po za stosowaniem standardowego metatagu opisującego kodowanie:

<meta http-equiv="Content-type" content="text/html; charset=iso-8859-2" />

Należy wymusić stosowanie nagłówków ISO-8559-2 przez interpreter PHP. W tym celu wystarczy w pierwszej lini pliku php (przed wysłaniem jakichkolwiek treści, nagłówków/ciasteczek) dodać:

ini_set("default_charset","ISO-8859-2");

Niektórzy klienci zgłaszają nam ten błąd twierdząc, że na ich lokalnie zainstalowanym serwerze strona wyświetla prawidłowo polskie znaki - nie działają one tylko po wgraniu na serwer. Ta sytuacja spowodowana jest ustawieniem zmiennej default_charset w php.ini na wartość pustą czyli:

default_charset = ""

Nie jest to wartość zalecana przez wydawcę PHP, który wyraźnie informuje aby tego nie robić, ponieważ tak jak w przypadku powyżej, aplikacja może się zachowywać różnie na różnych hostingach.

mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in

W nowej wersji PHP zmieniły się także funkcje do obsługi baz danych. W tej sytuacji należy zastąpić wywołania funkcji mysql_... na mysqli_... pamiętając jednocześnie, że mysqli_query nie korzysta już z domyślnego nawiązanego połączeń z bazą danych i koniecznie trzeba podać link do połączenia z bazą danych w funkcjach mysqli_query

Call-time pass-by-reference has been removed

W PHP 5.6 porzucono wsparcie dla obsługi przekazywanie zmiennych prze referencje, czyli poniższy kod nie zadziała:

function jakasfunkcja($zmienna) {
 …
}


  jakasfunkcja(&$zmienna)

Wyjściem z sytuacji jest zastąpienie budowy funkcji i wywoływanie jej bez deklaracji referencji:

 function jakasfunkcja(&$zmienna) {
 …
 }


 jakasfunkcja($zmienna)

Non-static method Klasa::getMetoda() should not be called statically, assuming $this from incompatible context

Wywoływanie statycznie metod, które nie został jako takie zdeklarowane, także nie zadziała. Należy wyraźnie zdeklarować taką metodę jako statyczną i następujący pseudo kod:

 class Klasa {
   …
   function metoda(){
     …
   }
   …
 }

 Klasa::metoda();

i zastąpić wg schematu:

 class Klasa {
   …
   public static function metoda(){
     …
   }
   …
 }

 Klasa::metoda();