Jednou z najzaujímavejších udalostí vo svete PHP v roku 2015 bolo vydanie PHP 7; 10 rokov po vydaní najnovšej hlavnej verzie, PHP 5. Vďaka veľkému kroku vpred predstavuje PHP 7 množstvo nových funkcií a aktualizácií výkonu. .
Odstraňuje však tiež starú zastaranú funkcionalitu, čo prináša určité medzery v kompatibilite, čo starším aplikáciám sťažuje migráciu na novú verziu. Táto príručka by mala slúžiť ako rýchla prehliadka toho, čo môžete očakávať, ak plánujete presunúť svoje existujúce aplikácie alebo vytvoriť nové nad úroveň PHP 7.
Ak v poslednej dobe nepracujete s PHP, možno by vás zaujímalo, čo sa stalo s PHP 6, prečo skok z PHP 5 na PHP 7? No dlhý príbeh, PHP 6 bol prepadák. Hlavným rysom verzie 6 bola natívna podpora znakov Unicode Pretože sa PHP používa hlavne pri vývoji webu a web potrebuje Unicode, mal tento krok, ktorý priniesol Unicode do PHP, zmysel.
Cieľom bolo priniesť úplnú podporu Unicode pre samotné jadro. Prinieslo by to rozšíreniu schopností jazyka: od schopnosti používať emodži nemý, rovnako ako názvy premenných a funkcií, k výkonným medzinárodným reťazcovým funkciám. Napríklad keď iný jazyk používa veľké a malé písmená inak ako anglicky, alebo keď je potrebné previesť meno v čínskych znakoch do angličtiny.
Tento ambiciózny plán sa, bohužiaľ, ukázal byť väčším problémom, ako sa predpokladalo. Väčšina kódovej základne musela byť portovaná na podporu Unicode pre veľké aj veľké rozšírenia, čo bolo zdĺhavé a komplikované. To spomalilo vývoj ďalších funkcií v jazyku, čo mnohých frustrovalo Vývojári PHP v procese. Boli predstavené ďalšie prekážky, ktoré viedli k menšiemu záujmu o vývoj natívnej podpory Unicode, čo nakoniec viedlo k ukončeniu projektu.
Pretože zdroje, ako sú knihy a články, boli napísané pre PHP 6 a jeho podporu Unicode, nová verzia by bola premenovaná na PHP 7, aby nedošlo k zámene.
Každopádne, dosť trpí smutnou minulosťou, pozrime sa, čo na párty prináša PHP 7.
Prakticky pri všetkých aktualizáciách sa očakávajú menšie zlepšenia výkonu. Tentokrát však PHP prináša oproti predchádzajúcim verziám výrazné zlepšenie, vďaka ktorým je samotný výkon jednou z najatraktívnejších funkcií PHP 7. Je súčasťou projektu „PHPNG“, ktorý sa zameriava na interné komponenty samotného enginu. Zend.
Refaktorovaním interných dátových štruktúr a pridaním medzikroku na kódovanie kompilácie vo forme abstraktného syntaxového stromu (AST) je výsledkom vynikajúci výkon a efektívnejšie alokovanie pamäte. Samotné čísla vyzerajú veľmi sľubne; The Referenčné hodnoty vykonávané v reálnych aplikáciách ukazujú, že PHP 7 je v priemere dvakrát rýchlejší ako PHP 5.6 a že vedie k 50% menšej spotrebe pamäte počas požiadaviek, čo robí PHP 7 silným konkurentom kompilátora HHVM JIT Facebooku. Zoznámte sa s touto infografikou spoločnosti Zend, ktorá zobrazuje výkonnosť niektorých bežných vecí CMS y rámce .
Zníženie spotreby pamäte tiež umožňuje menším strojom lepšie vybavovať požiadavky spolu s možnosťou budovať mikroslužby okolo PHP. Interné zmeny, najmä implementácia AST, tiež otvárajú možnosti budúcich optimalizácií, ktoré by mohli posunúť výkon ešte ďalej. Pre budúce verzie sa zvažuje nová interná implementácia kompilátora JIT.
PHP 7 prichádza s novými funkciami syntaxe. Aj keď nerozširujú možnosti samotného jazyka, poskytujú lepší alebo ľahší spôsob, ako urobiť váš kód príjemnejším na písanie a pohodlnejším pre oči.
Teraz môžeme zoskupiť deklarácie importu pre triedy pochádzajúce z rovnakého menného priestoru do riadku „usage“. To by malo pomôcť zmysluplne zosúladiť deklarácie alebo len uložiť niekoľko bajtov do súborov.
use FrameworkModuleFoo; use FrameworkModuleBar; use FrameworkModuleBaz;
S PHP 7 môžeme používať:
use FrameworkModule{Foo, Bar, Baz};
Alebo ak uprednostňujeme viaclineárny štýl:
use FrameworkModule{ Foo, Bar, Baz };
Toto rieši bežný problém v programovaní PHP, kde chceme priradiť hodnotu premennej inej premennej, ak je druhá skutočne nastavená; inak mu dajte inú hodnotu ako táto. Bežne sa používa pri práci so vstupom poskytnutým používateľom.
Pre-PHP 7:
if (isset($foo)) { $bar = $foo; } else { $bar = 'default'; // we would give $bar the value 'default' if $foo is NULL }
Po PHP 7:
$bar = $foo ?? 'default';
To môže byť tiež reťazené s množstvom premenných:
$bar = $foo ?? $baz ?? 'default';
Prevádzkovateľ vesmírnej lode umožňuje trojnásobné porovnanie medzi dvoma hodnotami, pričom nielen indikuje, či sú rovnaké, ale aj čo je väčšie, nad nerovnosťou vrátením hodnoty 1,0 alebo -1.
Podľa toho, ako sa hodnoty líšia, môžeme podniknúť rôzne kroky:
switch ($bar $foo) { case 0: echo '$bar and $foo are equal'; case -1: echo '$foo is bigger'; case 1: echo '$bar is bigger'; }
Porovnávanými hodnotami môžu byť celé čísla, plaváky, reťazce alebo dokonca polia. V dokumentácii nájdete predstavu o vzájomnom porovnaní rôznych hodnôt.
Ale samozrejme PHP 7 prináša aj novú vzrušujúcu funkcionalitu.
PHP 7 rozširuje deklarácie predchádzajúcich typov parametrov v metódach (triedy, rozhrania a polia) pridaním štyroch skalárnych typov; Celé čísla (int
), Plaváky ( float
), Boolovci (bool
) a Struny ( string
) ako možné typy parametrov.
Tiež môžeme voliteľne určiť, aký druh metód a funkcií vrátia. Podporované typy sú * bool *, * int *, * float *, * string *, * array *, * callable *, * Class * alebo * Interface * name, * self * a * parent * (pre metódy triedy)
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 } }
Deklarácie typu umožňujú konštrukciu robustnejších aplikácií a nedochádza k odovzdávaniu a vracaniu nesprávnych hodnôt z funkcií. Medzi ďalšie výhody patria analyzátory statického kódu a IDE, ktoré poskytujú lepší prehľad o kódovej základni, ak DocBlocks.
Pretože PHP je slabý typizačný jazyk, určité hodnoty parametrov a návratových typov sa budú vydávať na základe kontextu. Ak odovzdáme hodnotu „3“ vo funkcii, ktorá má deklarovaný parameter typu int
, tlmočník ju prijme ako celé číslo a nevyvolá chybu. Ak to nechcete, môžete povoliť modo estricto
pridanie smernice z declarar
.
Declarar (tipos_estrictos = 1);
Toto je stanovené na základe jednotlivých súborov, pretože globálna možnosť by rozdelila úložiská kódu na tie, ktoré sú zostavené s globálnou dôslednosťou. v a tie, ktoré nie sú, čo vedie k neočakávanému správaniu, keď skombinujeme kód z oboch.
Po pridaní výnimiek z motora, fatálne chyby, ktoré mohli viesť k ukončeniu Scenár dajú sa ľahko zachytiť a manipulovať s nimi.
Chyby ako volanie neexistujúcej metódy skript nezrušia, ale vyvolá výnimku, ktorú je možné vyriešiť testovacím blokom úlovkov, čo zlepšuje spracovanie chýb pre vaše aplikácie. To je dôležité pre určité typy aplikácií, serverov a serverov Démoni pretože fatálne chyby by vyžadovali reštart. Testovanie v PHPUnit by malo byť tiež užitočnejšie, pretože fatálne chyby zahladia celú testovaciu sadu. Výnimky, nie chyby, by riešil testovací prípad.
PHP 7 pridáva množstvo nových tried výnimiek na základe typu chýb, s ktorými sa možno stretnúť. Aby sa zachovala kompatibilita medzi verziami, nové rozhranie Throwable
ktoré je možné implementovať z motorových a používateľských výnimiek. To bolo nevyhnutné, aby sa zabránilo výnimkám motora na rozšírenie základnej triedy výnimiek, čo malo za následok staré výnimky na zachytávanie kódu, ktoré predtým neexistovali.
Pred PHP 7 by to skript ukončilo so závažnou chybou:
try { thisFunctionDoesNotEvenExist(); } catch (EngineException $e) { // Clean things up and log error echo $e->getMessage(); }
Anonymné triedy sú bratranci anonymných funkcií, ktoré by ste mohli použiť v krátkodobom jednoduchom prípade. Anonymné triedy sa dajú ľahko vytvoriť a použiť ako bežný objekt. Tu je príklad z dokumentov.
Pre-PHP 7
php class MyLogger { public function log($msg) { print_r($msg . '
'); } } $pusher->setLogger( new MyLogger() );
S anonymnou triedou:
php $pusher->setLogger(new class { public function log($msg) { print_r($msg . '
'); } });
Anonymné triedy sú užitočné pri testovaní jednotiek, najmä pri testovaní objektov a služieb. To nám pomáha vyhnúť sa replikácii ťažkých knižníc a rámcov a vytvárať tak jednoduchý objekt, ktorý poskytuje rozhranie, ktoré chceme napodobniť.
Boli pridané dve nové funkcie na generovanie kryptograficky bezpečných celých čísel a reťazcov.
random_bytes(int $len);
Vráti náhodný reťazec s dĺžkou $len
.
php random_int(int $min, int $max);
Vráti číslo medzi $min
a $max
.
Na rozdiel od mnohých iných jazykov nemal PHP pred PHP 7 spôsob, ako uniknúť kódu Unicode v reťazcových literáloch. Táto funkcia pridáva únikovú postupnosť ` u 'na vytvorenie týchto znakov pomocou vášho kódového kódu UTF-8. Je to lepšie ako priame vkladanie znakov, čo umožňuje lepšie zaobchádzanie s neviditeľnými znakmi, ako aj so znakmi, ktoré majú rovnaké grafické znázornenie, ale líšia sa významom.
echo 'u{1F602}'; // outputs ‚
Upozorňujeme, že sa tým rozbije existujúci kód so sekvenciou „ u“, pretože sa tým zmení správanie.
Generátory v PHP majú tiež niekoľko príjemných funkcií navyše. Generátory majú teraz príkaz na vrátenie, ktorý sa dá použiť na to, aby po iterácii umožnil vytvárať konečnú hodnotu. To sa dá použiť na overenie toho, či generátor bežal bez chýb a umožňuje kódu, ktorý volal generátor, správne spracovať rôzne scenáre.
Generátory tiež môžu vracať a vykresľovať výrazy z iných generátorov. To im umožňuje rozdeliť zložité operácie na jednoduchšie a modulárnejšie jednotky.
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.
Očakávania sú vylepšením afirmar ()
pri zachovaní spätnej kompatibility. Umožňujú uplatnenie nulových nákladov v produkčnom kóde a poskytujú možnosť vyvolať vlastné výnimky, keď tvrdenie zlyhá, čo môže byť užitočné počas vývoja.
Afirmar ()
sa stáva jazykovým konštruktom v PHP 7. Výroky by sa mali používať na účely ladenia iba vo vývojových a testovacích prostrediach. Na konfiguráciu jeho správania sú k dispozícii dve nové smernice.
zend.afirmación
- 1
: generovanie a vykonávanie kódu (vývojový režim) (predvolená hodnota) - 0
: generovanie kódu, ale skok okolo neho za behu - -1
: negenerovanie kódu, vďaka ktorému sú náklady nulové (spôsob výroby)afirmación.excepción
- 1
: hádzať, keď tvrdenie zlyhá, hádzať objekt poskytnutý ako výnimka alebo hádzať nový objekt * ErrorAffirmation *, ak výnimka nebola poskytnutá - 0
: použiť alebo vygenerovať * Throwable * podľa popisu vyššie, ale iba generuje varovanie založené na danom objekte namiesto toho, aby ho vyhodilo (kompatibilné s chovaním PHP 5)Zavedenie veľkého vydania poskytuje príležitosť zmeniť / aktualizovať staršie funkcie alebo ich dokonca odstrániť, ak sa považujú za príliš staré alebo sú už nejaký čas zastarané. Takéto zmeny môžu zaviesť prerušenie kompatibility v starších aplikáciách.
Ďalším problémom, ktorý z tejto verzie vyplýva, je, že dôležité knižnice a rámce, na ktorých ste závislí, nemuseli byť aktualizované tak, aby podporovali najnovšiu verziu. Tím PHP sa pokúsil urobiť nové zmeny čo najskôr a čo najviac uľahčiť migráciu na novú verziu. Pri novších a aktualizovanejších aplikáciách by sa mal prechod na novú verziu uľahčiť, zatiaľ čo staršie aplikácie sa možno budú musieť rozhodnúť, či výhody prevyšujú cenu, prípadne sa môžu rozhodnúť, že nebudú inovovať.
Väčšina prestávok je drobných a dá sa ľahko zmierniť, zatiaľ čo iné môžu vyžadovať viac úsilia a času. V zásade platí, že ak ste pred inštaláciou PHP 7 mali vo svojej aplikácii zastarané varovania, pravdepodobne sa vám zobrazia chyby, ktoré ju pokazia, kým nebude vyriešená. Boli ste varovaní, že?
Najdôležitejšie je, že staré a zastarané SAPI boli odstránené ako rozšírenie mysql
(ale nemali by ste to používať na prvom mieste, však?). Úplný zoznam rozšírení a odstránených zvýraznení môžete skontrolovať v tomto dokumente RFC tu Y. tu .
Na PHP 7 sa tiež prenášajú ďalšie SAPI.
Táto aktualizácia urobila niekoľko zmien v prospech konzistencie pre konštrukty premenných-premenných. Toto umožňuje pokročilejšie výrazy s premennými, ale zavádza zmeny správania v niektorých ďalších prípadoch, ako je uvedené nižšie.
// 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']()
To by narušilo správanie aplikácií, ktoré pristupujú k takýmto hodnotám. Na druhej strane môžete urobiť niekoľko úhľadných vecí, ako je tento :.
// Nested () foo()(); // Calls the return of foo() $foo->bar()(); // IIFE syntax like JavaScript (function() { // Function body })(); // Nested :: $foo::$bar::$baz
Otváracie / zatváracie značky „,
,
... `sú odstránené a už nie sú platné. Ich nahradenie platnými by malo byť jednoduché, ale čo s nimi vlastne robíte čudne?
V dôsledku doplnkov, ako sú návratové triedy a triedy typov parametrov, už nemôžu mať rozhrania a vlastnosti nasledujúce názvy:
- bool - int - float - string - null - true - false
Spôsobujú prerušenie existujúcich aplikácií a knižníc, ktoré ich používajú, ale malo by sa dať ľahko opraviť. Aj keď nespôsobujú žiadne chyby a sú platné, nemali by sa používať nasledujúce položky, pretože sú vyhradené pre budúce použitie:
objekt - zmiešaný - číselný
Ak sa ich nepoužívate, malo by vám to v budúcnosti ušetriť námahu s ich zmenami. Celý zoznam zmien, ktoré by narušili kompatibilitu, nájdete tu dokument .
Môžete tiež použiť php7cc , ktorá kontroluje váš kód a dokáže odhaliť potenciálne problémy, ktoré môžu vzniknúť pri prechode na PHP 7. Ale samozrejme neexistuje lepší spôsob, ako si nainštalovať PHP 7 a vyskúšať si ho sami. ## Potenciálne problémy s kompatibilitou PHP ### PHP 7 kompatibilita infraštruktúry
Mnoho hostingových služieb začalo pridávať podporu pre PHP 7. To je dobrá správa pre poskytovateľov zdieľaného hostingu, pretože zvýšenie výkonu im umožní zvýšiť počet klientskych webov na ich hardvéri, znížiť vaše prevádzkové náklady a zvýšiť vaše marže. Pokiaľ ide o samotných zákazníkov, za týchto podmienok by nemali očakávať príliš veľkú podporu, ale aby sme boli spravodliví, zdieľaný hosting aj tak nie je možnosťou zameranou na výkon.
Na druhej strane služby ponúkané virtuálnymi súkromnými servermi alebo dedikovanými servermi budú využívať všetky výhody tohto dosiahnutého výkonu. Niektoré služby PaaS ako Heroku podporuje PHP 7 od začiatku, ale iné služby, ako AWS Beanstalk Y. OpenShift de Oracle , zaostávajú. Skontrolujte webovú stránku svojho poskytovateľa PaaS a zistite, či je už podporovaný PHP 7, alebo či podpora príde v blízkej budúcnosti. Poskytovatelia IaaS vám samozrejme umožňujú prevziať kontrolu nad hardvérom a nainštalovať si PHP 7 (alebo kompilovať, ak vám to viac vyhovuje). Balíky PHP 7 sú teraz k dispozícii pre všetky hlavné prostredia IaaS.
Okrem kompatibility infraštruktúry by ste si mali uvedomiť aj potenciálne problémy s kompatibilitou softvéru. Populárne systémy na správu obsahu ako WordPress, Joomla a Drupal pridali podporu pre PHP 7 s ich najnovšími verziami. Dôležité snímky ako Symfony a Laravel sa tiež tešia plnej podpore. Je však čas na opatrnosť. Táto podpora sa nevzťahuje na kód tretích strán v podobe doplnkov, doplnkov, balíkov alebo ako ich volá iný CMS alebo framework. Môžu trpieť problémami s kompatibilitou a je vašou zodpovednosťou zabezpečiť, aby bolo všetko pripravené na PHP 7.
Pre aktívne a udržiavané úložiská by to nemal byť problém. Avšak staré bezúdržbové úložiská bez podpory PHP 7 môžu spôsobiť, že celá vaša aplikácia bude nepoužiteľná.
Verzia PHP 7 odstránila starý a zastaraný kód a pripravila pôdu pre nové funkcie a aktualizácie výkonu v budúcnosti. Očakáva sa tiež, že PHP čoskoro získa ďalšie optimalizácie výkonu. Napriek niektorým nedostatkom v spätnej kompatibilite je väčšina problémov ľahko vyriešiteľná. Knižnice a rámce teraz migrujú svoj kód na PHP 7, čím sprístupňujú najnovšie verzie. Chcem vás povzbudiť, aby ste sa pokúsili vidieť výsledky sami. Možno je vaša aplikácia už podporovaná a čaká na použitie a využitie PHP 7.
Súvisiace: Zoznam 10 najčastejších chýb, ktoré vývojári PHP robia>