En av de mest spennende hendelsene i PHP-verdenen i 2015 var utgivelsen av PHP 7. 10 år etter utgivelsen av den siste store versjonen, PHP 5. Med et stort skritt fremover introduserer PHP 7 massevis av nye funksjoner og ytelsesoppdateringer .
Imidlertid fjerner den også gammel, utdatert funksjonalitet, som introduserer noen kompatibilitetshull, noe som gjør det vanskeligere for eldre applikasjoner å migrere til den nye versjonen. Denne guiden skal tjene som en rask omvisning på hva du kan forvente hvis du planlegger å flytte eksisterende applikasjoner, eller bygge nye, på toppen av PHP 7.
Hvis du ikke har jobbet med PHP i det siste, kan du lure på hva som skjedde med PHP 6, hvorfor hoppet fra PHP 5 til PHP 7? Vel, lang historie kort, PHP 6 var en fiasko. Hovedfunksjonen i versjon 6 var støtte for den opprinnelige karakteren Unicode Siden PHP hovedsakelig brukes i nettutvikling og nettet trenger Unicode, var det fornuftig å ta Unicode til PHP.
Ideen var å bringe full Unicode-støtte til selve kjernen. Det ville ha utvidet evner til språk: fra evnen til å bruke emojis Dumme, som variabelnavn og funksjonsnavn, til kraftige internasjonale strengfunksjoner. For eksempel når et annet språk bruker store og små bokstaver annerledes enn engelsk, eller når et navn med kinesiske tegn må konverteres til engelsk.
Dessverre viste denne ambisiøse planen seg å være et større problem enn forventet. Det meste av kodebasen måtte overføres for å støtte Unicode for både store og store utvidelser, noe som var kjedelig og komplisert. Dette bremset utviklingen av andre funksjoner på språket, og frustrerte mange PHP-utviklere i prosessen. Ytterligere hindringer ble presentert, noe som resulterte i mindre interesse for å utvikle innfødt Unicode-støtte, noe som til slutt førte til at prosjektet ble forlatt.
Siden ressursene, for eksempel bøker og artikler, ble skrevet for PHP 6 og Unicode-støtte, vil den nye versjonen bli omdøpt til PHP 7 for å unngå forvirring.
Uansett, nok lidelse fra den triste fortiden, la oss se hva PHP 7 bringer til festen.
Med nesten alle oppdateringer forventes mindre ytelsesforbedringer. Denne gangen gir PHP imidlertid en betydelig forbedring i forhold til tidligere versjoner som gjør ren ytelse til en av de mest attraktive funksjonene i PHP 7. Dette kommer som en del av 'PHPNG' -prosjektet, som adresserer de interne komponentene i selve motoren. Zend.
Ved å omorganisere interne datastrukturer og legge til et mellomliggende trinn for å kode kompilering i form av et Abstract Syntax Tree (AST), blir resultatet overlegen ytelse og mer effektiv minnetildeling. Tallene ser veldig lovende ut; De Referanser utført i virkelige applikasjoner viser at PHP 7 er dobbelt så rask som PHP 5.6 i gjennomsnitt og resulterer i 50% mindre minneforbruk under forespørsler, noe som gjør PHP 7 til en sterk rival til HHVM JIT-kompilatoren av Facebook. Ta en titt på denne Zend-infografikken som viser ytelsen til noen vanlige CMS y Frameworks .
Nedgangen i minneforbruk lar også mindre maskiner bedre håndtere forespørsler sammen med muligheten til å bygge mikrotjenester rundt PHP. Interne endringer, spesielt AST-implementeringen, åpner også muligheter for fremtidige optimaliseringer som kan presse ytelsen ytterligere. En ny intern implementering av en JIT-kompilator vurderes for fremtidige versjoner.
PHP 7 kommer med nye syntaksfunksjoner. Selv om de ikke utvider mulighetene til selve språket, gir de en bedre eller enklere måte å gjøre koden din mer behagelig å skrive og mer behagelig for øynene.
Nå kan vi gruppere importdeklarasjonene for klassene som stammer fra det samme navneområdet på 'bruk' -linjen. Dette skal bidra til å justere erklæringene på en meningsfull måte eller bare lagre noen byte i filene dine.
use FrameworkModuleFoo; use FrameworkModuleBar; use FrameworkModuleBaz;
Med PHP 7 kan vi bruke:
use FrameworkModule{Foo, Bar, Baz};
Eller hvis vi foretrekker en flerlinjær stil:
use FrameworkModule{ Foo, Bar, Baz };
Dette løser et vanlig problem i PHP-programmering, hvor vi vil tildele en verdi til en variabel i en annen variabel, hvis sistnevnte virkelig er satt; ellers gi den en annen verdi enn dette. Det brukes ofte når du arbeider med brukerinngang.
Pre-PHP 7:
if (isset($foo)) { $bar = $foo; } else { $bar = 'default'; // we would give $bar the value 'default' if $foo is NULL }
Etter PHP 7:
$bar = $foo ?? 'default';
Dette kan også lenkes med en rekke variabler:
$bar = $foo ?? $baz ?? 'default';
Romskipoperatøren tillater en treveis sammenligning mellom to verdier, ikke bare som indikerer om de er like, men også hvilke som er større, over ulikheten ved å returnere 1.0 eller -1.
Her kan vi ta forskjellige handlinger avhengig av hvordan verdiene er forskjellige:
switch ($bar $foo) { case 0: echo '$bar and $foo are equal'; case -1: echo '$foo is bigger'; case 1: echo '$bar is bigger'; }
De sammenlignede verdiene kan være heltall, flyter, strenger eller til og med matriser. Sjekk ut dokumentasjonen for å få en ide om hvordan de forskjellige verdiene sammenlignes med hverandre.
Men selvfølgelig gir PHP 7 også spennende ny funksjonalitet.
PHP 7 utvider deklarasjonene fra tidligere typer parametere i metoder (klasser, grensesnitt og matriser) ved å legge til de fire skalartypene; Heltall (int
), Flyter ( float
), Boolere (bool
) og Strenger ( string
) som mulige parametertyper.
Vi kan også valgfritt spesifisere hva slags metoder og funksjoner de returnerer. Støttede typer er * bool *, * int *, * float *, * string *, * array *, * callable *, * Class * or * Interface * name, * self *, and * parent * (for class methods)
Clase Calculadora { // Declaramos que los parámetros proporcionados son del tipo entero Función Pública addTwoInts (int $ x, int $ y): int { Retorno $ x + $ y; // También decimos explícitamente que este método devolverá un entero } }
Typedeklarasjoner tillater konstruksjon av mer robuste applikasjoner og unngår å sende og returnere feil verdier fra funksjoner. Andre fordeler inkluderer statiske kodeparsere og IDEer, som gir bedre oversikt over kodebasen hvis DocBlocks.
Siden PHP er et svakt typespråk, vil visse verdier for parameteren og returtypene sendes ut basert på konteksten. Hvis vi passerer verdien '3' i en funksjon som har en deklarert parameter av typen int
, vil tolken godta den som et heltall og ikke kaste feil. Hvis du ikke vil ha dette, kan du aktivere modo estricto
legge til et direktiv på declarar
.
Declarar (tipos_estrictos = 1);
Dette er satt per fil, ettersom et globalt alternativ vil dele kodelagerene i de som er bygget med global strenghet i og de som ikke er det, noe som resulterer i uventet oppførsel når vi kombinerer kode fra begge.
Med tillegg av unntak fra motoren, kan fatale feil som kan ha resultert i avslutningen av Manus de kan enkelt fanges opp og håndteres.
Feil som å kalle en ikke-eksisterende metode vil ikke avslutte skriptet, men vil i stedet kaste et unntak som kan håndteres av en fangsttestblokk, noe som forbedrer feilhåndtering for applikasjonene dine. Dette er viktig for visse typer applikasjoner, servere og Daemons , da fatale feil vil kreve omstart. Testing i PHPUnit bør også være mer nyttig, ettersom fatale feil dreper hele testpakken. Unntak, snarere enn feil, vil bli håndtert av testtilfelle.
PHP 7 legger til en rekke nye unntaksklasser basert på typen feil som kan oppstå. For å opprettholde kompatibilitet mellom versjoner, er et nytt grensesnitt lagt til Throwable
som kan implementeres fra unntak fra motor og bruker. Dette var nødvendig for å unngå motor unntak for å utvide basen unntaksklassen, noe som resulterte i gamle kodefangst unntak som ikke eksisterte før.
Før PHP 7 ville dette ha avsluttet skriptet med en alvorlig feil:
try { thisFunctionDoesNotEvenExist(); } catch (EngineException $e) { // Clean things up and log error echo $e->getMessage(); }
Anonyme klasser er fettere av anonyme funksjoner som du kan bruke i en kortsiktig enkel forekomst. Anonyme klasser kan enkelt opprettes og brukes akkurat som et vanlig objekt. Her er et eksempel fra dokumentene.
Pre-PHP 7
php class MyLogger { public function log($msg) { print_r($msg . '
'); } } $pusher->setLogger( new MyLogger() );
Med anonym klasse:
php $pusher->setLogger(new class { public function log($msg) { print_r($msg . '
'); } });
Anonyme klasser er nyttige i enhetstesting, spesielt i testing av objekter og tjenester. Dette hjelper oss med å unngå tunge biblioteker og rammer som replikerer, og skaper et enkelt objekt som gir grensesnittet vi vil etterligne.
Lagt til to nye funksjoner for å generere kryptografisk sikre heltall og strenger.
random_bytes(int $len);
Returnerer en tilfeldig streng med lengde $len
.
php random_int(int $min, int $max);
Returnerer et tall mellom $min
og $max
.
I motsetning til mange andre språk, hadde ikke PHP før PHP 7 en måte å unnslippe Unicode-kode i strenglitteratur. Denne funksjonaliteten legger til rømningssekvensen ` u 'for å produsere disse tegnene ved hjelp av UTF-8-kodekoden. Dette er bedre enn å sette inn tegnene direkte, noe som gir bedre håndtering av usynlige tegn, så vel som tegn som har samme grafiske fremstilling, men som har forskjellig betydning.
echo 'u{1F602}'; // outputs ‚
Merk at dette bryter den eksisterende koden med sekvensen ' u' fordi den endrer oppførselen.
Generatorer i PHP får også noen fine ekstra funksjoner. Generatorer har nå en returoppgave som kan brukes til å tillate at den produserer en endelig verdi etter iterasjon. Dette kan brukes til å verifisere at generatoren har kjørt uten feil, og lar koden som kalte generatoren håndtere forskjellige scenarier riktig.
Generatorer kan også returnere og gjengi uttrykk fra andre generatorer. Dette gjør at de kan bryte ned komplekse operasjoner i enklere og mer modulære enheter.
function genA() { yield 2; yield 3; yield 4; } function genB() { yield 1; yield from genA(); // 'genA' Se llama aquí e itera sobre yield 5; return 'success'; // Este es un resultado final que podemos comprobar más tarde } foreach (genB() as $val) { echo '
$val'; // Esto emitirá los valores 1 a 5 para} $genB()->getReturn(); // Esto debería devolver el 'éxito' cuando no hay errores.
Forventningene er en forbedring av afirmar ()
samtidig som du opprettholder bakoverkompatibilitet. De tillater null kostnadspåstander i produksjonskoden og gir muligheten til å kaste egendefinerte unntak når påstanden mislykkes, noe som kan være nyttig under utviklingen.
Afirmar ()
det blir en språkkonstruksjon i PHP 7. Påstander skal bare brukes til feilsøkingsformål i utviklings- og testmiljøer. For å konfigurere oppførselen har vi to nye direktiver.
zend.afirmación
- 1
: generer og kjør kode (utviklingsmodus) (standard) - 0
: generer koden, men hopp rundt den ved kjøretid - -1
: generer ikke kode som gjør at den ikke koster (produksjonsmåte)afirmación.excepción
- 1
: kaste når påstanden mislykkes, kaste objektet som er gitt som unntak eller kaste et nytt * ErrorAffirmation * -objekt hvis unntaket ikke ble levert - 0
: bruk eller generer et * Kastbart * som beskrevet ovenfor, men det genererer bare en advarsel basert på det objektet i stedet for å kaste det (kompatibel med PHP 5-oppførsel)Innføringen av en større utgivelse gir muligheten til å endre / oppdatere eldre funksjonaliteter eller til og med fjerne dem hvis de anses for gamle eller har vært utdaterte i noen tid. Slike endringer kan introdusere kompatibilitetsbrudd i eldre applikasjoner.
Et annet problem som oppstår fra denne versjonen er at viktige biblioteker og rammer du er avhengige av, kanskje ikke har blitt oppdatert for å støtte den nyeste versjonen. PHP-teamet har prøvd å gjøre de nye endringene så sent som mulig og å gjøre overføringen til den nye versjonen så enkel som mulig. Nyere og mer oppdaterte applikasjoner burde ha lettere for å flytte til den nye versjonen, mens eldre applikasjoner kan måtte avgjøre om fordelene oppveier kostnadene, og eventuelt velge å ikke oppgradere.
De fleste pauser er mindre og kan lett reduseres, mens andre kan kreve mer innsats og tid. I utgangspunktet, hvis du hadde foreldede advarsler i applikasjonen din før du installerte PHP 7, vil du sannsynligvis få feil som vil bryte applikasjonen til den er løst. Du ble advart, ikke sant?
Viktigst, de gamle og utdaterte SAPIene ble fjernet som utvidelsen mysql
(men du burde ikke bruke dette i utgangspunktet, ikke sant?). For en komplett liste over utvidelser og fjernede høydepunkter, kan du sjekke disse RFC-ene her Y her .
Også andre SAPI-er blir portert til PHP 7.
Denne oppdateringen gjorde noen endringer til fordel for konsistens for variabelkonstruksjoner. Dette tillater mer avanserte uttrykk med variabler, men introduserer endringer i atferd i noen andre tilfeller, som vist nedenfor.
// old meaning // new meaning $$foo['bar']['baz'] ${$foo['bar']['baz']} ($$foo)['bar']['baz'] $foo->$bar['baz'] $foo->{$bar['baz']} ($foo->$bar)['baz'] $foo->$bar['baz']() $foo->{$bar['baz']}() ($foo->$bar)['baz']() Foo::$bar['baz']() Foo::{$bar['baz']}() (Foo::$bar)['baz']()
Dette vil bryte oppførselen til applikasjoner som har tilgang til verdier som dette. På den annen side kan du gjøre noen pene ting som dette :.
// Nested () foo()(); // Calls the return of foo() $foo->bar()(); // IIFE syntax like JavaScript (function() { // Function body })(); // Nested :: $foo::$bar::$baz
Åpnings- / lukkekodene `` ,
,
... `fjernes og er ikke lenger gyldige. Det bør være enkelt å bytte dem ut med gyldige, men hva gjør du med dem uansett rart?
Som et resultat av tilleggene, for eksempel parameter- og returtypeklasser, kan ikke grensesnitt og egenskaper lenger ha følgende navn:
- bool - int - float - string - null - true - false
Disse forårsaker brudd på eksisterende applikasjoner og bibliotekene som bruker dem, men de skal være enkle å fikse. Selv om de ikke forårsaker noen feil og er gyldige, bør ikke følgende brukes da de er reservert for fremtidig bruk:
objekt - blandet - numerisk
Å avstå fra å bruke dem bør spare deg for problemer med å endre dem i fremtiden. For en fullstendig liste over endringer som vil bryte kompatibiliteten, sjekk ut dette dokument .
Du kan også bruke php7cc , som sjekker koden din og kan oppdage potensielle problemer som kan oppstå hvis du går til PHP 7. Men det er selvfølgelig ingen bedre måte enn å installere PHP 7 og sjekke det ut selv. ## Potensielle problemer med PHP-kompatibilitet ### PHP 7 Kompatibilitet med infrastruktur
Mange hostingtjenester har begynt å legge til støtte for PHP 7. Dette er gode nyheter for delte hostingleverandører, ettersom ytelsesgevinsten vil tillate dem å øke antall klientnettsteder på maskinvaren, redusere driftskostnadene og øke marginene. Når det gjelder kundene selv, bør de ikke forvente for mye løft under disse forholdene, men for å være rettferdig, delt hosting er uansett ikke et ytelsesorientert alternativ.
På den annen side vil tjenester som tilbys av virtuelle private servere eller dedikerte servere, dra full nytte av dette ytelseshit. Noen tjenester av PaaS som Heroku støttet PHP 7 fra begynnelsen, men andre tjenester, som AWS Beanstalk Y OpenShift de Oracle , de henger etter. Sjekk PaaS-leverandørens nettsted for å se om PHP 7 allerede støttes, eller om support kommer i nær fremtid. Selvfølgelig lar IaaS-leverandører deg ta kontroll over maskinvaren og installere PHP 7 (eller kompilere hvis det er mer du liker). PHP 7-pakker er nå tilgjengelig for store IaaS-miljøer.
I tillegg til infrastrukturkompatibilitet, bør du også være oppmerksom på potensielle problemer med programvarekompatibilitet. Populære innholdsstyringssystemer som WordPress, Joomla og Drupal har lagt til støtte for PHP 7 med sine nyeste versjoner. Viktige rammer som Symfony og Laravel har også full støtte. Det er imidlertid på tide med et forsiktighetsord. Denne støtten utvides ikke til tredjepartskode i form av plugins, plugins, pakker, eller hva som helst ru CMS eller rammeverk kaller dem. De kan lide av kompatibilitetsproblemer, og det er ditt ansvar å sørge for at alt er klart for PHP 7.
For aktive og vedlikeholdte arkiver bør dette ikke være et problem. Imidlertid kan gamle, vedlikeholdsfrie arkiver som mangler PHP 7-støtte, gjøre hele applikasjonen ubrukelig.
PHP 7-versjonen fjernet gammel og utdatert kode og banet vei for nye funksjoner og ytelsesoppdateringer i fremtiden. PHP forventes også å få ytterligere ytelsesoptimaliseringer snart. Til tross for noen bakoverkompatibilitetshull, er de fleste problemer enkle å løse. Biblioteker og rammeverk overfører nå koden til PHP 7 og gjør de nyeste versjonene tilgjengelige. Jeg vil oppmuntre deg til å prøve å se resultatene selv. Kanskje søknaden din allerede støttes og venter på å bruke og dra nytte av PHP 7.
I slekt: Listen over de 10 vanligste feilene PHP-utviklere gjør>