A PHP 5.4 újdonságai
Bemutatkozás <ul><li>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. </li></ul>
Bevezetés
Történelmi visszatekintés <ul><li>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 </li></ul>
Roadmap <ul><li>Az nincs </li></ul>
WTF? <ul><li>Van az 5.4 kiadás 2 RM-je (Release Manager): </li><ul><li>Stas Malyshev
David Soria Parra </li></ul><li>Van egy Release Process RFC: </li><ul><li>https://wiki.php.net/rfc/releaseprocess </li></u...
RM <ul><li>Koordinálja egy adott kiadás körüli teendőket: </li><ul><li>Kezdeményezi, illetve moderálja az fejlesztések kör...
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.  </li></ul><li>Az RM-ek jóváhagyása nélkül ...
Hogyan alakul ki egy új verzió? <ul><li>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 <ul><li>Internal </li><ul><li>API
ABI </li></ul><li>Userland </li><ul><li>API </li></ul><li>Extensions </li></ul>
BC <ul><li>Major(4.0, 5.0, etc) </li><ul><li>Bármilyen BC break engedélyezett. </li></ul><li>Minor(5.1, 5.2, 5.3) </li><ul...
Userland API nem, vagy nagyon indokolt esetben.
Kiegészítők átköltöztethetőek core-ból pecl-be. </li></ul><li>Micro(5.3.6, 5.3.7) </li><ul><li>Semmilyen BC break nem enge...
Új, önálló feature is csak indokolt esetben. </li></ul></ul>
Miért nincs ez mindig így? <ul><li>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.). </li></ul>
Hogyan lehet ezen segíteni? <ul><li>Növelni kell a teszt esetek coverage-ét, illetve komolyan kell venni, ha egy teszteset...
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 é...
Be kell tartani az RFC-t... </li></ul>
Újdonságok
Closure rebind <ul><li>5.3-ban megállapodás hiányában nem lett megvalósítva az objektumok támogatása a névtelen függvények...
Closure rebind <ul><li>Mostantól a Closure-ökhöz tartozhat egy scope: </li><ul><li>A Closure úgy éri el a bound objektumot...
Closure rebind <ul><li>Scope:  </li><ul><li>Ha egy osztályon belül lett a Closure definiálva, akkor az adott osztály lesz ...
Upcoming SlideShare
Loading in …5
×

A PHP 5.4 újdonságai

4,035 views

Published on

Published in: Technology

A PHP 5.4 újdonságai

  1. 1. A PHP 5.4 újdonságai
  2. 2. Bemutatkozás <ul><li>Kovács Ferenc
  3. 3. Elsősorban webfejlesztő
  4. 4. +Üzemeltetés, IT biztonság, Minőségbiztosítás
  5. 5. Társszerkesztő a Weblaboron
  6. 6. Közreműködő a PHP projectben
  7. 7. __NEM__ „evangelista” :)
  8. 8. A Tyrael nick esetleg ismerősebb lehet. </li></ul>
  9. 9. Bevezetés
  10. 10. Történelmi visszatekintés <ul><li>4.0 – 2000.05.22 (Zend Engine)
  11. 11. 5.0 – 2004.07.13 (Zend Engine 2)
  12. 12. 5.1 – 2005.11.24
  13. 13. 5.2 – 2006.11.02
  14. 14. 6.0 – ???
  15. 15. 5.3 – 2009.06.30
  16. 16. 5.4 – ~2011.Q4/2012.Q1 </li></ul>
  17. 17. Roadmap <ul><li>Az nincs </li></ul>
  18. 18. WTF? <ul><li>Van az 5.4 kiadás 2 RM-je (Release Manager): </li><ul><li>Stas Malyshev
  19. 19. David Soria Parra </li></ul><li>Van egy Release Process RFC: </li><ul><li>https://wiki.php.net/rfc/releaseprocess </li></ul><li>Illetve egy Voting RFC: </li><ul><li>https://wiki.php.net/rfc/voting </li></ul><li>Elméletileg a mindkét RFC el lett fogadva... </li></ul>
  20. 20. RM <ul><li>Koordinálja egy adott kiadás körüli teendőket: </li><ul><li>Kezdeményezi, illetve moderálja az fejlesztések körüli megbeszéléseket, illetve a szavazást.
  21. 21. Kijelöli a kiadási folyamat egyes lépéseinek céljait és határidejét.
  22. 22. Tageli és csomagolja a kiadásra jelölt változatot.
  23. 23. Gondoskodik róla, hogy a releaseprocess RFC-ben foglaltak betartásra kerülnek. </li></ul><li>Az RM-ek jóváhagyása nélkül nem kerülhet az adott ágban új verzió kiadásra. </li></ul>
  24. 24. Hogyan alakul ki egy új verzió? <ul><li>Ami az előző verzióba valamiért nem fért bele.
  25. 25. Minden ami a trunkból átemelhető.
  26. 26. Hibajavítások (minden érintett branchre).
  27. 27. Ad hoc fejlesztések, elméletileg minden nem triviális fejlesztéshez kellene hogy legyen RFC illetve szavazás.
  28. 28. A BC(visszafele kompatibilitás) illetve a nem megfelelő stabilitás a leggyakoribb oka annak ha valami végül mégis kimarad. </li></ul>
  29. 29. BC <ul><li>Internal </li><ul><li>API
  30. 30. ABI </li></ul><li>Userland </li><ul><li>API </li></ul><li>Extensions </li></ul>
  31. 31. BC <ul><li>Major(4.0, 5.0, etc) </li><ul><li>Bármilyen BC break engedélyezett. </li></ul><li>Minor(5.1, 5.2, 5.3) </li><ul><li>Internal API/ABI megváltozhat.
  32. 32. Userland API nem, vagy nagyon indokolt esetben.
  33. 33. Kiegészítők átköltöztethetőek core-ból pecl-be. </li></ul><li>Micro(5.3.6, 5.3.7) </li><ul><li>Semmilyen BC break nem engedélyezett.
  34. 34. Új, önálló feature is csak indokolt esetben. </li></ul></ul>
  35. 35. Miért nincs ez mindig így? <ul><li>A releaseprocess RFC még nincs 1 éves.
  36. 36. Nagyon sok BC break nem szándékosan történik és néha túl későn derül ki: úgy marad.
  37. 37. Néha ugyan nyilvánvaló a változás, de mindenki úgy gondolja, hogy senkit nem fog érinteni.
  38. 38. Néha egyszerűen nincs más megoldás, mert fontos egy adott javítás (biztonsági rés, etc.). </li></ul>
  39. 39. Hogyan lehet ezen segíteni? <ul><li>Növelni kell a teszt esetek coverage-ét, illetve komolyan kell venni, ha egy teszteset elkezd elhasalni. (Ez utóbbi el volt hanyagolva.)
  40. 40. 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.
  41. 41. Be kell tartani az RFC-t... </li></ul>
  42. 42. Újdonságok
  43. 43. Closure rebind <ul><li>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: </li><ul><li>https://wiki.php.net/rfc/closures/removal-of-this </li></ul><li>5.4-ben immár erre is lehetőségünk lesz. </li></ul>
  44. 44. Closure rebind <ul><li>Mostantól a Closure-ökhöz tartozhat egy scope: </li><ul><li>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.) </li></ul><li>Mostantól a Closure-ökhöz tartozhat egy hozzárendelt(bound) objektum. </li><ul><li>Ez lesz a $this az adott Closure számára. </li></ul><li>Mostantól a Closure-ök definiálhatóak static-ként. </li><ul><li>Ebben az esetben nem érhető el a $this. </li></ul></ul>
  45. 45. Closure rebind <ul><li>Scope: </li><ul><li>Ha egy osztályon belül lett a Closure definiálva, akkor az adott osztály lesz a scope automatikusan.
  46. 46. Ha rebindoljuk a Closure::bind() vagy $closure->bindTo() függvényhivásokkal, akkor az ott megadott objektum scopeját kapja.
  47. 47. Closure::bind() 3. paraméterén keresztül megadható a boundtól eltérő scope.
  48. 48. Statikusan definiált Closure is rendelkezhet Scope-pal.
  49. 49. Fentiekből következik, hogy nem mindig van Scope. </li></ul></ul>
  50. 50. Closure rebind <ul><li>Bound: </li><ul><li>Ha egy osztályon belül lett a Closure definiálva, akkor az adott példány lesz a bound objektum automatikusan.
  51. 51. A bound objektum változtatható a Closure::bind() vagy $closure->bindTo() metódusán keresztül.
  52. 52. Statikus Closure nem rendelkezhet Bound objektummal. </li></ul></ul>
  53. 53. Closure rebind <ul><li>Static: </li><ul><li>Egy Closure akkor statikus, ha a static kulcsszóval vagy ha egy statikus metóduson belül definiáltuk.
  54. 54. Statikusan definiált Closure is rendelkezhet Scope-pal.
  55. 55. Statikus Closure nem rendelkezhet Bound objektummal. </li></ul></ul>
  56. 56. 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
  57. 57. Traits <ul><li>Van már dokumentáció o/ </li><ul><li>http://php.net/traits </li></ul><li>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
  58. 58. Egyszerűbben fogalmazva makró, a nyelv által biztosított copy&paste.
  59. 59. Elsőre bonyolultan hangozhat, lássunk egy példát. </li></ul>
  60. 60. Traits <?php trait ezcReflectionReturnInfo { function getReturnType() { /*1*/ } function getReturnDescription() { /*2*/ } } class ezcReflectionMethod extends ReflectionMethod { use ezcReflectionReturnInfo; /* ... */ } class ezcReflectionFunction extends ReflectionFunction { use ezcReflectionReturnInfo; /* ... */ }
  61. 61. Traits <ul><li>A trait kulcsszóval definiáljuk, önmagában nem példányosítható.
  62. 62. Osztályon belül a use kulcsszó használatával mondhatjuk meg az engine-nek, hogy mely traitseket szeretnénk használni.
  63. 63. 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.
  64. 64. Egy osztály több traitet is használhat. </li></ul>
  65. 65. Traits <ul><li>Természetesen több trait is használható egyszerre, a use után vesszővel felsorolva.
  66. 66. 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.
  67. 67. 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. </li></ul>
  68. 68. 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; } }
  69. 69. 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; } }
  70. 70. Traits <ul><li>Egy trait-en belül is használhatjuk a use kulcsszót, ami azt jelenti, hogy egymásra épülő viselkedéseket definiálhatunk.
  71. 71. 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.
  72. 72. Egy trait hivatkozhat statikus tagváltozókra, de nem definiálhatja őket, viszont statikus metódust definiálhat. </li></ul>
  73. 73. 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 ; } }
  74. 74. 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
  75. 75. Traits <?php trait StaticExample { public static function doSomething() { return 'Doing something' ; } } class Example { use StaticExample; } Example::doSomething();
  76. 76. Beépített webszerver <ul><li>A php bináris mostantól használható egy minimális tudású webszerverként.
  77. 77. -S kapcsolóval megadható hogy milyen ip_cím:port -on figyeljen a szerver
  78. 78. -t kapcsolóval megadható, hogy mi legyen a document root.
  79. 79. 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. </li></ul>
  80. 80. Beépített webszerver
  81. 81. Array dereferencing <ul><li>Lehetővé teszi, hogy egy függvény által visszaadott tömbből segédváltozó nélkül hivatkozni lehessen az egyik elemre. </li><ul><li>some_func()[0]; </li></ul><li>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. :/ </li><ul><li>https://wiki.php.net/rfc/fcallfcall
  82. 82. https://wiki.php.net/rfc/instance-method-call </li></ul></ul>
  83. 83. Rövidebb tömb deklaráció <ul><li>$foo = [1,2,3,3=>4];
  84. 84. Felmerült a rövid object deklaráció, valamint a natív json szintakszis is, de egyelőre nem került elfogadásra: </li><ul><li>https://wiki.php.net/rfc/objectarrayliterals </li></ul></ul>
  85. 85. callable <ul><li>Bevezetésre került a callable typehint, ami ugyanazt tekinti meghívhatónak, mint amit az is_callable(). </li><ul><li>function call(callable $callback){$callback();} </li></ul><li>Ehhez kapcsolódóan, mostantól lehetőség van egy callable formátumú tömböt egyszerűen meghívni: </li><ul><li>$foo = array('Closure', 'bind');$foo(); </li></ul></ul>
  86. 86. T_PAAMAYIM_NEKUDOTAYIM <ul><li>Mostantól hiba esetén nem csak a token konstansát, de a token nevét is megkapjuk a hibaüzenetben: </li><ul><li>Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM
  87. 87. vs
  88. 88. Parse error: syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM) </li></ul></ul>
  89. 89. session.upload.progress <ul><li>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! </li><ul><li>http://php.net/manual/en/session.upload-progress.php
  90. 90. $_SESSIONön keresztül nyomon követhető a feltöltések státusza.
  91. 91. További hasznos feature, hogy egy session változó beállításával akár meg is szakítható a feltöltés. </li></ul></ul>
  92. 92. 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 >
  93. 93. 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 ), );
  94. 94. mysql <ul><li>Mostantól a mysqlnd lesz az alapértelmezett mysql library, de továbbra is van lehetőség a libmysql-t használni.
  95. 95. 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.
  96. 96. 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. </li></ul>
  97. 97. Régiségek
  98. 98. Végképp eltörölve <ul><li>break/continue $var
  99. 99. magic_quotes_gpc (ha csak ellenőrizted, hogy be van-e kapcsolva, az továbbra is működik)
  100. 100. Safe mode
  101. 101. register_globals
  102. 102. register_long_arrays
  103. 103. import_request_variables()
  104. 104. allow_call_time_pass_reference.
  105. 105. define_syslog_variables
  106. 106. highlight.bg
  107. 107. session.bug_compat_42
  108. 108. session_is_registered()/session_register()/session_unregister()
  109. 109. y2k_compliance
  110. 110. Sqlite száműzve Szibériába(pecl), ajánlott az SQLite3 kiegészítőre átállni </li></ul>
  111. 111. És még sok egyéb
  112. 112. Néhány egyéb <ul><li>E_STRICT mostantól az E_ALL része
  113. 113. <?= mindig elérhető a short_open_tag beállítástól függetlenül
  114. 114. A oktális, decimális, hexadecimális mellett mostantól bináris formátumban is megadhatóak a számok. Pl: 0b001010
  115. 115. 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.
  116. 116. DTrace támogatás
  117. 117. Új output lay(API szinten nincs változás)
  118. 118. @ teljesítményoptimalizáció
  119. 119. Egy csomó más optimalizáció mind a cpu mind memória szempontból, 15-30-50%os javulások nem szintetikus teszteken </li></ul>
  120. 120. További olvasnivaló <ul><li>http://svn.php.net/viewvc/php/php-src/branches/PHP_5_4/NEWS?view=markup
  121. 121. http://svn.php.net/viewvc/php/php-src/branches/PHP_5_4/UPGRADING?view=markup
  122. 122. https://wiki.php.net/rfc
  123. 123. https://wiki.php.net/todo/php54
  124. 124. http://news.php.net/php.internals
  125. 125. http://svn.php.net/repository/php/php-src/branches/PHP_5_4/
  126. 126. https://bugs.php.net/search.php?cmd=display&phpver=5.4.0
  127. 127. http://gcov.php.net/viewer.php?version=PHP_5_4
  128. 128. http://qa.php.net/reports/ </li></ul>
  129. 129. Vége <ul><li>Köszönöm a figyelmet!
  130. 130. Jöhetnek a kérdések.
  131. 131. @Tyr43l
  132. 132. http://tyrael.hu/
  133. 133. http://www.slideshare.net/Tyrael/
  134. 134. Bocsi hogy nem volt vicces fotó. :P
  135. 135. Viszlát jövőre! </li></ul>

×