• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
A PHP 5.4 újdonságai
 

A PHP 5.4 újdonságai

on

  • 3,823 views

 

Statistics

Views

Total Views
3,823
Views on SlideShare
3,817
Embed Views
6

Actions

Likes
5
Downloads
14
Comments
0

3 Embeds 6

http://a0.twimg.com 4
http://www.linkedin.com 1
https://www.linkedin.com 1

Accessibility

Categories

Upload Details

Uploaded via as OpenOffice

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

A PHP 5.4 újdonságai A PHP 5.4 újdonságai Presentation Transcript

  • A PHP 5.4 újdonságai
  • Bemutatkozás
    • Kovács Ferenc
    • Elsősorban webfejlesztő
    • +Üzemeltetés, IT biztonság, Minőségbiztosítás
    • Társszerkesztő a Weblaboron
    • Közreműködő a PHP projectben
    • __NEM__ „evangelista” :)
    • A Tyrael nick esetleg ismerősebb lehet.
  • Bevezetés
  • Történelmi visszatekintés
    • 4.0 – 2000.05.22 (Zend Engine)
    • 5.0 – 2004.07.13 (Zend Engine 2)
    • 5.1 – 2005.11.24
    • 5.2 – 2006.11.02
    • 6.0 – ???
    • 5.3 – 2009.06.30
    • 5.4 – ~2011.Q4/2012.Q1
  • Roadmap
    • Az nincs
  • WTF?
    • Van az 5.4 kiadás 2 RM-je (Release Manager):
      • Stas Malyshev
      • David Soria Parra
    • Van egy Release Process RFC:
      • https://wiki.php.net/rfc/releaseprocess
    • Illetve egy Voting RFC:
      • https://wiki.php.net/rfc/voting
    • Elméletileg a mindkét RFC el lett fogadva...
  • RM
    • Koordinálja egy adott kiadás körüli teendőket:
      • Kezdeményezi, illetve moderálja az fejlesztések körüli megbeszéléseket, illetve a szavazást.
      • Kijelöli a kiadási folyamat egyes lépéseinek céljait és határidejét.
      • Tageli és csomagolja a kiadásra jelölt változatot.
      • Gondoskodik róla, hogy a releaseprocess RFC-ben foglaltak betartásra kerülnek.
    • Az RM-ek jóváhagyása nélkül nem kerülhet az adott ágban új verzió kiadásra.
  • Hogyan alakul ki egy új verzió?
    • Ami az előző verzióba valamiért nem fért bele.
    • Minden ami a trunkból átemelhető.
    • Hibajavítások (minden érintett branchre).
    • Ad hoc fejlesztések, elméletileg minden nem triviális fejlesztéshez kellene hogy legyen RFC illetve szavazás.
    • A BC(visszafele kompatibilitás) illetve a nem megfelelő stabilitás a leggyakoribb oka annak ha valami végül mégis kimarad.
  • BC
    • Internal
      • API
      • ABI
    • Userland
      • API
    • Extensions
  • BC
    • Major(4.0, 5.0, etc)
      • Bármilyen BC break engedélyezett.
    • Minor(5.1, 5.2, 5.3)
      • Internal API/ABI megváltozhat.
      • Userland API nem, vagy nagyon indokolt esetben.
      • Kiegészítők átköltöztethetőek core-ból pecl-be.
    • Micro(5.3.6, 5.3.7)
      • Semmilyen BC break nem engedélyezett.
      • Új, önálló feature is csak indokolt esetben.
  • Miért nincs ez mindig így?
    • A releaseprocess RFC még nincs 1 éves.
    • Nagyon sok BC break nem szándékosan történik és néha túl későn derül ki: úgy marad.
    • Néha ugyan nyilvánvaló a változás, de mindenki úgy gondolja, hogy senkit nem fog érinteni.
    • Néha egyszerűen nincs más megoldás, mert fontos egy adott javítás (biztonsági rés, etc.).
  • Hogyan lehet ezen segíteni?
    • Növelni kell a teszt esetek coverage-ét, illetve komolyan kell venni, ha egy teszteset elkezd elhasalni. (Ez utóbbi el volt hanyagolva.)
    • Be kell vonni több résztvevőt, alkalmazást az RC verziók tesztelésébe, hogy még a stable előtt legyen lehetőség kiszúrni és javítani a hibákat.
    • Be kell tartani az RFC-t...
  • Újdonságok
  • Closure rebind
    • 5.3-ban megállapodás hiányában nem lett megvalósítva az objektumok támogatása a névtelen függvényekhez:
      • https://wiki.php.net/rfc/closures/removal-of-this
    • 5.4-ben immár erre is lehetőségünk lesz.
  • Closure rebind
    • Mostantól a Closure-ökhöz tartozhat egy scope:
      • A Closure úgy éri el a bound objektumot mintha a Closure a scope-ban megadott osztályban lenne egy metódus. (visibility miatt fontos pl.)
    • Mostantól a Closure-ökhöz tartozhat egy hozzárendelt(bound) objektum.
      • Ez lesz a $this az adott Closure számára.
    • Mostantól a Closure-ök definiálhatóak static-ként.
      • Ebben az esetben nem érhető el a $this.
  • Closure rebind
    • Scope:
      • Ha egy osztályon belül lett a Closure definiálva, akkor az adott osztály lesz a scope automatikusan.
      • Ha rebindoljuk a Closure::bind() vagy $closure->bindTo() függvényhivásokkal, akkor az ott megadott objektum scopeját kapja.
      • Closure::bind() 3. paraméterén keresztül megadható a boundtól eltérő scope.
      • Statikusan definiált Closure is rendelkezhet Scope-pal.
      • Fentiekből következik, hogy nem mindig van Scope.
  • Closure rebind
    • Bound:
      • Ha egy osztályon belül lett a Closure definiálva, akkor az adott példány lesz a bound objektum automatikusan.
      • A bound objektum változtatható a Closure::bind() vagy $closure->bindTo() metódusán keresztül.
      • Statikus Closure nem rendelkezhet Bound objektummal.
  • Closure rebind
    • Static:
      • Egy Closure akkor statikus, ha a static kulcsszóval vagy ha egy statikus metóduson belül definiáltuk.
      • Statikusan definiált Closure is rendelkezhet Scope-pal.
      • Statikus Closure nem rendelkezhet Bound objektummal.
  • Closure rebind <?php class MyClass { private $foo = 100 ; public function getClosure () { $baz = 1 ; return function ( $bar ) use ( $baz ) { return $this ->foo+ $bar + $baz ; }; } } $myClass = new MyClass; $closure = $myClass ->getClosure(); echo $closure ( 10 ); // 111
  • Traits
    • Van már dokumentáció o/
      • http://php.net/traits
    • Viselkedések gyüjteménye, többszörös öröklést nem támogató nyelvekben használható egyik konstrukció a horizontális kódújrahasznosításra
    • Egyszerűbben fogalmazva makró, a nyelv által biztosított copy&paste.
    • Elsőre bonyolultan hangozhat, lássunk egy példát.
  • Traits <?php trait ezcReflectionReturnInfo { function getReturnType() { /*1*/ } function getReturnDescription() { /*2*/ } } class ezcReflectionMethod extends ReflectionMethod { use ezcReflectionReturnInfo; /* ... */ } class ezcReflectionFunction extends ReflectionFunction { use ezcReflectionReturnInfo; /* ... */ }
  • Traits
    • A trait kulcsszóval definiáljuk, önmagában nem példányosítható.
    • Osztályon belül a use kulcsszó használatával mondhatjuk meg az engine-nek, hogy mely traitseket szeretnénk használni.
    • A traitben létező metódus felüldefiniálja a parentből definiált metódust, de az adott osztályban definiált metódust nem.
    • Egy osztály több traitet is használhat.
  • Traits
    • Természetesen több trait is használható egyszerre, a use után vesszővel felsorolva.
    • Ha szeretnénk használni több traitet egyszerre, amelyek közül kettő ugyanazt a metódust definiálja, akkor az insteadof kulcsszóval feloldhatjuk a konfliktusokat.
    • Ha egy metódus láthatóságát szeretnénk megváltoztatni, vagy egy másik néven is elérni, azt az as kulcsszóval tehetjük meg.
  • Traits <?php trait A { public function smallTalk() { echo 'a' ; } public function bigTalk() { echo 'A' ; } } trait B { public function smallTalk() { echo 'b' ; } public function bigTalk() { echo 'B' ; } } class Talker { use A, B { B::smallTalk insteadof A; A::bigTalk insteadof B; } }
  • Traits <?php trait HelloWorld { public function sayHello() { echo 'Hello World!' ; } } // Change visibility of sayHello class MyClass1 { use HelloWorld { sayHello as protected ; } } // Alias method with changed visibility // sayHello visibility not changed class MyClass2 { use HelloWorld { sayHello as private myPrivateHello; } }
  • Traits
    • Egy trait-en belül is használhatjuk a use kulcsszót, ami azt jelenti, hogy egymásra épülő viselkedéseket definiálhatunk.
    • Lehetőségünk van absztrakt metódusok definiálására is, ezáltal jelezve a traitet felhasználó osztálynak, ha valamit neki szükséges definiálnia.
    • Egy trait hivatkozhat statikus tagváltozókra, de nem definiálhatja őket, viszont statikus metódust definiálhat.
  • Traits <?php trait Hello { public function sayHelloWorld() { echo 'Hello' . $this ->getWorld(); } abstract public function getWorld(); } class MyHelloWorld { private $world ; use Hello; public function getWorld() { return $this ->world; } public function setWorld( $val ) { $this ->world = $val ; } }
  • Traits <?php trait Counter { public function inc() { static $c = 0 ; $c = $c + 1 ; echo &quot; $c n &quot; ; } } class C1 { use Counter; } class C2 { use Counter; } $o = new C1(); $o ->inc(); // echo 1 $p = new C2(); $p ->inc(); // echo 1
  • Traits <?php trait StaticExample { public static function doSomething() { return 'Doing something' ; } } class Example { use StaticExample; } Example::doSomething();
  • Beépített webszerver
    • A php bináris mostantól használható egy minimális tudású webszerverként.
    • -S kapcsolóval megadható hogy milyen ip_cím:port -on figyeljen a szerver
    • -t kapcsolóval megadható, hogy mi legyen a document root.
    • A cli_server.color php ini beállítást 1-re állítva a szerver indítása után szinesben látjuk az egyes lekéréseket jelző logokat, ezáltal könnyebben követhetőek a sikeres/sikertelen lekérések.
  • Beépített webszerver
  • Array dereferencing
    • Lehetővé teszi, hogy egy függvény által visszaadott tömbből segédváltozó nélkül hivatkozni lehessen az egyik elemre.
      • some_func()[0];
    • Sajnos a method chaining illetve a példányosításból egyből metódus hivás még nem került be ebbe a verzióba. :/
      • https://wiki.php.net/rfc/fcallfcall
      • https://wiki.php.net/rfc/instance-method-call
  • Rövidebb tömb deklaráció
    • $foo = [1,2,3,3=>4];
    • Felmerült a rövid object deklaráció, valamint a natív json szintakszis is, de egyelőre nem került elfogadásra:
      • https://wiki.php.net/rfc/objectarrayliterals
  • callable
    • Bevezetésre került a callable typehint, ami ugyanazt tekinti meghívhatónak, mint amit az is_callable().
      • function call(callable $callback){$callback();}
    • Ehhez kapcsolódóan, mostantól lehetőség van egy callable formátumú tömböt egyszerűen meghívni:
      • $foo = array('Closure', 'bind');$foo();
  • T_PAAMAYIM_NEKUDOTAYIM
    • Mostantól hiba esetén nem csak a token konstansát, de a token nevét is megkapjuk a hibaüzenetben:
      • Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM
      • vs
      • Parse error: syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM)
  • session.upload.progress
    • Az uploadprogress es az apc extensionök után végre eljutottunk oda, hogy core modulok használatával is követhető 1 fájlfeltöltés státusza!
      • http://php.net/manual/en/session.upload-progress.php
      • $_SESSIONön keresztül nyomon követhető a feltöltések státusza.
      • További hasznos feature, hogy egy session változó beállításával akár meg is szakítható a feltöltés.
  • session.upload.progress < form action= &quot;upload.php&quot; method= &quot;POST&quot; enctype= &quot;multipart/form-data&quot; > < input type= &quot;hidden&quot; name= &quot; <?php echo ini_get ( &quot;session.upload_progress.name&quot; ); ?> &quot; value= &quot;123&quot; /> < input type= &quot;file&quot; name= &quot;file1&quot; /> < input type= &quot;file&quot; name= &quot;file2&quot; /> < input type= &quot;submit&quot; /> </ form >
  • session.upload.progress $_SESSION [ &quot;upload_progress_123&quot; ] = array ( &quot;start_time&quot; => 1234567890 , // The request time &quot;content_length&quot; => 57343257 , // POST content length &quot;bytes_processed&quot; => 453489 , // Amount of bytes received and processed &quot;done&quot; => false, // true when the POST handler has finished, successfully or not &quot;files&quot; => array ( 0 => array ( &quot;field_name&quot; => &quot;file1&quot; , // Name of the <input/> field // The following 3 elements equals those in $_FILES &quot;name&quot; => &quot;foo.avi&quot; , &quot;tmp_name&quot; => &quot;/tmp/phpxxxxxx&quot; , &quot;error&quot; => 0 , &quot;done&quot; => true, // True when the POST handler has finished handling this file &quot;start_time&quot; => 1234567890 , // When this file has started to be processed &quot;bytes_processed&quot; => 57343250 , // Amount of bytes received and processed for this file ), );
  • mysql
    • Mostantól a mysqlnd lesz az alapértelmezett mysql library, de továbbra is van lehetőség a libmysql-t használni.
    • libmysqlből már csak 4.1es illetve magasabb verzió támogatott, elképzelhető hogy a végleges verzióban ez még feljebb kúszik.
    • Felmerült, hogy a mysql extensiont dokumentáció szinten ellenjavalttá kellene tenni, a mysqli kiegészítés nagyon egyszerű migrációt tesz lehetővé, és folyamatosan fejlesztés alatt áll, szemben a mysql extensionnel.
  • Régiségek
  • Végképp eltörölve
    • break/continue $var
    • magic_quotes_gpc (ha csak ellenőrizted, hogy be van-e kapcsolva, az továbbra is működik)
    • Safe mode
    • register_globals
    • register_long_arrays
    • import_request_variables()
    • allow_call_time_pass_reference.
    • define_syslog_variables
    • highlight.bg
    • session.bug_compat_42
    • session_is_registered()/session_register()/session_unregister()
    • y2k_compliance
    • Sqlite száműzve Szibériába(pecl), ajánlott az SQLite3 kiegészítőre átállni
  • És még sok egyéb
  • Néhány egyéb
    • E_STRICT mostantól az E_ALL része
    • <?= mindig elérhető a short_open_tag beállítástól függetlenül
    • A oktális, decimális, hexadecimális mellett mostantól bináris formátumban is megadhatóak a számok. Pl: 0b001010
    • enable_post_data_reading segítségével letiltható, a $_POST feltöltése, a nyers post data a php://input-on keresztül elérhető, multipart feltöltésnél hatékonyabb memóriakezelés érhető el.
    • DTrace támogatás
    • Új output lay(API szinten nincs változás)
    • @ teljesítményoptimalizáció
    • Egy csomó más optimalizáció mind a cpu mind memória szempontból, 15-30-50%os javulások nem szintetikus teszteken
  • További olvasnivaló
    • http://svn.php.net/viewvc/php/php-src/branches/PHP_5_4/NEWS?view=markup
    • http://svn.php.net/viewvc/php/php-src/branches/PHP_5_4/UPGRADING?view=markup
    • https://wiki.php.net/rfc
    • https://wiki.php.net/todo/php54
    • http://news.php.net/php.internals
    • http://svn.php.net/repository/php/php-src/branches/PHP_5_4/
    • https://bugs.php.net/search.php?cmd=display&phpver=5.4.0
    • http://gcov.php.net/viewer.php?version=PHP_5_4
    • http://qa.php.net/reports/
  • Vége
    • Köszönöm a figyelmet!
    • Jöhetnek a kérdések.
    • @Tyr43l
    • http://tyrael.hu/
    • http://www.slideshare.net/Tyrael/
    • Bocsi hogy nem volt vicces fotó. :P
    • Viszlát jövőre!