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