Ele esteve aqui em João Pessoa em outubro/2015 participando do PHPESTE
Não falarei sobre scripts de migração automática
(algumas coisas ainda podem mudar)
Existe incompatibilidade com versões anteriores?
Alguma função nova ou alterada?
Em relação a classes, interfaces e constantes há algo de novo?
Os slides a seguir foram criados por Rasmus Lerdorf (criador do PHP)
Estão disponíveis no link talks.php.net/oz15
Dados disponíveis em talks.php.net/oz15
Dados disponíveis em talks.php.net/oz15
Dados disponíveis em talks.php.net/oz15
Dados disponíveis em talks.php.net/oz15
Dados disponíveis em talks.php.net/oz15
Dados disponíveis em talks.php.net/oz15
Dados disponíveis em talks.php.net/oz15
Muitos erros fatais foram convertidos em exceções
Essas exceções herdam da classe Error
A classe Error implementa a interface Throwable
Não atribui mais os valores na ordem inversa
list($a[], $a[], $a[]) = [1, 2, 3]; var_dump($a);
array(3) { [0]=> int(3) [1]=> int(2) [2]=> int(1) }
array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) }
Não deixe seu código apegado à ordenação
Foi removida a opção de list() vazio
Não desempacota mais - use o str_split() para isso
$array = []; $array["a"] =& $array["b"]; $array["b"] = 1; var_dump($array);
array(2) { ["b"]=> &int(1) ["a"]=> &int(1) }
array(2) { ["a"]=> &int(1) ["b"]=> &int(1) }
Variáveis variáveis não podem ser usadas com a palavra-chave global
function f() { // Valid in PHP 5 only. global $$foo->bar; // Valid in PHP 5 and 7. global ${$foo->bar}; }
Procure não usar uma variável global "do nada"
No PHP 5, o uso de parênteses no parâmetro da função quando o parêmetro é uma outra função, não exibia warning
function getArray() { return [1, 2, 3]; } function squareArray(array &$a) { foreach ($a as &$v) { $v **= 2; } } // Generates a warning in PHP 7. squareArray((getArray()));
Notice: Only variables should be passed by reference in /tmp/test.php on line 13
Isso significa que as mudanças feitas no array durante a iteração, não irão afetar os valores iterados
Quando você iterar sobre um array "por referência", o PHP 7 irá manter a iteração atualizada sobre mudanças no array
$array = [0]; foreach ($array as &$val) { var_dump($val); $array[1] = 1; }
No PHP 7 você irá incrementar o array que está sendo iterado
$array = [0]; foreach ($array as &$val) { var_dump($val); $array[1] = 1; }
Irá imprimir:
int(0)
$array = [0]; foreach ($array as &$val) { var_dump($val); $array[1] = 1; }
Irá imprimir:
int(0) int(1)
bool int float string NULL TRUE FALSE
Nomes que não irão causar erro mas estão reservados para o futuro e devem ser considerados deprecated
resource object mixed numeric
<script language="php"></script>
O suporte a comentários com # foi removido e agora deve ser utilizado o ; (ponto e vírgula)
As mudanças se aplicam tanto ao arquivo php.ini quanto aos manipulados por parse_ini_file() e parse_ini_string()
A declaração de tipos agora vai além de nomes de classes, interfaces e arrays
Strings (string)
Integers (int)
Floating-point numbers (float)
Booleans (bool)
Ver documentação
// Coercive mode function sumOfInts(int ...$ints) { return array_sum($ints); } var_dump(sumOfInts(2, '3', 4.1));
O exemplo acima imprime:
int(9)
O PHP 7 adicionou o suporte a declaração de tipo de retorno
Similar à declaração de tipo de argumento, especifica o tipo de retorno que uma função irá retornar
function arraysSum(array ...$arrays): array { return array_map(function(array $array): int { return array_sum($array); }, $arrays); } print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));
O operador coalesce para NULL (??) foi adicionado como um incremento sintático para as situações onde se usa o ternário junto ao isset()
// Fetches the value of $_GET['user'] and returns 'nobody' // if it does not exist. $username = $_GET['user'] ?? 'nobody'; // This is equivalent to: $username = isset($_GET['user']) ? $_GET['user'] : 'nobody'; // Coalesces can be chained: this will return the first // defined value out of $_GET['user'], $_POST['user'], and // 'nobody'. $username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
O operador spaceship (isso mesmo, operador "nave espacial"), é usado para comparar dois valores
Ele irá retorna -1, 0 ou 1 quando o valor $a for respectivamente menor que, igual a ou maior que $b
As comparações são realizadas seguindo a mesma regra de comparação de tipos já existente
// Integers echo 1 <=> 1; // 0 echo 1 <=> 2; // -1 echo 2 <=> 1; // 1 // Floats echo 1.5 <=> 1.5; // 0 echo 1.5 <=> 2.5; // -1 echo 2.5 <=> 1.5; // 1 // Strings echo "a" <=> "a"; // 0 echo "a" <=> "b"; // -1 echo "b" <=> "a"; // 1
Constantes de Array agora podem ser definidas com o define(). No PHP 5.6 só podiam com o const (fora da definição de uma classe)
define('ANIMALS', [ 'dog', 'cat', 'bird' ]); echo ANIMALS[1]; // outputs "cat"
Suporte a classes anônimas foi adicionado através do new class
Exemplo de definição de classe anônima
// Leve em consideração que já foram criadas // a interface Logger e a classe Application... $app = new Application; $app->setLogger(new class implements Logger { public function log(string $msg) { echo $msg; } }); var_dump($app->getLogger());
O exemplo acima irá imprimir:
object(class@anonymous)#2 (0) { }
Documentação de classes anônimas
Classes, funções e constantes importadas do mesmo namespace agora podem ser agrupadas no mesmo statement use
// Pre PHP 7 code use some\namespace\ClassA; use some\namespace\ClassB; use some\namespace\ClassC as C; use function some\namespace\fn_a; use function some\namespace\fn_b; use function some\namespace\fn_c; use const some\namespace\ConstA; use const some\namespace\ConstB; use const some\namespace\ConstC; // PHP 7+ code use some\namespace\{ClassA, ClassB, ClassC as C}; use function some\namespace\{fn_a, fn_b, fn_c}; use const some\namespace\{ConstA, ConstB, ConstC};
Executa uma divisão de inteiros e retorna um inteiro
Exemplos de uso do intdiv()
var_dump(intdiv(3, 2)); var_dump(intdiv(-3, 2)); var_dump(intdiv(3, -2)); var_dump(intdiv(-3, -2)); var_dump(intdiv(PHP_INT_MAX, PHP_INT_MAX)); var_dump(intdiv(PHP_INT_MIN, PHP_INT_MIN)); var_dump(intdiv(PHP_INT_MIN, -1)); var_dump(intdiv(1, 0));
Retorna:
int(1) int(-1) int(-1) int(1) int(1) int(1) Fatal error: Uncaught ArithmeticError: Division of PHP_INT_MIN by -1 is not an integer in %s on line 8 Fatal error: Uncaught DivisionByZeroError: Division by zero in %s on line 9
session_start() agora aceita um array de opções que sobrescreve o que estiver definido no php.ini
Se você quiser por exemplo alterar o parâmetro session.cache_limiter para private e fechar a sessão imediatamente após a leitura pode usar:
session_start([ 'cache_limiter' => 'private', 'read_and_close' => true, ]);
$bytes = random_bytes(5); var_dump(bin2hex($bytes));
Retorna algo similar a:
string(10) "385e33f741"
var_dump(random_int(100, 999)); var_dump(random_int(-1000, 0));
Retorna algo similar a:
int(248) int(-898)
Construtores no estilo do PHP 4 (onde o construtor tem o mesmo nome da função) agora são deprecated e serão removidos no futuro
O PHP 7 irá emitir um E_DEPRECATED se o um construtor PHP 4 for o único construtor da classe
Classes que implementam __construct() não serão afetadas
Exemplo de uso de construtor PHP 4 (deprecated)
class foo { function foo() { echo 'I am the constructor'; } }
O exemplo acima irá imprimir:
Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; foo has a deprecated constructor in example.php on line 3
class foo { function bar() { echo 'I am not static!'; } } foo::bar();
O exemplo acima irá imprimir:
Deprecated: Non-static method foo::bar() should not be called statically in - on line 8 I am not static!
Em seguida:
$ git clone https://github.com/rlerdorf/php7dev.git $ cd php7dev $ vagrant up ... (takes a bit - it is downloading 1.5G) $ vagrant ssh
Sua máquina estará disponível no IP fixo 192.168.7.7
vagrant@php7dev:~$ sudo newphp 56 Activating PHP 5.6.6-dev and restarting php-fpm vagrant@php7dev:~$ sudo newphp 7 debug Activating PHP 7.0.0-dev and restarting php-fpm
Estão disponíveis 20 versões pre-compiladas começando na 5.3
Fique à vontade para me seguir no GitHub