PHP versijas testēšana
Ja daži no taviem virtuālajiem serveriem izmanto novecojušas PHP versijas, lapā My Zone Overview parādīsies brīdinājums.

Noklikšķinot uz pogas View lapas augšdaļā, tu nonāksi pārskata lapā, kurā redzami serverī esošie novecojušie PHP hosti (galvenais domēns un apakšdomēni).
Tā kā PHP versijas maiņa var izraisīt kļūdu paziņojumus vietnē un izmaiņas var aizņemt līdz 3 minūtēm, pirms maiņas ieteicams notestēt vietnes darbību.
Lai testētu, sarakstā noklikšķini uz vajadzīgās adreses:

Atvērsies testa lapa ar PHP versiju izvēli galvenē. Pārslēdzoties starp tām, tu redzēsi rezultātu ar dažādām PHP versijām. Piemēram:
PHP 5.6:
PHP 8.1:
Mūsdienīgas tīmekļa lietotnes, piemēram, WordPress, atbalsta jaunākās PHP versijas, un pēc WordPress spraudņu un tēmu atjaunināšanas ieteicams pāriet uz PHP 8.0 vai 8.1.
Atjaunināt neatjauninātas tīmekļa lietotnes uz PHP 8.x var būt sarežģīti, jo atšķirības starp 5.6 un 7.x ir lielas.
Zināmās atjaunināšanas problēmas
Umlauti tiek aizstāti ar jautājuma zīmēm

Noklusējuma PHP 5.6 konfigurācija pievieno UTF-8 kodējumu HTTP atbildes galvenei, un vecākām vietnēm, kas vietnes tekstā vai meta datos izmanto citu kodējumu, var būt nepieciešams šo galveni noņemt.
Vienkāršākais risinājums ir pievienot .user.ini ar šādu iestatījumu tīmekļa servera saknes mapē htdocs:
default_charset = ''
Kļūdas paziņojums Fatal error […]
Vietne netiek parādīta, un lapas augšdaļā redzams paziņojums, piemēram:
Fatal error: Call to undefined function session_register() in [...] Fatal error: Call to undefined function sqlite_open() in [...] Fatal error: Call to undefined function wp_script_add_data() in [...] Fatal error: Call-time pass-by-reference has been removed in [...]
Tas ir izsaukums funkcijai, kas ir izņemta no PHP valodas, vai arī to nevar reģistrēt atjaunināšanas problēmas dēļ.
Izņēmums ir Call-time pass-by-reference has been removed, kas ir izņemts PHP sintakses izmaiņu dēļ.
Lai atjauninātu lietotni uz jaunāku PHP versiju, ir jānosaka precīzs kļūdas cēlonis un jāizlabo kods.
Kļūdas paziņojums Fatal error: Incompatible file format
Vietne netiek parādīta, un lapas augšdaļā parādās kļūdas paziņojums:
Fatal error: Incompatible file format: The encoded file has format major ID 1, whereas the Loader expects 7 in /data[...]/htdocs/index.php on line 0
Var rasties lietotnēm, kas ir šifrētas/licencētas ar Zend Guard, īpaši Saurus. PHP atjaunināšana līdz 5.6 versijai ir iespējama tikai, aizstājot un atjauninot lietotnes kodu (Saurus maksas atbalstu nodrošina Bonefarm). Vietni var pārveidot par statisku HTML vai migrēt uz mūsdienīgu satura pārvaldību, piemēram, WordPress.
Kļūdas paziņojums: Cannot modify header information […]
Šis brīdinājums tiek parādīts, ja lapas ģenerēšanas laikā rodas citi brīdinājumi vai kļūdu paziņojumi, kuru dēļ nevar nosūtīt HTTP pieprasījuma galvenes:
Warning: Cannot modify header information - headers already sent by (output started at [...]wp-db.php:57) in [...]
Tam nav patstāvīgas nozīmes, to var ignorēt.
Kļūdas paziņojums Warning […]
Atverot tīmekļa lapu, lapas augšdaļā vai kādā no tās komponentēm parādās paziņojums:
Warning: Creating default object from empty value in [...] Warning: file_put_contents(): Filename cannot be empty in [...] Warning: get_class() expects parameter 1 to be object, string given in [...] Warning: getimagesize(): Filename cannot be empty in [...] Warning: Illegal string offset 'face' in [...] Warning: Invalid argument supplied for foreach() in [...]
Dažu funkciju parametra tips vai vērtība neatbilst gaidītajam, kas nozīmē, ka daļa tīmekļa lietotnes funkcionalitātes var darboties citādi, nekā paredzēts (visbiežāk vienkārši netiek parādīts vajadzīgais saturs).
Ja funkcionalitāte nav svarīga, tu vari ignorēt un atspējot Warning paziņojumus, pievienojot .user.ini failu savas vietnes saknes direktorijā htdocs ar šādiem iestatījumiem:
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED & ~E_WARNING
Zone noklusējuma iestatījums ir: error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
Kļūdas paziņojums Deprecated […]
Atverot vietni, lapas augšdaļā vai kādā no tās komponentēm parādās paziņojums:
Deprecated: Assigning the return value of new by reference is deprecated in [...] Deprecated: Function set_magic_quotes_runtime() is deprecated in [...] Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in [...] Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in [...]
Norādītā funkcija, parametrs vai sintakse pazudīs nākamajās PHP versijās, taču tas neietekmēs izvēlētās versijas darbību.
Zone virtuālajos serveros Deprecated paziņojumu izvade pēc noklusējuma ir atspējota, visticamāk lietotnes koda konfigurācijas izmaiņu dēļ, retāk — caur globālo php.ini vai .user.ini (skat. piemēru Warning paziņojumā).
Lai atrastu iestatījuma vietu, var izmantot komandrindas meklēšanu:
grep -r E_ALL .
Piemēram, OpenCart 1.5 gadījumā tas dos šādus failus:
./vqmod/vqcache/vq2-system_startup.php:error_reporting(E_ALL); ./system/startup.php:error_reporting(E_ALL); ./php.ini:;error_reporting = E_ALL;
PHP kods jāmaina uz error_reporting( E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED ); un .ini failos uz error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
Neizdodas datubāzes savienojums
Ja pēc PHP maiņas uz 5.6+ versiju neizdodas savienojums ar datubāzi, pārbaudi, vai datubāzes lietotājs neizmanto veco 6 ciparu paroli (veco kriptogrāfisko paroli).
Risinājums ir nomainīt datubāzes lietotāja paroli. Jaunā parole darbosies arī atpakaļsaderīgi ar PHP versijām, kas ir vecākas par 5.6.
Navigācija nedarbojas
Ja navigācija starp lapām nedarbojas vai pēc formas iesniegšanas nenotiek pieprasītā darbība, tas var būt saistīts ar pieņēmumu, ka superglobālie GET, POST, Cookie (EGPCS) masīvi ir reģistrēti kā parasti mainīgie.
Šī PHP iespēja tika atzīta par novecojušu PHP 5.3.0 un izņemta PHP 5.4.0.
Piemēram, tīmekļa lapas izvēlnei ir saites ar vaicājuma virkni formā domeen.ee/?lk=1, un PHP failā, kas satur lapas ielādes loģiku, tiek izmantots mainīgais $lk superglobālā masīva $_GET['lk'] vietā.
Līdzīgi formas iesniegšanai, kur formas elementa nosaukums <input type="submit" name="form_1" value="Saada"> netiek pārbaudīts pret superglobālo masīvu $_POST['form_1'], bet tieši pret mainīgo $form_1.
Kā pārbaudīt, kura PHP versija tiek izmantota?
PHP versijas maiņa serverī var aizņemt līdz 3 minūtēm. Lai pārbaudītu, kura versija pašlaik tiek izmantota, pievieno .php failu ar nejaušu nosaukumu savas vietnes saknes mapē htdocs, kurā ir:
<?php phpinfo();
Tu vari apskatīt izvadi, apmeklējot example.com/random-name.php (drošības apsvērumu dēļ iesakām šo failu izdzēst).
Ja izrādās, ka vietne ar jaunāku PHP versiju nedarbojas, ir iespējams stundas laikā nomainīt PHP versiju atpakaļ. To var izdarīt Webhosting pārvaldībā galvenā domēna vai apakšdomēna iestatījumos.
Instrukcijas PHP versijas maiņai.
PHP 5.6 → PHP 7.0
Mainīta kļūdu un izņēmumu apstrāde
<?php
// PHP 5 laikmeta kods, kas salūzīs.
function handler(Exception $e) { ... }
set_exception_handler('handler');
// Saderīgs ar PHP 5 un 7.
function handler($e) { ... }
// Tikai PHP 7.
function handler(Throwable $e) { ... }
?>
Novecojuši PHP 4 stila konstruktori
Metodēm nevar būt tāds pats nosaukums kā klasei, kurā tās ir definētas.
<?php
class foo {
function foo() {
echo 'I am the constructor';
}
}
?>
Iepriekšējais piemērs izvadīs:
Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; foo has a deprecated constructor in example.php on line 3
list() vairs nepiešķir mainīgos apgrieztā secībā
<?php list($a[], $a[], $a[]) = [1, 2, 3]; var_dump($a); ?>
PHP 5.6 izvade:
array(3) {
[0]=>
int(3)
[1]=>
int(2)
[2]=>
int(1)
}
PHP 7.0 izvade:
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
Uzzini vairāk par 5.6 → 7.0 migrāciju PHP dokumentācijā
PHP 7.0 → PHP 8.0
PHP 7.0 → PHP 7.1
Iepriekš, izsaucot lietotāja definētas funkcijas ar pārāk maz argumentiem, tika izvadīts brīdinājums. Tagad šis brīdinājums ir paaugstināts līdz Error izņēmumam.
<?php function test($param){} test(); ?>
Iepriekšējais piemērs izvadīs kaut ko līdzīgu:
Fatal error: Uncaught ArgumentCountError: Too few arguments to function test(), 0 passed in %s on line %d and exactly 1 expected in %s:%d
Sākot ar PHP 7.1, ir iespējams atzīmēt atgrieztās vērtības kā nullable, pievienojot tipa nosaukumam jautājuma zīmi. Tas nozīmē, ka papildus norādītajam tipam kā arguments var tikt padots null vai arī null var tikt atgriezts kā vērtība.
Papildus ir ieviests void tips.
Uzzini vairāk par 7.0 → 7.1 migrāciju PHP dokumentācijā
PHP 7.1 → PHP 7.2
Iepriekš funkcija number_format() varēja atgriezt -0. Tagad tas ir izlabots, un atgrieztā vērtība -0.01 tagad izvada “0” nevis “-0”.
Par novecojušu atzīmēta parse_str() funkcijas izmantošana bez otrā argumenta.
Pievienots jauns tips ar nosaukumu object .
Koplietotajiem paplašinājumiem vairs nav jānorāda faila paplašinājums (.so Unix vai .dll Windows). Tas tiek iespējots php.ini failā, kā arī dl() funkcijā.
Uzzini vairāk par 7.1 → 7.2 migrāciju PHP dokumentācijā
PHP 7.2 → PHP 7.3
Reģistrnejutīgu konstanti deklarēšana ir atzīta par novecojušu. True nodošana kā trešais arguments define() tagad ģenerēs novecošanas brīdinājumu.
Elastīgās heredoc/nowdoc sintakses ieviešanas dēļ doc virknes, kas savā saturā ietver beigu etiķeti, var izraisīt sintakses kļūdas vai interpretācijas izmaiņas. Piemēram:
<?php $str = <<<FOO abcdefg FOO FOO; ?>
iepriekš atkāptā FOO parādīšanās nebija ar īpašu nozīmi. Tagad tā tiks interpretēta kā heredoc virknes beigas, un sekojošais FOO; izraisīs sintakses kļūdu. Šo problēmu vienmēr var atrisināt, izvēloties beigu etiķeti, kas neparādās virknes saturā.
Uzzini vairāk par 7.2 → 7.3 migrāciju PHP dokumentācijā
PHP 7.3 → PHP 7.4
Klases īpašības tagad atbalsta tipu deklarācijas:
<?php class User { public int $id; public string $name; } ?>
Par novecojušiem atzīti ligzdoti ternārie operatori bez skaidrām iekavām:
<?php 1 ? 2 : 3 ? 4 : 5; // deprecated (1 ? 2 : 3) ? 4 : 5; // ok 1 ? 2 : (3 ? 4 : 5); // ok ?>
Iekavas nav nepieciešamas, ligzdojot vidējā operandā, jo tas vienmēr ir nepārprotami un to neietekmē asociativitāte:
<?php 1 ? 2 ? 3 : 4 : 5 // ok ?>
Masīvu un virkņu nobīdes piekļuves sintakse, izmantojot figūriekavas, ir novecojusi. Izmanto $var[$idx] nevis $var{$idx}.
PHP Fatal error: Array and string offset access syntax with curly braces is no longer supported in
Arī is_real() funkcija ir novecojusi — tās vietā izmanto is_float().
Uzzini vairāk par 7.3 → 7.4 migrāciju PHP dokumentācijā
PHP 7.4 → PHP 8.0
Nestrikti salīdzinājumi starp skaitļiem un neskaitliskām virknēm tagad darbojas, pārveidojot skaitli par virkni un salīdzinot virknes. Salīdzinājumi starp skaitļiem un skaitliskām virknēm turpina darboties kā iepriekš. Īpaši tas nozīmē, ka 0 == "not-a-number" tagad tiek uzskatīts par false.
| Salīdzinājums | Pirms | Pēc |
|---|---|---|
0 == "0" |
true |
true |
0 == "0.0" |
true |
true |
0 == "foo" |
true |
false |
0 == "" |
true |
false |
42 == " 42" |
true |
true |
42 == "42foo" |
true |
false |
Jauni rezervēti vārdi: match un mixed.
Metodes ar tādu pašu nosaukumu kā klase vairs netiek interpretētas kā konstruktori. Tā vietā jāizmanto __construct() metode.
Iespēja definēt reģistrnejutīgas konstantes ir izņemta. Trešais arguments define() vairs nedrīkst būt true.
Uzzini vairāk par 7.4 → 8.0 migrāciju PHP dokumentācijā
PHP 8.0 → PHP 8.3
PHP 8.0 → PHP 8.1
Ja metode, kas izmanto statiskos mainīgos, tiek mantota (bet netiek pārrakstīta), mantotā metode tagad koplietos statiskos mainīgos ar vecāka metodi:
<?php class A { public static function counter() { static $counter = 0; $counter++; return $counter; } } class B extends A {} var_dump(A::counter()); // int(1) var_dump(A::counter()); // int(2) var_dump(B::counter()); // int(3), previously int(1) var_dump(B::counter()); // int(4), previously int(2) ?>
Uzzini vairāk par 8.0 → 8.1 migrāciju PHP dokumentācijā
PHP 8.1 → PHP 8.2
Pievienots atribūts sensitīvu parametru slēpšanai
Pievienots #[\SensitiveParameter] atribūts, lai paslēptu sensitīvus datus atpakaļizsekojumos (backtrace).
Uzzini vairāk par 8.1 → 8.2 migrāciju PHP dokumentācijā
PHP 8.2→ PHP 8.3
php.ini tagad atbalsta rezerves/noklusējuma vērtības sintaksi:
<?php
/*
/path/to/user.ini contains the following settings:
listen = localhost:${DRUPAL_FPM_PORT:-9000}
*/
$user_ini = parse_ini_file('/path/to/user.ini');
echo $user_ini['listen']; // localhost:9000
?>
Uzzini vairāk par 8.2 → 8.3 migrāciju PHP dokumentācijā

