PHP 7 - Guia Rápido

O que é PHP 7?

PHP 7 é um grande lançamento da linguagem de programação PHP e é apontado como uma revolução na maneira como os aplicativos da web podem ser desenvolvidos e entregues para dispositivos móveis para empresas e na nuvem. Este lançamento é considerado a mudança mais importante para o PHP após o lançamento do PHP 5 em 2004.

Novas características

Existem dezenas de recursos adicionados ao PHP 7, os mais significativos são mencionados abaixo -

  • Improved performance - Tendo o código PHPNG fundido no PHP7, é duas vezes mais rápido que o PHP 5.

  • Lower Memory Consumption - O PHP 7 otimizado utiliza menos recursos.

  • Scalar type declarations - Agora, os tipos de parâmetro e retorno podem ser aplicados.

  • Consistent 64-bit support - Suporte consistente para máquinas com arquitetura de 64 bits.

  • Improved Exception hierarchy - A hierarquia de exceções foi aprimorada.

  • Many fatal errors converted to Exceptions - O intervalo de exceções é aumentado cobrindo muitos erros fatais convertidos como exceções.

  • Secure random number generator - Adição de uma nova API segura de gerador de números aleatórios.

  • Deprecated SAPIs and extensions removed - Vários SAPIs e extensões antigos e sem suporte foram removidos da versão mais recente.

  • The null coalescing operator (??) - Novo operador de coalescência nulo adicionado.

  • Return and Scalar Type Declarations - Suporte para tipo de retorno e tipo de parâmetro adicionado.

  • Anonymous Classes - Suporte para anônimo adicionado.

  • Zero cost asserts - Suporte para assert custo zero adicionado.

O PHP 7 usa o novo Zend Engine 3.0 para melhorar o desempenho do aplicativo quase duas vezes e o consumo de memória 50% melhor do que o PHP 5.6. Ele permite atender a mais usuários simultâneos sem a necessidade de nenhum hardware adicional. O PHP 7 foi projetado e refeito considerando as cargas de trabalho de hoje.

De acordo com a equipe Zend , as ilustrações a seguir mostram a comparação de desempenho do PHP 7 vs PHP 5.6 e HHVM 3.7 em aplicativos populares baseados em PHP.

Magento 1.9

O PHP 7 prova ser duas vezes mais rápido, em comparação com o PHP 5.6, durante a execução de transações Magento.

Drupal 7

O PHP 7 prova ser duas vezes mais rápido, em comparação com o PHP 5.6, durante a execução de transações Drupal.

Wordpress 3.6

O PHP 7 prova ser duas vezes mais rápido que o PHP 5.6 ao executar transações do Wordpress.

Comparação de Linguagens Dinâmicas

Experimente a opção online

Configuramos o ambiente de programação PHP online, para que você possa compilar e executar todos os exemplos disponíveis online. Dá a você confiança no que está lendo e permite que você verifique os programas com diferentes opções. Sinta-se à vontade para modificar qualquer exemplo e executá-lo online.

Experimente o exemplo a seguir usando nosso compilador online disponível em CodingGround.

<html>
   <head>
      <title>Online PHP Script Execution</title>
   </head>
   <body>
      <?php
         echo "<h1>Hello, PHP!</h1>";
      ?>   
   </body>
</html>

Para a maioria dos exemplos dados neste tutorial, você encontrará um Try itopção nas seções de código do nosso site no canto superior direito que o levará para o compilador online. Portanto, apenas use e aproveite seu aprendizado.

Para desenvolver e executar páginas da Web em PHP, três componentes vitais precisam ser instalados em seu sistema de computador.

  • Web Server- O PHP funciona com praticamente todos os softwares de servidor Web, incluindo o Internet Information Server (IIS) da Microsoft, mas o mais usado é o Apache Server. Baixe o Apache gratuitamente aqui -http://httpd.apache.org/download.cgi

  • Database- PHP PHP funciona com praticamente todos os softwares de banco de dados, incluindo Oracle e Sybase, mas o mais comumente usado é o banco de dados MySQL. Baixe o MySQL gratuitamente aqui -http://www.mysql.com/downloads/

  • PHP Parser- Para processar as instruções do script PHP, um analisador deve ser instalado para gerar a saída HTML que pode ser enviada ao navegador da web. Este tutorial irá guiá-lo como instalar o analisador PHP em seu computador.

Instalação do PHP Parser

Antes de prosseguir, é importante certificar-se de que você tenha o ambiente adequado configurado em sua máquina para desenvolver seus programas da web usando PHP. Armazene o seguinte arquivo php na pasta htdocs do Apache.

phpinfo.php

<?php
   phpinfo();
?>

Digite o seguinte endereço na caixa de endereço do seu navegador.

http://127.0.0.1/phpinfo.php

Se isso exibir uma página mostrando as informações relacionadas à instalação do PHP, significa que o PHP e o servidor da Web estão instalados corretamente. Caso contrário, você deve seguir o procedimento fornecido para instalar o PHP em seu computador.

Esta seção irá guiá-lo para instalar e configurar o PHP nas quatro plataformas a seguir -

  • Instalação de PHP em Linux ou Unix com Apache

  • Instalação do PHP no Mac OS X com Apache

  • Instalação do PHP no Windows NT / 2000 / XP com IIS

  • Instalação do PHP no Windows NT / 2000 / XP com Apache

Configuração Apache

Se você estiver usando o Apache como um servidor Web, esta seção o guiará para editar os arquivos de configuração do Apache.

Verifique aqui - Configuração do PHP no servidor Apache

Configuração do arquivo PHP.INI

O arquivo de configuração do PHP, php.ini, é a forma final e imediata de afetar a funcionalidade do PHP.

Verifique aqui - Configuração do arquivo PHP.INI

Configuração do Windows IIS

Para configurar o IIS em sua máquina Windows, você pode consultar o manual de referência do IIS enviado com o IIS.

No PHP 7, um novo recurso, declarações de tipo escalar, foi introduzido. A declaração de tipo escalar tem duas opções -

  • coercive - coercivo é o modo padrão e não precisa ser especificado.

  • strict - o modo estrito deve ser sugerido explicitamente.

Os seguintes tipos de parâmetros de função podem ser aplicados usando os modos acima -

  • int
  • float
  • bool
  • string
  • interfaces
  • array
  • callable

Exemplo - Modo Coercitivo

<?php
   // Coercive mode
   function sum(int ...$ints) {
      return array_sum($ints);
   }
   print(sum(2, '3', 4.1));
?>

Ele produz a seguinte saída do navegador -

9

Exemplo - Modo estrito

<?php
   // Strict mode
   declare(strict_types=1);
   function sum(int ...$ints) {
      return array_sum($ints);
   }
   print(sum(2, '3', 4.1));
?>

Ele produz a seguinte saída do navegador -

Fatal error: Uncaught TypeError: Argument 2 passed to sum() must be of the type integer, string given, ...

No PHP 7, um novo recurso, Return type declarationsfoi introduzido. A declaração do tipo de retorno especifica o tipo de valor que uma função deve retornar. Os seguintes tipos de tipos de retorno podem ser declarados.

  • int
  • float
  • bool
  • string
  • interfaces
  • array
  • callable

Exemplo - Tipo de retorno válido

<?php
   declare(strict_types = 1);
   function returnIntValue(int $value): int {
      return $value;
   }
   print(returnIntValue(5));
?>

Ele produz a seguinte saída do navegador -

5

Exemplo - Tipo de retorno inválido

<?php
   declare(strict_types = 1);
   function returnIntValue(int $value): int {
      return $value + 1.0;
   }
   print(returnIntValue(5));
?>

Ele produz a seguinte saída do navegador -

Fatal error: Uncaught TypeError: Return value of returnIntValue() must be of the type integer, float returned...

No PHP 7, um novo recurso, null coalescing operator (??)foi introduzido. É usado para substituir oternaryoperação em conjunto com a função isset (). oNullcoalescing operator retorna seu primeiro operando se ele existir e não for NULL; caso contrário, ele retorna seu segundo operando.

Exemplo

<?php
   // fetch the value of $_GET['user'] and returns 'not passed'
   // if username is not passed
   $username = $_GET['username'] ?? 'not passed';
   print($username);
   print("<br/>");

   // Equivalent code using ternary operator
   $username = isset($_GET['username']) ? $_GET['username'] : 'not passed';
   print($username);
   print("<br/>");
   // Chaining ?? operation
   $username = $_GET['username'] ?? $_POST['username'] ?? 'not passed';
   print($username);
?>

Ele produz a seguinte saída do navegador -

not passed
not passed
not passed

No PHP 7, um novo recurso, operador de nave espacial foi introduzido. É usado para comparar duas expressões. Ele retorna -1, 0 ou 1 quando a primeira expressão é respectivamente menor, igual ou maior que a segunda expressão.

Exemplo

<?php
   //integer comparison
   print( 1 <=> 1);print("<br/>");
   print( 1 <=> 2);print("<br/>");
   print( 2 <=> 1);print("<br/>");
   print("<br/>");
   
   //float comparison
   print( 1.5 <=> 1.5);print("<br/>");
   print( 1.5 <=> 2.5);print("<br/>");
   print( 2.5 <=> 1.5);print("<br/>");
   print("<br/>");
   
   //string comparison
   print( "a" <=> "a");print("<br/>");
   print( "a" <=> "b");print("<br/>");
   print( "b" <=> "a");print("<br/>");
?>

Ele produz a seguinte saída do navegador -

0
-1
1

0
-1
1

0
-1
1

Constantes de matriz agora podem ser definidas usando o define()função. No PHP 5.6, eles só podiam ser definidos usandoconst palavra-chave.

Exemplo

<?php
   //define a array using define function
   define('animals', [
      'dog',
      'cat',
      'bird'
   ]);
   print(animals[1]);
?>

Ele produz a seguinte saída do navegador -

cat

Classes anônimas agora podem ser definidas usando nova classe. A classe anônima pode ser usada no lugar de uma definição de classe completa.

Exemplo

<?php
   interface Logger {
      public function log(string $msg);
   }

   class Application {
      private $logger;

      public function getLogger(): Logger {
         return $this->logger;
      }

      public function setLogger(Logger $logger) {
         $this->logger = $logger;
      }  
   }

   $app = new Application;
   $app->setLogger(new class implements Logger {
      public function log(string $msg) {
         print($msg);
      }
   });

   $app->getLogger()->log("My first Log Message");
?>

Ele produz a seguinte saída do navegador -

My first Log Message

Closure::call()método é adicionado como uma forma abreviada de vincular temporariamente um escopo de objeto a um encerramento e invocá-lo. É muito mais rápido em desempenho em comparação combindTo do PHP 5.6.

Exemplo - Pre PHP 7

<?php
   class A {
      private $x = 1;
   }

   // Define a closure Pre PHP 7 code
   $getValue = function() {
      return $this->x;
   };

   // Bind a clousure
   $value = $getValue->bindTo(new A, 'A'); 

   print($value());
?>

Ele produz a seguinte saída do navegador -

1

Exemplo - PHP 7

<?php
   class A {
      private $x = 1;
   }

   // PHP 7+ code, Define
   $value = function() {
      return $this->x;
   };

   print($value->call(new A));
?>

Ele produz a seguinte saída do navegador -

1

PHP 7 apresenta Filtrado unserialize()função para fornecer melhor segurança ao desserializar objetos em dados não confiáveis. Isso evita possíveis injeções de código e permite que o desenvolvedor coloque na lista de permissões classes que podem ser desserializadas.

Exemplo

<?php
   class MyClass1 { 
      public $obj1prop;   
   }
   class MyClass2 {
      public $obj2prop;
   }

   $obj1 = new MyClass1();
   $obj1->obj1prop = 1;
   $obj2 = new MyClass2();
   $obj2->obj2prop = 2;

   $serializedObj1 = serialize($obj1);
   $serializedObj2 = serialize($obj2);

   // default behaviour that accepts all classes
   // second argument can be ommited.
   // if allowed_classes is passed as false, unserialize converts all objects into __PHP_Incomplete_Class object
   $data = unserialize($serializedObj1 , ["allowed_classes" => true]);

   // converts all objects into __PHP_Incomplete_Class object except those of MyClass1 and MyClass2
   $data2 = unserialize($serializedObj2 , ["allowed_classes" => ["MyClass1", "MyClass2"]]);

   print($data->obj1prop);
   print("<br/>");
   print($data2->obj2prop);
?>

Ele produz a seguinte saída do navegador -

1
2

No PHP7, um novo IntlCharclasse é adicionada, que visa expor funcionalidades adicionais da UTI. Esta classe define vários métodos estáticos e constantes, que podem ser usados ​​para manipular caracteres Unicode. Você precisa terIntl extensão instalada antes de usar esta classe.

Exemplo

<?php
   printf('%x', IntlChar::CODEPOINT_MAX);
   print (IntlChar::charName('@'));
   print(IntlChar::ispunct('!'));
?>

Ele produz a seguinte saída do navegador -

10ffff
COMMERCIAL AT
true

No PHP 7, a seguir, duas novas funções são introduzidas para gerar inteiros e strings criptograficamente seguros em uma plataforma cruzada.

  • random_bytes() - Gera bytes pseudo-aleatórios criptograficamente seguros.

  • random_int() - Gera inteiros pseudo-aleatórios criptograficamente seguros.

random_bytes ()

random_bytes () gera uma string de comprimento arbitrário de bytes criptográficos aleatórios que são adequados para uso criptográfico, como ao gerar sais, chaves ou vetores de inicialização.

Sintaxe

string random_bytes ( int $length )

Parâmetros

  • length - O comprimento da string aleatória que deve ser retornada em bytes.

Valores Retornados

  • Retorna uma string contendo o número solicitado de bytes aleatórios criptograficamente seguros.

Erros / exceções

  • Se uma fonte apropriada de aleatoriedade não puder ser encontrada, uma exceção será lançada.

  • Se parâmetros inválidos forem fornecidos, um TypeError será lançado.

  • Se um comprimento inválido de bytes for fornecido, um erro será lançado.

Exemplo

<?php
   $bytes = random_bytes(5);
   print(bin2hex($bytes));
?>

Ele produz a seguinte saída do navegador -

54cc305593

random_int ()

random_int() gera inteiros criptográficos aleatórios que são adequados para uso onde os resultados imparciais são críticos.

Sintaxe

int random_int ( int $min , int $max )

Parâmetros

  • min - O menor valor a ser retornado, que deve ser PHP_INT_MIN ou mais alto.

  • max - O maior valor a ser retornado, que deve ser menor ou igual a PHP_INT_MAX.

Valores Retornados

  • Retorna um inteiro aleatório criptograficamente seguro no intervalo mínimo a máximo, inclusive.

Erros / exceções

  • Se uma fonte apropriada de aleatoriedade não puder ser encontrada, um Exception será lançado.

  • Se parâmetros inválidos forem fornecidos, um TypeError será lançado.

  • Se max for menor que min, um Error será lançado.

Exemplo

<?php
   print(random_int(100, 999));
   print(" ");
   print(random_int(-1000, 0));
?>

Ele produz a seguinte saída do navegador -

614
-882

Expectationssão um aprimoramento compatível com versões anteriores da função assert () mais antiga. A expectativa permite asserções de custo zero no código de produção e fornece a capacidade de lançar exceções customizadas quando a asserção falha. assert () é agora uma construção de linguagem, onde o primeiro parâmetro é uma expressão em comparação a ser uma string ou booleano a ser testado.

Diretivas de configuração para assert ()

Diretriz Valor padrão Valores possíveis
zend.assertions 1

1 - gerar e executar código (modo de desenvolvimento)

0 - gerar código, mas pular em tempo de execução

-1 - não gerar código (modo de produção)

assert.exception 0

1 - lançar, quando a afirmação falhar, seja lançando o objeto fornecido como exceção ou lançando um novo AssertionError objeto se a exceção não foi fornecida.

0 - use ou gere um Throwable conforme descrito acima, mas apenas gera um aviso baseado naquele objeto ao invés de lançá-lo (compatível com o comportamento do PHP 5)

Parâmetros

  • assertion- A afirmação. No PHP 5, deve ser uma string a ser avaliada ou um Booleano a ser testado. No PHP 7, também pode ser qualquer expressão que retorna um valor, que será executado e o resultado é usado para indicar se a asserção foi bem-sucedida ou falhou.

  • description - Uma descrição opcional que será incluída na mensagem de falha, se a asserção falhar.

  • exception - No PHP 7, o segundo parâmetro pode ser um Throwable objeto em vez de uma string descritiva, caso em que este é o objeto que será lançado, se a declaração falhar e o assert.exception a diretiva de configuração está habilitada.

Valores Retornados

FALSE se a afirmação for falsa, TRUE de outra forma.

Exemplo

<?php
   ini_set('assert.exception', 1);

   class CustomError extends AssertionError {}

   assert(false, new CustomError('Custom Error Message!'));
?>

Ele produz a seguinte saída do navegador -

Fatal error: Uncaught CustomError: Custom Error Message! in...

A partir do PHP7, uma única instrução de uso pode ser usada para importar classes, funções e constantes do mesmo namespace em vez de várias instruções de uso.

Exemplo

<?php
   // Before PHP 7
   use com\tutorialspoint\ClassA;
   use com\tutorialspoint\ClassB;
   use com\tutorialspoint\ClassC as C;

   use function com\tutorialspoint\fn_a;
   use function com\tutorialspoint\fn_b;
   use function com\tutorialspoint\fn_c;

   use const com\tutorialspoint\ConstA;
   use const com\tutorialspoint\ConstB;
   use const com\tutorialspoint\ConstC;

   // PHP 7+ code
   use com\tutorialspoint\{ClassA, ClassB, ClassC as C};
   use function com\tutorialspoint\{fn_a, fn_b, fn_c};
   use const com\tutorialspoint\{ConstA, ConstB, ConstC};

?>

No PHP 7, o tratamento de erros e relatórios foram alterados. Em vez de relatar erros por meio do mecanismo tradicional de relato de erros usado pelo PHP 5, agora a maioria dos erros são tratados lançando exceções de erro. Semelhante às exceções, essas exceções de erro borbulham até atingirem o primeiro bloco catch correspondente. Se não houver blocos correspondentes, um manipulador de exceção padrão instalado comset_exception_handler()será chamado. Caso não haja um manipulador de exceção padrão, a exceção será convertida em um erro fatal e será tratada como um erro tradicional.

Como a hierarquia de erro não é estendida de Exception, o código que usa blocos catch (Exception $ e) {...} para lidar com exceções não capturadas no PHP 5 não irá lidar com tais erros. Um bloco catch (Error $ e) {...} ou umset_exception_handler() handler é necessário para lidar com erros fatais.

Exemplo

<?php
   class MathOperations {
      protected $n = 10;

      // Try to get the Division by Zero error object and display as Exception
      public function doOperation(): string {
         try {
            $value = $this->n % 0;
            return $value;
         } catch (DivisionByZeroError $e) {
            return $e->getMessage();
         }
      }
   }

   $mathOperationsObj = new MathOperations();
   print($mathOperationsObj->doOperation());
?>

Ele produz a seguinte saída do navegador -

Modulo by zero

PHP 7 apresenta uma nova função intdiv(), que realiza a divisão inteira de seus operandos e retorna a divisão como int.

Exemplo

<?php
   $value = intdiv(10,3);
   var_dump($value);
   print(" ");
   print($value);
?>

Ele produz a seguinte saída do navegador -

int(3) 
3

Do PHP7 +, session_start() função aceita uma série de opções para substituir as diretivas de configuração de sessão definidas em php.ini. Essas opções suportamsession.lazy_write, que está ativado por padrão e faz com que o PHP sobrescreva qualquer arquivo de sessão se os dados da sessão forem alterados.

Outra opção adicionada é read_and_close, que indica que os dados da sessão devem ser lidos e, em seguida, a sessão deve ser imediatamente encerrada sem alterações. Por exemplo, Setsession.cache_limiter como privado e defina o sinalizador para fechar a sessão imediatamente após lê-la, usando o seguinte trecho de código.

<?php
   session_start([
      'cache_limiter' => 'private',
      'read_and_close' => true,
   ]);
?>

Os recursos a seguir estão obsoletos e podem ser removidos de versões futuras do PHP.

Construtores de estilo PHP 4

Construtores de estilo PHP 4 são métodos que têm o mesmo nome da classe em que são definidos, estão agora obsoletos e serão removidos no futuro. PHP 7 emitirá E_DEPRECATED se um construtor PHP 4 for o único construtor definido dentro de uma classe. As classes que implementam um método __construct () não são afetadas.

Exemplo

<?php
   class A {
      function A() {
         print('Style Constructor');
      }
   }
?>

Ele produz a seguinte saída do navegador -

Deprecated: Methods with the same name as their class will not be constructors 
in a future version of PHP; A has a deprecated constructor in...

Chamadas estáticas para métodos não estáticos

Chamadas estáticas para métodos não estáticos estão obsoletas e podem ser removidas no futuro.

Exemplo

<?php
   class A {
      function b() {
         print('Non-static call');
      }
   }
   A::b();
?>

Ele produz a seguinte saída do navegador -

Deprecated: Non-static method A::b() should not be called statically in...
Non-static call

opção de sal password_hash ()

A opção de sal para o password_hash()função foi descontinuada para que os desenvolvedores não gerem seus próprios sais (geralmente inseguros). A própria função gera um sal criptograficamente seguro, quando nenhum sal é fornecido pelo desenvolvedor - portanto, a geração de sal personalizado não é mais necessária.

capture_session_meta opção de contexto SSL

o capture_session_metaA opção de contexto SSL foi descontinuada. Metadados SSL agora são usados ​​por meio dostream_get_meta_data() função.

As seguintes extensões foram removidas do PHP 7 em diante -

  • ereg
  • mssql
  • mysql
  • sybase_ct

Os seguintes SAPIs foram removidos do PHP 7 em diante -

  • aolserver
  • apache
  • apache_hooks
  • apache2filter
  • caudium
  • continuity
  • isapi
  • milter
  • nsapi
  • phttpd
  • pi3web
  • roxen
  • thttpd
  • tux
  • webjames