Veebimajutus.ee blogi

Suur muutus – veebiserveritesse tuleb PHP 8.0

PHP versioonid muutuvad tihti ja tavaliselt me ei märkagi seda peale selle, et veebimajutuse iseteenindusse sisse logides antakse teada vananenud versioonist ning palutakse uuendada. Elu läheb samamoodi edasi juba uuema versiooniga. Kuid seekord on üleminek suurem ja olulisem. Eksperdile selgitab muutusi lähemalt Veebidoktori veebiarendaja Kristjan Aas.

PHP 8.0 on suur versiooniuuendus, mis toob endaga kaasa palju muudatusi andmetüübi süsteemis, süntaksis, veakäsitluses, stringides, objekt-orienteeritud programmeerimises ja paljus muus. Siin on ülevaade kõigist olulistest muutustest, millega eksperdid ja võiksid kursis olla.

Aritmeetiliste ja bitipõhiste operaatorite rangem tüübikontroll

Enne PHP 8-t oli võimalik rakendada bitipõhiseid operaatoreid objektide, ressursside ja massiivide peal. Alates PHP 8-st pole see aga enam võimalik ning tulemuseks on veateade TypeError. See tähendab tavaliselt seda, et väärtus pole oodatud tüüpi.

Vaikimisi veateabe tase muutub

Alates PHP 8-st on veateabe tase E_ALL, mis tähendab seda, et paljud sellised veateated võivad tulla nähtavale, mida varasemalt ignoreeriti.

Ümberklassifitseeritud hoiatused ja teatised saavad vigadeks

Paljud pisemad vead, mis varem käivitasid ainult hoiatusi ja teatisi, on nüüd teisendatud vigadeks. Muudeti järgmisi hoiatusi:

  • Undefined variable: Error exception (Vea Erind) teatise asemel;
  • Undefined array index: hoiatus teatise asemel;
  • Division by zero: DivisionByZeroError exception (DivisionByZeroError erind) hoiatuse asemel;
  • Attempt to increment/decrement property ‘%s’ of non-object: Error exception (Vea Erind) hoiatuse asemel;
  • Attempt to modify property ‘%s’ of non-object: Error exception (Vea Erind) hoiatuse asemel;
  • Attempt to assign property ‘%s’ of non-object: Error exception (Vea Erind) hoiatuse asemel;
  • Creating default object from empty value: Error exception (Vea Erind) hoiatuse asemel;
  • Trying to get property ‘%s’ of non-object: hoiatus teatise asemel;
  • Undefined property: %s::$%s: hoiatus teatise asemel;
  • Cannot add element to the array as the next element is already occupied: Error exception (Vea Erind) hoiatuse asemel;
  • Cannot unset offset in a non-array variable: Error exception (Vea Erind) hoiatuse asemel;
  • Cannot use a scalar value as an array: (Vea Erind) hoiatuse asemel;
  • Only arrays and Traversables can be unpacked: TypeError exception (TypeError Erind) hoiatuse asemel;
  • Invalid argument supplied for foreach(): TypeError exception (TypeError Erind) hoiatuse asemel;
  • Illegal offset type: TypeError exception (TypeError Erind) hoiatuse asemel;
  • Illegal offset type in isset or empty: (TypeError Erind) hoiatuse asemel;
  • Illegal offset type in unset: (TypeError Erind) hoiatuse asemel;
  • Array to string conversion: hoiatus teatise asemel;
  • Resource ID#%d used as offset, casting to integer (%d): hoiatus teatise asemel;
  • String offset cast occurred: hoiatus teatise asemel;
  • Uninitialized string offset: %d: hoiatus teatise asemel;
  • Cannot assign an empty string to a string offset: Error exception (Vea Erind) hoiatuse asemel;
  • Supplied resource is not a valid stream resource: (TypeError Erind) hoiatuse asemel;

Atribuudid PHP 8-s

PHP 8 lubab meil kasutada atribuute, mis võimaldavad deklareerida meta-andmeid funktsioonidele, klassidele, muutujatele ja parameetritele.

Konstruktori isendiväljad

Uuenenud PHP 8-ga on kasutusel uus süntaks isendiväljade deklareerimiseks otse klassi konstruktorist.

Näide:

Mis on Null-safe operator (Null-ohutu operaator)?

Null-safe operaator tagab ohutuse meetodite või muutujate aheldamisel, kui tagastatav väärtus või muutuja väärtus võib olla null.

Näide:

?-> null-ohutu operator katkestab ülejäänud avaldise, kui see kohtab nullväärtust ning tagastab kohe nulli ilma viga põhjustamata.

Union types (ehk Union-tüübid)

Union-tüüp on kogumik kahest või enamast andmetüübist, mida on võimalik muutuja või funktsiooni sisend- ja väljundparameetri väärtusena kasutada.

Näide:

Näites võib muutuja $number väärtuseks olla int (täisarv) ja float (ujukoma-arv) korraga.

Named arguments (Nimelised argumendid või parameetrid)

Nimelised argumendid või parameetrid võimaldavad anda funktsioonidele sisendparameetreid, kasutades selleks muutujate enda nimesid. Nii ei sõltu funktsiooni sisendparameetrid parameetrite järjekorrast.

Näide:

Match avaldis on Switchi järglane

Match avaldist võib kutsuda Switchi järglaseks. Match avaldis tagastab väärtuse ning ei vaja selleks eraldi break käsku.

Näide:

Non-capturing catches (ehk mittepüütavad erindid)

Varasemalt pidi erindi püüdmiseks hoidma seda muutujas, olenemata sellest, kas sa seda muutujat kasutatakse või mitte. Mittepüütava erindi korral võid aga jätta need muutujad välja.

Kui varem pidi erindit püüdma nii:

siis alates PHP 8-st on võimalik seda teha nii:

Täiesti uus str_contains() funktsioon

Kui varasemalt pidi kasutama funktsiooni str_pos(), et teada saada, kas string sisaldab teist stringi, siis alates PHP 8-st on saadaval uus funktsioon nimega str_contains().

Kui varem tehti nii:

Siis alates PHP 8-st on võimalik seda teha natuke lihtsamalt uue funktsiooniga:

Mainimist vajavad ka veel uued funktsioonid str_starts_with() ja str_ends_with()

Need kaks stringist teise stringi otsimise funktsiooni lihtsustavad otsimist järgmiselt:

  • str_starts_with() – saab kontrollida, kas string algab teatud stringiga
  • str_ends_with() – saab kontrollida, kas string lõpeb teatud stringiga

Näide:

Mittesoovitatuks kuulutatu on nüüd eemaldatud

Oluline on teada, et kõik, mis kuulutati PHP 7.x arenduse ajal mittesoovitatuks, eemaldati nüüd PHP 8-s:

  • mittesoovitatuks kuulutatud PHP 7.4-s
  • mittesoovitatuks kuulutatud PHP 7.3-s
  • mittesoovitatuks kuulutatud PHP 7.2-s
  • mittesoovitatuks kuulutatud PHP 7.1-s

Artikkel ilmus algselt Veebimajutus.ee blogis.

Oled sa GEENIUS, RIKAS või PRO? Vali sobiv tellimus siit.

Populaarsed lood mujal Geeniuses

Ära jää ilma päeva põnevamatest lugudest

Telli Geeniuse uudiskiri

Saadame sulle igal argipäeval ülevaate olulisematest Geeniuse teemadest.