Novedades de PHP 7.*
Por Yannick Warnier – PHP Day Perú 2017 II
Versiones de PHP
http://php.net/supported-versions.php
Versiones de PHP
https://en.wikipedia.org/wiki/PHP
Versiones de PHP
https://en.wikipedia.org/wiki/PHP
3 años!!!
Versiones de PHP
https://en.wikipedia.org/wiki/PHP
Versiones de PHP
https://en.wikipedia.org/wiki/PHP
Versiones recientes?
http://php.net/
Donde encontrar los cambios?
http://php.net/
5.6 a 7.0
5.6 a 7.0: BW incompatible
●
Dejar set_exception_handler() por
Exception/Throwable
●
Constructores internos: siempre devuelven
exceptions cuando fallan
●
Parse errors → “ParseError” object exception
http://php.net/manual/en/migration70.incompatible.php
5.6 a 7.0: BW incompatible
●
E_STRICT
http://php.net/manual/en/migration70.incompatible.php
5.6 a 7.0: BW incompatible
●
E_STRICT
http://php.net/manual/en/migration70.incompatible.php
5.6 a 7.0: BW incompatible
●
Gestión de variables
http://php.net/manual/en/migration70.incompatible.php
5.6 a 7.0: BW incompatible
●
list() funciona al revés para variables/arrays
http://php.net/manual/en/migration70.incompatible.php
5.6 a 7.0: BW incompatible
●
list() ya no funciona vacío. Prohibido:
http://php.net/manual/en/migration70.incompatible.php
5.6 a 7.0: BW incompatible
●
Variables variables no pueden usarse con global
http://php.net/manual/en/migration70.incompatible.php
5.6 a 7.0: BW incompatible
●
Parentesis alrededor de argumentos
http://php.net/manual/en/migration70.incompatible.php
Notice: Only variables should be passed by reference in /tmp/test.php on line 13
5.6 a 7.0: BW incompatible
●
foreach ya no cambia el puntero interno
5.6 a 7.0: BW incompatible
●
foreach ya no usa el array de iteración mientras
itera, en el caso de un foreach por valores
●
foreach puede modificar el array de iteración al
vuelo durante su iteración
5.6 a 7.0: BW incompatible
●
Literales octales inválidos
●
0128 ya no es cortado a 012 automáticamente
●
Ya bota un PARSE ERROR
●
Bitshifts negativos
●
var_dump(1 >> -1) → ArithmeticError
●
División por 0
●
De E_WARNING a DivisionByZeroError
5.6 a 7.0: BW incompatible
●
String con hexadecimales ya no son “numeric”
●
is_numeric(‘0x123’) → false
●
substr(‘foo’, ‘0x1’) → Notice: non-well formed
numeric value…
●
u{EFEZRFZ → FATAL ERROR (unicode)
5.6 a 7.0: BW incompatible
●
call_user_method() + call_user_method_array()
●
Eliminadas (call_user_func())
●
Fin de “ereg” (ver preg)
●
Funciones mcrypt_* eliminadas
●
ext/mysql y ext/mssql eliminados
●
set_magic_quotes_runtime() → eliminado
●
set_socket_blocking() → removed
5.6 a 7.0: BW incompatible
●
dl() no se puede usar en PHP-FPM
●
always_populate_raw_post_data + asp_tags:
removed
●
xsl.security_prefs removed
5.6 a 7.0: BW incompatible
●
Resultados de “new” ya no pueden ser
asignados por referencia (PARSE ERROR)
●
Etiquetas ASP y script eliminadas:
●
<%
●
<%=
●
<script language=”php”>
●
Yield (varios cambios)
5.6 a 7.0: BW incompatible
●
Ya no switch() con multiple “default:”
●
$HTTP_RAW_POST_DATA... ya fue
●
Comentarios # en los archivos .ini … ya fueron
●
JSON remplazado por JSOND
●
34. → 34 o 34.0
●
3.e3 → 3.0e3 o 3e3
●
“” → no es válido
●
Otras cosas de funciones, session handlers y
orden de ordenamiento
5.6 a 7.0: Lo nuevo
●
Declaración escalares (coerciva o estricta)
5.6 a 7.0: Lo nuevo
●
Declaración tipo de retorno
5.6 a 7.0: Lo nuevo
●
Null coalescing operator
5.6 a 7.0: Lo nuevo
●
Spaceship
5.6 a 7.0: Lo nuevo
●
Arrays constantes
●
Clases anónimas
●
new class implements Logger { ... }
●
closure::call()
●
unserialize() filtrado (whitelist de clases)
●
expectations/assert()
●
“use” agrupado:
●
use somenamespace{ClassA, ClassC as C};
5.6 a 7.0: Lo nuevo
●
Generadores
●
session_start() opciones como arrays
●
Nueva función preg_replace_callback_array()
●
CSPRNG (cifrado)
5.6 a 7.0: Eliminados
●
Constructores tipo PHP 4
5.6 a 7.0: Eliminados
●
Llamadas estáticas a métodos no-estáticos
●
password_hash() salt
●
ldap_sort()
●
Warning sobre date.timezone (default UTC)
7.0 a 7.1: BW incompatible
●
ArgumentCountError exception (Fatal Error)
●
error_log funciona con syslog
●
$str[ ] ya no está autorizado para strings!!!!
●
…
●
Mcrypt... ya fue
7.0 a 7.1: Lo nuevo
●
DateTime incluye microsegundos
●
Fatal errors → Error exception en muchas clases
●
Nullable types: function test(?string $name) { ...
●
Void functions: function edit(&$left): void { …
●
[ ] como list: [$id1, $name1] = $data;
●
Visibilidad de constantes de clases
7.0 a 7.1: Lo nuevo
●
Pseudo-tipo “iterable”: function iterator(iterable $a)
●
Excepciones multi-catch
●
} catch (FirstException | SecondException $e) {
●
Soporte de keys en list()
●
Soporte para offsets negativos en strings
●
var_dump(“abcdef”[-2]) → “e”
●
HTTP/2 server push support in ext/curl
7.0 a 7.1: Lo nuevo
●
E_WARNING y E_NOTICE cuando
●
‘1b’ + ‘algo’;
7.1 a 7.2: BW incompatible
●
No mucho
●
Strings sin comillas que no son constantes pasan
de lanzar un E_NOTICE a un E_WARNING
●
__autoload() ya no va (spl_autoload_register() sí)
●
create_function() ya no va
●
(unset) algo → ya no va
●
each() ya no va. Use foreach()
●
7.1 a 7.2: Lo nuevo
●
Tipo “object” para aceptar cualquier objeto
●
function test(object $obj) : object
●
Carga de extensiones en .ini por su nombre sin
extensión (.so/.dll)
●
Sobreescribir métodos abstractos
●
Sodium incluido en core (criptografía avanzada)
●
Varias cosas para PDO, LDAP, EXIF y Sockets
7.* en general: optimizaciones
●
$a = “$b and $c”; mejor que $a = $b.” and “.$c;
●
“Hey” . strlen($str); mejor que “Hey” . strlen($str);
https://www.slideshare.net/jpauli/symfonycon-2017-php7-performances
7.* en general: optimizaciones
●
Mejor arrays con índices numéricos incrementales
solo (no necesariamente paso de 1)
https://www.slideshare.net/jpauli/symfonycon-2017-php7-performances
Gracias! Preguntas?
Yannick Warnier
CTO - BeezNest
Presidente/Leader – Chamilo
@ywarnier

Novedades de PHP 7.*

  • 1.
    Novedades de PHP7.* Por Yannick Warnier – PHP Day Perú 2017 II
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
    Donde encontrar loscambios? http://php.net/
  • 9.
  • 10.
    5.6 a 7.0:BW incompatible ● Dejar set_exception_handler() por Exception/Throwable ● Constructores internos: siempre devuelven exceptions cuando fallan ● Parse errors → “ParseError” object exception http://php.net/manual/en/migration70.incompatible.php
  • 11.
    5.6 a 7.0:BW incompatible ● E_STRICT http://php.net/manual/en/migration70.incompatible.php
  • 12.
    5.6 a 7.0:BW incompatible ● E_STRICT http://php.net/manual/en/migration70.incompatible.php
  • 13.
    5.6 a 7.0:BW incompatible ● Gestión de variables http://php.net/manual/en/migration70.incompatible.php
  • 14.
    5.6 a 7.0:BW incompatible ● list() funciona al revés para variables/arrays http://php.net/manual/en/migration70.incompatible.php
  • 15.
    5.6 a 7.0:BW incompatible ● list() ya no funciona vacío. Prohibido: http://php.net/manual/en/migration70.incompatible.php
  • 16.
    5.6 a 7.0:BW incompatible ● Variables variables no pueden usarse con global http://php.net/manual/en/migration70.incompatible.php
  • 17.
    5.6 a 7.0:BW incompatible ● Parentesis alrededor de argumentos http://php.net/manual/en/migration70.incompatible.php Notice: Only variables should be passed by reference in /tmp/test.php on line 13
  • 18.
    5.6 a 7.0:BW incompatible ● foreach ya no cambia el puntero interno
  • 19.
    5.6 a 7.0:BW incompatible ● foreach ya no usa el array de iteración mientras itera, en el caso de un foreach por valores ● foreach puede modificar el array de iteración al vuelo durante su iteración
  • 20.
    5.6 a 7.0:BW incompatible ● Literales octales inválidos ● 0128 ya no es cortado a 012 automáticamente ● Ya bota un PARSE ERROR ● Bitshifts negativos ● var_dump(1 >> -1) → ArithmeticError ● División por 0 ● De E_WARNING a DivisionByZeroError
  • 21.
    5.6 a 7.0:BW incompatible ● String con hexadecimales ya no son “numeric” ● is_numeric(‘0x123’) → false ● substr(‘foo’, ‘0x1’) → Notice: non-well formed numeric value… ● u{EFEZRFZ → FATAL ERROR (unicode)
  • 22.
    5.6 a 7.0:BW incompatible ● call_user_method() + call_user_method_array() ● Eliminadas (call_user_func()) ● Fin de “ereg” (ver preg) ● Funciones mcrypt_* eliminadas ● ext/mysql y ext/mssql eliminados ● set_magic_quotes_runtime() → eliminado ● set_socket_blocking() → removed
  • 23.
    5.6 a 7.0:BW incompatible ● dl() no se puede usar en PHP-FPM ● always_populate_raw_post_data + asp_tags: removed ● xsl.security_prefs removed
  • 24.
    5.6 a 7.0:BW incompatible ● Resultados de “new” ya no pueden ser asignados por referencia (PARSE ERROR) ● Etiquetas ASP y script eliminadas: ● <% ● <%= ● <script language=”php”> ● Yield (varios cambios)
  • 25.
    5.6 a 7.0:BW incompatible ● Ya no switch() con multiple “default:” ● $HTTP_RAW_POST_DATA... ya fue ● Comentarios # en los archivos .ini … ya fueron ● JSON remplazado por JSOND ● 34. → 34 o 34.0 ● 3.e3 → 3.0e3 o 3e3 ● “” → no es válido ● Otras cosas de funciones, session handlers y orden de ordenamiento
  • 26.
    5.6 a 7.0:Lo nuevo ● Declaración escalares (coerciva o estricta)
  • 27.
    5.6 a 7.0:Lo nuevo ● Declaración tipo de retorno
  • 28.
    5.6 a 7.0:Lo nuevo ● Null coalescing operator
  • 29.
    5.6 a 7.0:Lo nuevo ● Spaceship
  • 30.
    5.6 a 7.0:Lo nuevo ● Arrays constantes ● Clases anónimas ● new class implements Logger { ... } ● closure::call() ● unserialize() filtrado (whitelist de clases) ● expectations/assert() ● “use” agrupado: ● use somenamespace{ClassA, ClassC as C};
  • 31.
    5.6 a 7.0:Lo nuevo ● Generadores ● session_start() opciones como arrays ● Nueva función preg_replace_callback_array() ● CSPRNG (cifrado)
  • 32.
    5.6 a 7.0:Eliminados ● Constructores tipo PHP 4
  • 33.
    5.6 a 7.0:Eliminados ● Llamadas estáticas a métodos no-estáticos ● password_hash() salt ● ldap_sort() ● Warning sobre date.timezone (default UTC)
  • 34.
    7.0 a 7.1:BW incompatible ● ArgumentCountError exception (Fatal Error) ● error_log funciona con syslog ● $str[ ] ya no está autorizado para strings!!!! ● … ● Mcrypt... ya fue
  • 35.
    7.0 a 7.1:Lo nuevo ● DateTime incluye microsegundos ● Fatal errors → Error exception en muchas clases ● Nullable types: function test(?string $name) { ... ● Void functions: function edit(&$left): void { … ● [ ] como list: [$id1, $name1] = $data; ● Visibilidad de constantes de clases
  • 36.
    7.0 a 7.1:Lo nuevo ● Pseudo-tipo “iterable”: function iterator(iterable $a) ● Excepciones multi-catch ● } catch (FirstException | SecondException $e) { ● Soporte de keys en list() ● Soporte para offsets negativos en strings ● var_dump(“abcdef”[-2]) → “e” ● HTTP/2 server push support in ext/curl
  • 37.
    7.0 a 7.1:Lo nuevo ● E_WARNING y E_NOTICE cuando ● ‘1b’ + ‘algo’;
  • 38.
    7.1 a 7.2:BW incompatible ● No mucho ● Strings sin comillas que no son constantes pasan de lanzar un E_NOTICE a un E_WARNING ● __autoload() ya no va (spl_autoload_register() sí) ● create_function() ya no va ● (unset) algo → ya no va ● each() ya no va. Use foreach() ●
  • 39.
    7.1 a 7.2:Lo nuevo ● Tipo “object” para aceptar cualquier objeto ● function test(object $obj) : object ● Carga de extensiones en .ini por su nombre sin extensión (.so/.dll) ● Sobreescribir métodos abstractos ● Sodium incluido en core (criptografía avanzada) ● Varias cosas para PDO, LDAP, EXIF y Sockets
  • 40.
    7.* en general:optimizaciones ● $a = “$b and $c”; mejor que $a = $b.” and “.$c; ● “Hey” . strlen($str); mejor que “Hey” . strlen($str); https://www.slideshare.net/jpauli/symfonycon-2017-php7-performances
  • 41.
    7.* en general:optimizaciones ● Mejor arrays con índices numéricos incrementales solo (no necesariamente paso de 1) https://www.slideshare.net/jpauli/symfonycon-2017-php7-performances
  • 42.
  • 43.
    Yannick Warnier CTO -BeezNest Presidente/Leader – Chamilo @ywarnier