O layout desses slides foi clonado do Ocramius também conhecido como Marco Pivetta
(o cara do Doctrine/ZendFramework)
Você pode acessar o original aqui github.com/Ocramius/zf2-best-practices
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
Faltando assinatura ao usar herança | E_WARNING |
Acessando propriedade estática "não-estaticamente" | E_NOTICE |
Chamando métodos não estáticos estaticamente | $foo::bar(); |
E_DEPRECATED |
Expression | PHP 5 interpretation | PHP 7 interpretation |
---|---|---|
$foo->$bar['baz'] |
$foo->{$bar['baz']}
|
($foo->$bar)['baz'] |
$foo->$bar['baz']() |
$foo->{$bar['baz']}()
|
($foo->$bar)['baz']() |
Foo::$bar['baz']() |
Foo::{$bar['baz']}()
|
(Foo::$bar)['baz']() |
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
Tag de abertura | Tag de fechamento |
<% | %> |
<%= | %> |
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