PHP - PHP

PHP
PHP-logo.svg
Paradigma Multiparadigma : imperativo , funcional , orientado a objetos , procedimental , reflexivo
Projetado por Rasmus Lerdorf
Desenvolvedor A equipe de desenvolvimento de PHP, Zend Technologies
Apareceu pela primeira vez 8 de junho de 1995 ; 26 anos atrás ( 08/06/1995 )
Versão estável
8.0.11  Edite isso no Wikidata / 23 de setembro de 2021 ; 24 dias atrás ( 23 de setembro de 2021 )
Versão de visualização
8.1.0 Beta 1/22  Edite isso no Wikidata de julho de 2021 ; 2 meses atrás ( 22 de julho de 2021 )
Disciplina de digitação Dinâmico , fraco

desde a versão 7.0:

Gradual
Linguagem de implementação C (principalmente; alguns componentes C ++ )
SO Semelhante a Unix , Windows , macOS , IBM i , OpenVMS
Licença Licença PHP (a maior parte do motor Zend sob a licença Zend Engine )
Extensões de nome de arquivo .php, .phar, .phtml, .pht,.phps
Local na rede Internet www .php .net Edite isso no Wikidata
Implementações principais
Zend Engine , HHVM , PeachPie , Quercus , Parrot
Influenciado por
Perl , HTML , C , C ++ , Java , Tcl , JavaScript , Hack
Influenciado
Hack , JSP , ASP

PHP é uma linguagem de script de propósito geral voltada para o desenvolvimento web . Ele foi originalmente criado por Dinamarquês-canadense programador Rasmus Lerdorf em 1994. O PHP implementação de referência agora é produzido pelo The PHP Grupo. PHP originalmente significava Personal Home Page , mas agora significa o inicialismo recursivo PHP: Hypertext Preprocessor .

O código PHP geralmente é processado em um servidor web por um interpretador PHP implementado como um módulo , um daemon ou como um executável CGI ( Common Gateway Interface ). Em um servidor web, o resultado do código PHP interpretado e executado - que pode ser qualquer tipo de dado, como HTML gerado ou dados de imagem binários - formaria a totalidade ou parte de uma resposta HTTP . Existem vários sistemas de modelo da web , sistemas de gerenciamento de conteúdo da web e estruturas da web que podem ser empregados para orquestrar ou facilitar a geração dessa resposta. Além disso, o PHP pode ser usado para muitas tarefas de programação fora do contexto da web, como aplicativos gráficos independentes e controle de drones robóticos . O código PHP também pode ser executado diretamente na linha de comando .

O interpretador PHP padrão, desenvolvido pelo Zend Engine , é um software livre lançado sob a licença PHP . O PHP foi amplamente adaptado e pode ser implantado na maioria dos servidores da web em uma variedade de sistemas operacionais e plataformas .

A linguagem PHP evoluiu sem uma especificação ou padrão formal por escrito até 2014, com a implementação original atuando como o padrão de fato que outras implementações pretendiam seguir. Desde 2014, o trabalho continuou para criar uma especificação formal de PHP.

A W3Techs informa que, em abril de 2021, "o PHP é usado por 79,2% de todos os sites cuja linguagem de programação do lado do servidor conhecemos."

História

História antiga

Rasmus Lerdorf , que escreveu o componente Common Gateway Interface (CGI) original, junto com Andi Gutmans e Zeev Suraski , que reescreveu o analisador que formou o PHP 3.

O desenvolvimento do PHP começou em 1994, quando Rasmus Lerdorf escreveu vários programas Common Gateway Interface (CGI) em C , que ele usou para manter sua homepage pessoal . Ele os estendeu para trabalhar com formulários da web e para se comunicar com bancos de dados , e chamou essa implementação de "Home Page Pessoal / Intérprete de Formulários" ou PHP / FI.

PHP / FI pode ser usado para construir aplicações web simples e dinâmicas . Para acelerar o relatório de bugs e melhorar o código, Lerdorf anunciou inicialmente o lançamento de PHP / FI como "Personal Home Page Tools (PHP Tools) version 1.0" no grupo de discussão da Usenet comp.infosystems.www.authoring.cgi em 8 de junho de 1995 Esta versão já tinha a funcionalidade básica que o PHP possui hoje. Isso incluía variáveis ​​do tipo Perl , manipulação de formulários e a capacidade de incorporar HTML . A sintaxe se parecia com a do Perl , mas era mais simples, mais limitada e menos consistente.

Um exemplo da sintaxe anterior do PHP :

<!--include /text/header.html-->

<!--getenv HTTP_USER_AGENT-->
<!--if substr $exec_result Mozilla-->
  Hey, you are using Netscape!<p>
<!--endif-->

<!--sql database select * from table where user='$username'-->
<!--ifless $numentries 1-->
  Sorry, that record does not exist<p>
<!--endif exit-->
  Welcome <!--$user-->!<p>
  You have <!--$index:0--> credits left in your account.<p>

<!--include /text/footer.html-->

O PHP inicial não pretendia ser uma nova linguagem de programação e cresceu organicamente, com Lerdorf observando em retrospecto: "Não sei como parar isso, nunca houve qualquer intenção de escrever uma linguagem de programação [...] Eu tenho absolutamente nenhuma ideia de como escrever uma linguagem de programação, apenas continuei adicionando o próximo passo lógico no caminho. " Uma equipe de desenvolvimento começou a se formar e, após meses de trabalho e testes beta , lançou oficialmente o PHP / FI 2 em novembro de 1997.

O fato de que o PHP não foi originalmente projetado, mas em vez disso foi desenvolvido organicamente levou a nomenclatura inconsistente de funções e ordenação inconsistente de seus parâmetros. Em alguns casos, os nomes das funções foram escolhidos para corresponder às bibliotecas de nível inferior que o PHP estava "empacotando", enquanto em algumas versões anteriores do PHP o comprimento dos nomes das funções era usado internamente como uma função hash , então os nomes foram escolhidos para melhorar a distribuição de valores de hash .

PHP 3 e 4

Este é um exemplo de código PHP personalizado para o sistema de gerenciamento de conteúdo WordPress .

Zeev Suraski e Andi Gutmans reescreveram o analisador em 1997 e formaram a base do PHP 3, mudando o nome da linguagem para a sigla recursiva PHP: Hypertext Preprocessor . Posteriormente, os testes públicos do PHP 3 começaram e o lançamento oficial veio em junho de 1998. Suraski e Gutmans então começaram uma nova reescrita do núcleo do PHP, produzindo o Zend Engine em 1999. Eles também fundaram a Zend Technologies em Ramat Gan , Israel .

Em 22 de maio de 2000, o PHP 4, equipado com o Zend Engine 1.0, foi lançado. Em agosto de 2008, esta filial atingiu a versão 4.4.9. O PHP 4 não está mais em desenvolvimento e nenhuma atualização de segurança está planejada para ser lançada.

PHP 5

Em 1 de julho de 2004, o PHP 5 foi lançado, equipado com o novo Zend Engine II. O PHP 5 incluiu novos recursos, como suporte aprimorado para programação orientada a objetos , a extensão PHP Data Objects (PDO) (que define uma interface leve e consistente para acessar bancos de dados) e vários aprimoramentos de desempenho. Em 2008, o PHP 5 se tornou a única versão estável em desenvolvimento. A vinculação estática tardia não existia nas versões anteriores do PHP e foi adicionada na versão 5.3.

Muitos projetos de código aberto de alto nível deixaram de oferecer suporte ao PHP 4 no novo código a partir de 5 de fevereiro de 2008, por causa da iniciativa GoPHP5, fornecida por um consórcio de desenvolvedores de PHP promovendo a transição do PHP 4 para o PHP 5.

Com o tempo, os intérpretes de PHP tornaram-se disponíveis na maioria dos sistemas operacionais de 32 e 64 bits existentes, seja construindo-os a partir do código-fonte do PHP ou usando binários pré-construídos. Para as versões 5.3 e 5.4 do PHP, as únicas distribuições binárias disponíveis do Microsoft Windows eram compilações IA-32 de 32 bits , exigindo o modo de compatibilidade do Windows de 32 bits ao usar o Internet Information Services (IIS) em uma plataforma Windows de 64 bits. O PHP versão 5.5 disponibilizou as compilações x86-64 de 64 bits para o Microsoft Windows.

O suporte oficial de segurança para PHP 5.6 terminou em 31 de dezembro de 2018.

PHP 6 e Unicode

O PHP recebeu críticas mistas devido à falta de suporte nativo a Unicode no nível da linguagem principal. Em 2005, um projeto liderado por Andrei Zmievski foi iniciado para trazer suporte nativo a Unicode em todo o PHP, incorporando a biblioteca International Components for Unicode (ICU) e representando strings de texto como UTF-16 internamente. Uma vez que isso causaria grandes mudanças tanto na parte interna da linguagem quanto no código do usuário, foi planejado lançar isso como a versão 6.0 da linguagem, junto com outros recursos importantes então em desenvolvimento.

No entanto, a falta de desenvolvedores que entendiam as mudanças necessárias e os problemas de desempenho decorrentes da conversão de e para UTF-16, que raramente é usado em um contexto da web, levaram a atrasos no projeto. Como resultado, uma versão PHP 5.3 foi criada em 2009, com muitos recursos não Unicode retrocedidos do PHP 6, notavelmente namespaces. Em março de 2010, o projeto em sua forma atual foi oficialmente abandonado e uma versão do PHP 5.4 foi preparada contendo a maioria dos recursos não-Unicode restantes do PHP 6, como características e religação de encerramento. As esperanças iniciais eram de que um novo plano fosse formado para integração Unicode, mas em 2014 nenhum foi adotado.

PHP 7

Durante 2014 e 2015, uma nova versão principal do PHP foi desenvolvida, o PHP 7. A numeração dessa versão envolveu algum debate entre os desenvolvedores internos. Embora o experimento Unicode do PHP 6 nunca tenha sido lançado, vários artigos e títulos de livros faziam referência ao nome do PHP 6, o que poderia ter causado confusão se um novo lançamento reutilizasse o nome. Após votação, o nome PHP 7 foi escolhido.

A base do PHP 7 é um branch do PHP que foi originalmente denominado PHP da próxima geração ( phpng ). Ele foi criado por Dmitry Stogov, Xinchen Hui e Nikita Popov, e tinha como objetivo otimizar o desempenho do PHP ao refatorar o Zend Engine, mantendo a compatibilidade de linguagem quase completa. Em 14 de julho de 2014, os benchmarks baseados em WordPress , que serviram como o pacote de benchmark principal para o projeto phpng, mostraram um aumento de quase 100% no desempenho. As alterações do phpng tornam mais fácil melhorar o desempenho em versões futuras, já que estruturas de dados mais compactas e outras alterações são vistas como mais adequadas para uma migração bem-sucedida para um compilador just-in-time (JIT). Por causa das mudanças significativas, o Zend Engine reformulado foi chamado de Zend Engine 3 , sucedendo ao Zend Engine 2 usado no PHP 5.

Por causa das principais mudanças internas no phpng, ele deve receber um novo número de versão principal do PHP, ao invés de uma versão secundária do PHP 5, de acordo com o processo de lançamento do PHP. As versões principais do PHP podem quebrar a compatibilidade com versões anteriores do código e, portanto, o PHP 7 apresentou uma oportunidade para outras melhorias além do phpng que requerem quebras de compatibilidade com versões anteriores. Em particular, envolveu as seguintes mudanças:

  • Muitos mecanismos de erros de PHP legados fatais ou de nível recuperável foram substituídos por exceções orientadas a objetos modernas .
  • A sintaxe para desreferência variável foi reformulado para ser internamente consistente e mais completa, permitindo a utilização de operadores ->, [], (), {}, e ::, com manifestações do lado esquerdo significativas arbitrárias.
  • O suporte para métodos de construtor de estilo PHP 4 legado foi descontinuado.
  • O comportamento da foreachdeclaração foi alterado para ser mais previsível.
  • Construtores para as poucas classes integradas ao PHP que retornavam null em caso de falha foram alterados para lançar uma exceção em vez disso, para consistência.
  • Várias interfaces de programação de aplicativos (SAPIs) e extensões não mantidas ou obsoletas foram removidas do núcleo do PHP, principalmente a mysqlextensão legada .
  • O comportamento do list()operador foi alterado para remover o suporte para strings.
  • O suporte foi removido para delimitadores de estilo ASP legado <%e %>e <script language="php"> ... </script>.
  • Um descuido permitindo que uma instrução switch tenha várias defaultcláusulas foi corrigido.
  • O suporte para o suporte de número hexadecimal em algumas conversões implícitas de strings para tipos de número foi removido.
  • Os operadores de deslocamento para a esquerda e para a direita foram alterados para se comportar de forma mais consistente em todas as plataformas.
  • As conversões entre números de ponto flutuante e inteiros foram alteradas (por exemplo, infinito alterado para converter para zero) e implementadas de forma mais consistente nas plataformas.

O PHP 7 também incluiu novos recursos de linguagem. Mais notavelmente, ele introduziu declarações de tipo de retorno para funções que complementam as declarações de tipo de parâmetro existentes e suporte para os tipos escalares (inteiro, float, string e booleano) em declarações de tipo de parâmetro e retorno.

PHP 8

O PHP 8 foi lançado em 26 de novembro de 2020. PHP 8 é uma versão principal e tem mudanças significativas em relação às versões anteriores. Novos recursos e mudanças notáveis ​​incluem:

Compilação just-in-time

A compilação just-in-time é suportada no PHP 8.

O compilador JIT do PHP 8 pode fornecer melhorias substanciais de desempenho para alguns casos de uso. O desenvolvedor de PHP Nikita Popov afirmou que as melhorias de desempenho para a maioria dos sites serão menos substanciais do que a atualização de PHP 5 para PHP 7. As melhorias de desempenho devido à adição do compilador JIT devem ser mais substanciais para operações de tipo matemático do que para casos de uso comuns de desenvolvimento da web. Além disso, o compilador JIT oferece potencial futuro para mover algum código de C para PHP, devido às melhorias de desempenho para alguns casos de uso.

Adição da expressão de correspondência

PHP 8 introduziu a matchexpressão. A expressão de correspondência é conceitualmente semelhante a uma switchinstrução e é mais compacta para alguns casos de uso. Por matchser uma expressão, seu resultado pode ser capturado em uma variável ou retornado de uma função.

Alterações e adições de tipo

O PHP 8 introduziu tipos de união, um novo statictipo de retorno e um novo mixedtipo.

"Atributos", muitas vezes chamados de "anotações" em outras linguagens de programação, foram adicionados no PHP 8, que permitem que metadados sejam adicionados às classes.

throwfoi alterado de uma declaração para uma expressão. Isso permite que exceções sejam lançadas em lugares que não eram possíveis anteriormente.

Alterações e adições de sintaxe

O PHP 8 inclui mudanças para permitir sintaxes alternativas, mais concisas ou mais consistentes em vários cenários. Por exemplo, o operador nullsafe é semelhante ao operador null coalescing ?? , mas é usado ao chamar métodos. O seguinte snippet de código não gerará um erro se getBirthday()retornar nulo:

$human_readable_date = $user->getBirthday()?->diffForHumans();

A promoção da propriedade do construtor foi adicionada como " açúcar sintático " , permitindo que as propriedades da classe sejam definidas automaticamente quando os parâmetros são passados ​​para um construtor da classe . Isso reduz a quantidade de código clichê que deve ser escrito.

Outras pequenas alterações incluem suporte para uso de ::classem objetos, que serve como uma alternativa para o uso de get_class(); não captura capturas em blocos try-catch; ajustes de sintaxe variável para resolver inconsistências; suporte para argumentos nomeados; e suporte para vírgulas finais em listas de parâmetros, o que adiciona consistência com suporte para vírgulas finais em outros contextos, como em matrizes.

Alterações e adições à biblioteca padrão

  • Mapas fracos foram adicionados no PHP 8. A WeakMapcontém referências a objetos, mas essas referências não impedem que tais objetos sejam coletados como lixo . Isso pode fornecer melhorias de desempenho em cenários onde os dados estão sendo armazenados em cache ; isso é de particular relevância para ORMs .
  • Vários ajustes nas interfaces, como adicionar suporte para criar DateTimeobjetos a partir de interfaces e adicionar uma Stringableinterface que pode ser usada para dicas de tipo.
  • Várias novas funções incluindo str_contains (), str_starts_with () e str_ends_with (); fdiv (); get_debug_type (); e get_resource_id ()
  • Implementação de objeto de token_get_all ()

Mudanças adicionais

  • Anotações de tipo também foram adicionadas ao próprio código-fonte C do PHP para permitir que funções e métodos internos tenham "informações de tipo completas em reflexão".
  • Herança com métodos privados
  • Métodos abstratos em melhorias de características

Histórico de lançamento

Versão Data de lançamento Suportado até Notas
Versão antiga, não mais mantida: 1.0 8 de junho de 1995 Oficialmente chamado de "Ferramentas pessoais da página inicial (ferramentas PHP)". Este é o primeiro uso do nome "PHP".
Versão antiga, não mais mantida: 2.0 1 de novembro de 1997 Oficialmente denominado "PHP / FI 2.0". Este é o primeiro lançamento que realmente poderia ser caracterizado como PHP, sendo uma linguagem autônoma com muitos recursos que perduram até os dias de hoje.
Versão antiga, não mais mantida: 3,0 6 de junho de 1998 20 de outubro de 2000 O desenvolvimento passa de uma pessoa para vários desenvolvedores. Zeev Suraski e Andi Gutmans reescreveram a base para esta versão.
Versão antiga, não mais mantida: 4,0 22 de maio de 2000 23 de junho de 2001 Adicionado sistema de análise / análise de tag de dois estágios mais avançado, denominado motor Zend.
Versão antiga, não mais mantida: 4,1 10 de dezembro de 2001 12 de março de 2002 Introduzidas "superglobals" ( $_GET, $_POST, $_SESSION, etc.)
Versão antiga, não mais mantida: 4,2 22 de abril de 2002 6 de setembro de 2002 Desativado register_globalspor padrão. Os dados recebidos pela rede não são mais inseridos diretamente no namespace global , fechando possíveis brechas de segurança nos aplicativos.
Versão antiga, não mais mantida: 4,3 27 de dezembro de 2002 31 de março de 2005 Introduzida a interface de linha de comando (CLI), para complementar o CGI.
Versão antiga, não mais mantida: 4,4 11 de julho de 2005 7 de agosto de 2008 Corrigido um bug de corrupção de memória, que exigia quebrar a compatibilidade binária com extensões compiladas contra o PHP versão 4.3.x.
Versão antiga, não mais mantida: 5.0 13 de julho de 2004 5 de setembro de 2005 Zend Engine II com um novo modelo de objeto.
Versão antiga, não mais mantida: 5,1 24 de novembro de 2005 24 de agosto de 2006 Melhorias de desempenho com a introdução de variáveis ​​do compilador no PHP Engine reprojetado. Adicionados objetos de dados PHP (PDO) como uma interface consistente para acessar bancos de dados.
Versão antiga, não mais mantida: 5,2 2 de novembro de 2006 6 de janeiro de 2011 Habilitou a extensão do filtro por padrão. Suporte nativo a JSON .
Versão antiga, não mais mantida: 5,3 30 de junho de 2009 14 de agosto de 2014 Suporte a namespace ; vinculações estáticas tardias , etiqueta de salto ( goto limitado ), funções anônimas , encerramentos , arquivos PHP (phar), coleta de lixo para referências circulares, suporte Windows aprimorado , sqlite3, mysqlnd como um substituto para libmysql como biblioteca subjacente para as extensões que funcionam com MySQL , fileinfo como um substituto para mime_magic para um melhor suporte MIME , a extensão de internacionalização e descontinuação da extensão ereg.
Versão antiga, não mais mantida: 5,4 1 de março de 2012 3 de setembro de 2015 Suporte para traços , suporte para sintaxe de matriz curta. Itens removidos: register_globals, safe_mode, allow_call_time_pass_reference, , e . Servidor da web integrado. Diversas melhorias nos recursos existentes, desempenho e requisitos de memória reduzidos. session_register()session_unregister()session_is_registered()
Versão antiga, não mais mantida: 5,5 20 de junho de 2013 10 de julho de 2016 Suporte para geradores , finallyblocos para tratamento de exceções, OpCache (baseado em Zend Optimizer +) empacotado na distribuição oficial.
Versão antiga, não mais mantida: 5,6 28 de agosto de 2014 31 de dezembro de 2018 Expressões escalares constantes, funções variadas , desempacotamento de argumento, novo operador de exponenciação, extensões da useinstrução para funções e constantes, novo phpdbgdepurador como um módulo SAPI e outras melhorias menores.
6x Não lançado N / D Versão abandonada do PHP que planejava incluir suporte nativo a Unicode.
Versão antiga, não mais mantida: 7,0 3 de dezembro de 2015 10 de janeiro de 2019 Zend Engine 3 (melhorias de desempenho e suporte a inteiros de 64 bits no Windows), sintaxe de variável uniforme, processo de compilação baseado em AST , adicionado , consistência de deslocamento bit a bit entre plataformas, operador ( coalescência nula ), sintaxe de escape de ponto de código Unicode , declarações de tipo de retorno, declarações de tipo escalar (inteiro, flutuante, string e booleano), operador de comparação de três vias "nave espacial" , delegação de gerador , classes anônimas , API CSPRNG mais simples e consistente disponível , substituição de muitos "erros" internos de PHP restantes pelas exceções mais modernas e sintaxe abreviada para importar vários itens de um namespace. Closure::call()??<=>
Versão antiga, não mais mantida: 7,1 1 de dezembro de 2016 1 de dezembro de 2019 tipo de retorno nulo , modificadores de visibilidade de constante de classe
Versão antiga, não mais mantida: 7,2 30 de novembro de 2017 30 de novembro de 2020 Parâmetro de objeto e declaração de tipo de retorno, extensão Libsodium, substituição de método abstrato, ampliação de tipo de parâmetro
Versão mais antiga, mas ainda mantida: 7,3 6 de dezembro de 2018 6 de dezembro de 2021 Sintaxe flexível Heredoc e Nowdoc, suporte para atribuição de referência e desconstrução de array com list (), suporte PCRE2, função hrtime ()
Versão mais antiga, mas ainda mantida: 7,4 28 de novembro de 2019 28 de novembro de 2022 Propriedades digitadas 2.0, pré-carregamento, operador de atribuição de coalescência nula, melhorar openssl_random_pseudo_bytes, referências fracas, FFI - interface de função estrangeira , extensão hash sempre disponível, registro hash de senha, divisão de string multibyte, reflexão para referências, descompactação ext / wddx, nova serialização de objeto personalizado mecanismo
Versão estável atual: 8,0 26 de novembro de 2020 26 de novembro de 2023 Compilação Just-In-Time (JIT) , matrizes começando com um índice negativo, semântica de linguagem mais rígida / sã (validação para métodos de traços abstratos), string mais sã para comparações de números, cadeias numéricas mais sãs, TypeError em operadores aritméticos / bit a bit inválidos, reclassificação de vários erros de mecanismo, erros de tipo consistentes para funções internas, erro fatal para assinaturas de método incompatíveis), flutuação independente da localidade para conversão de string, ajustes de sintaxe variável, atributos, argumentos nomeados, expressão de correspondência, promoção de propriedade do construtor, tipos de união, tipo misto, estático tipo de retorno, operador nullsafe, capturas de não captura, expressão de lançamento, extensão JSON está sempre disponível.
Versão futura: 8,1 25 de novembro de 2021 ?? Novembro de 2024 Notação literal de inteiro octal explícito, enumerações
Lenda:
Versão antiga
Versão mais antiga, ainda mantida
Última versão
Versão de visualização mais recente
Lançamento futuro

A partir de 28 de junho de 2011, a Equipe de Desenvolvimento do PHP implementou um cronograma para o lançamento de novas versões do PHP. Nesse sistema, pelo menos um lançamento deve ocorrer a cada mês. Uma vez por ano, deve ocorrer uma pequena versão que pode incluir novos recursos. Cada versão menor deve ser suportada por pelo menos dois anos com segurança e correções de bugs, seguidos por pelo menos um ano de apenas correções de segurança, para um total de um processo de lançamento de três anos para cada versão menor. Nenhum novo recurso, a menos que pequeno e independente, deve ser introduzido em uma versão menor durante o processo de lançamento de três anos.

Mascote

O elePHPant, mascote PHP

O mascote do projeto PHP é o elePHPant , um elefante azul com o logotipo do PHP na lateral, desenhado por Vincent Pontier em 1998. "As letras (PHP) tinham a forma de um elefante se vistas de lado." O elePHPant às vezes é colorido de forma diferente quando em forma de brinquedo de pelúcia .

Muitas variações deste mascote foram feitas ao longo dos anos. Apenas os elePHPants baseados no design original de Vincent Pontier são considerados oficiais pela comunidade. Estes são colecionáveis ​​e alguns deles são extremamente raros.

Sintaxe

Um aplicativo "Hello World" em PHP 7.4 rodando em um servidor de desenvolvimento localhost

O seguinte "Hello, World!" programa é escrito em código PHP embutido em um documento HTML :

<!DOCTYPE html>
<html>
    <head>
        <title>PHP "Hello, World!" program</title>
    </head>
    <body>
        <?php
            echo '<p>Hello, World!</p>';
        ?>
    </body>
</html>

No entanto, como não existe nenhum requisito para que o código PHP seja incorporado em HTML, a versão mais simples do Hello, World! pode ser escrito assim, com a tag de fechamento omitida como preferencial em arquivos contendo código PHP puro ?>

<?php
    echo 'Hello, World!';
?>

O interpretador PHP apenas executa código PHP dentro de seus delimitadores . Qualquer coisa fora de seus delimitadores não é processado pelo PHP, embora o texto não-PHP ainda esteja sujeito às estruturas de controle descritas no código PHP. Os delimitadores mais comuns são <?phppara abrir e fechar seções PHP. A forma abreviada também existe. Este pequeno delimitador torna os arquivos de script menos portáveis, uma vez que o suporte para eles pode ser desabilitado na configuração local do PHP e, portanto, não é recomendado. Por outro lado, não há recomendação contra a tag curta echo . Antes do PHP 5.4.0, esta sintaxe curta para funciona apenas com a definição de configuração habilitada, enquanto que para o PHP 5.4.0 e posteriores ela está sempre disponível. O objetivo de todos esses delimitadores é separar o código PHP do conteúdo não PHP, como código JavaScript ou marcação HTML. Portanto, o mais curto "Olá, mundo!" programa escrito em PHP é: ?><?<?=echoshort_open_tag

<?='Hello, World!';

A primeira forma de delimitadores <?phpe , em XHTML e outros documentos XML , cria instruções de processamento XML corretamente formadas. Isso significa que a mistura resultante de código PHP e outras marcações no arquivo do lado do servidor é em si um XML bem formado. ?>

As variáveis ​​são prefixadas com um símbolo de dólar e um tipo não precisa ser especificado com antecedência. O PHP 5 introduziu declarações de tipo que permitem que funções forcem seus parâmetros a serem objetos de uma classe, matrizes, interfaces ou funções de retorno de chamada específicas . No entanto, antes do PHP 7, as declarações de tipo não podiam ser usadas com tipos escalares como inteiro ou string.

Abaixo está um exemplo de como as variáveis ​​PHP são declaradas e inicializadas.

<?php
    $name = 'John';  // variable of string type being declared and Initialized
    $age = 18;       // variable of integer type being declared and Initialized
    $height = 5.3;   // variable of double type being declared and Initialized
    echo $name . ' is ' . $height . 'm tall\n'; // concatenating variables and strings
    echo "$name is $age years old."; // interpolating variables to string
?>

Ao contrário dos nomes de funções e classes, os nomes de variáveis ​​diferenciam maiúsculas de minúsculas. As strings entre aspas duplas ("") e heredoc fornecem a capacidade de interpolar o valor de uma variável na string. O PHP trata as novas linhas como espaços em branco na forma de uma linguagem de forma livre , e as instruções são encerradas por um ponto-e-vírgula. O PHP tem três tipos de sintaxe de comentário : /* */marca bloco e comentários embutidos; //ou #são usados ​​para comentários de uma linha. A echodeclaração é uma das várias facilidades que o PHP fornece para produzir texto.

Em termos de palavras-chave e sintaxe de linguagem, o PHP é semelhante à sintaxe de estilo C. ifcondições, fore whilelaçadas, e retorno da função são semelhantes em sintaxe para línguas tais como C, C ++, C #, Java e Perl.

Tipos de dados

PHP é digitado livremente . Ele armazena inteiros em um intervalo dependente da plataforma, quer como 32, 64 ou 128 bits assinado número inteiro equivalente ao longo tipo da linguagem C . Inteiros sem sinal são convertidos em valores com sinal em certas situações, o que é um comportamento diferente de muitas outras linguagens de programação. Variáveis ​​inteiras podem ser atribuídas usando notações decimais (positivas e negativas), octais , hexadecimais e binárias .

Os números de ponto flutuante também são armazenados em um intervalo específico da plataforma. Eles podem ser especificados usando notação de ponto flutuante ou duas formas de notação científica . PHP tem um tipo booleano nativo que é semelhante aos tipos booleanos nativos em Java e C ++ . Usando as regras de conversão de tipo booleano, valores diferentes de zero são interpretados como verdadeiros e zero como falsos, como em Perl e C ++.

O tipo de dados nulo representa uma variável sem valor; NULLé o único valor permitido para este tipo de dados.

Variáveis ​​do tipo "recurso" representam referências a recursos de fontes externas. Eles são normalmente criados por funções de uma extensão específica e só podem ser processados ​​por funções da mesma extensão; os exemplos incluem recursos de arquivo, imagem e banco de dados.

Os arrays podem conter elementos de qualquer tipo que o PHP pode manipular, incluindo recursos, objetos e até mesmo outros arrays. A ordem é preservada em listas de valores e em hashes com chaves e valores, e os dois podem ser misturados. O PHP também suporta strings , que podem ser usadas com aspas simples, aspas duplas, nowdoc ou sintaxe heredoc .

A Standard PHP Library (SPL) tenta resolver problemas padrão e implementa interfaces e classes eficientes de acesso a dados.

Funções

O PHP define uma grande variedade de funções na linguagem central e muitas também estão disponíveis em várias extensões; essas funções estão bem documentadas na documentação online do PHP . No entanto, a biblioteca interna possui uma ampla variedade de convenções de nomenclatura e inconsistências associadas, conforme descrito no histórico acima.

As funções personalizadas podem ser definidas pelo desenvolvedor:

function myAge(int $birthYear): string
{
    // calculate the age by subtracting the birth year from the current year.
    $yearsOld = date('Y') - $birthYear;

    // return the age in a descriptive string.
    return $yearsOld . ' year' . ($yearsOld != 1 ? 's':'');
}

echo 'I am currently ' . myAge(1995) . ' old.';

Em 2021, a saída do programa de amostra acima é 'Atualmente, tenho 26 anos'.

Em vez de ponteiros de função , as funções em PHP podem ser referenciadas por uma string contendo seu nome. Desta forma, as funções normais do PHP podem ser usadas, por exemplo, como callbacks ou dentro de tabelas de função . As funções definidas pelo usuário podem ser criadas a qualquer momento sem serem prototipadas . As funções podem ser definidas dentro de blocos de código, permitindo uma decisão em tempo de execução quanto a se uma função deve ou não ser definida. Existe uma function_existsfunção que determina se uma função com um determinado nome já foi definida. As chamadas de função devem usar parênteses, com exceção das funções construtoras de classe de argumento zero chamadas com o operador PHP new, caso em que os parênteses são opcionais.

Até o PHP 5.3, o suporte para funções anônimas e fechamentos não existia no PHP. Embora create_function()exista desde o PHP 4.0.1, é apenas um invólucro fino eval()que permite que funções normais do PHP sejam criadas durante a execução do programa. PHP 5.3 adicionou sintaxe para definir uma função anônima ou " fechamento " que pode capturar variáveis ​​do escopo circundante. Sintaxe de seta abreviada foi adicionada no PHP 7.4:

function getAdder($x) {
    return fn($y) => $x + $y;
}

$adder = getAdder(8);
echo $adder(2); // prints "10"

No exemplo acima, a getAdder()função cria um encerramento usando o argumento passado $x(a palavra-chave useimporta uma variável do contexto léxico), que recebe um argumento adicional $ye retorna o encerramento criado para o chamador. Essa função é um objeto de primeira classe, o que significa que pode ser armazenada em uma variável, passada como parâmetro para outras funções, etc.

Excepcionalmente para uma linguagem de tipagem dinâmica, o PHP suporta declarações de tipo em parâmetros de função, que são impostos em tempo de execução. Isso tem sido suportado para classes e interfaces desde o PHP 5.0, para arrays desde o PHP 5.1, para "chamáveis" desde o PHP 5.4 e tipos escalares (inteiro, float, string e booleano) desde o PHP 7.0. O PHP 7.0 também possui declarações de tipo para tipos de retorno de função, expressas colocando o nome do tipo após a lista de parâmetros, precedido por dois pontos. Por exemplo, a getAdderfunção do exemplo anterior pode ser anotada com tipos como no PHP 7:

function getAdder(int $x): Closure
{
    return fn(int $y): int => $x + $y;
}

$adder = getAdder(8);
echo $adder(2); // prints "10"
echo $adder(null); // throws an exception because an incorrect type was passed
$adder = getAdder([]); // would also throw an exception

Por padrão, as declarações de tipo escalar seguem princípios de tipificação fracos. Assim, por exemplo, se o tipo de um parâmetro for int, o PHP permitiria não apenas inteiros, mas também strings numéricas conversíveis, flutuantes ou booleanos serem passados ​​para aquela função, e os converteria. No entanto, o PHP 7 tem um modo de "digitação estrita" que, quando usado, não permite tais conversões para chamadas de função e retornos dentro de um arquivo.

Objetos PHP

Funcionalidades básicas de programação orientada a objetos foram adicionadas no PHP 3 e melhoradas no PHP 4. Isso permitiu que o PHP ganhasse mais abstração, tornando as tarefas criativas mais fáceis para os programadores que usam a linguagem. O tratamento de objetos foi completamente reescrito para o PHP 5, expandindo o conjunto de recursos e melhorando o desempenho. Nas versões anteriores do PHP, os objetos eram tratados como tipos de valor . A desvantagem desse método era que o código tinha que fazer uso pesado das variáveis ​​de "referência" do PHP se quisesse modificar um objeto ao qual foi passado, em vez de criar uma cópia dele. Na nova abordagem, os objetos são referenciados por identificador e não por valor.

O PHP 5 introduziu variáveis e métodos de membros privados e protegidos , junto com classes abstratas , classes finais , métodos abstratos e métodos finais . Ele também introduziu uma maneira padrão de declarar construtores e destruidores , semelhante àquela de outras linguagens orientadas a objetos, como C ++ , e um modelo de tratamento de exceção padrão . Além disso, o PHP 5 adicionou interfaces e permitiu a implementação de várias interfaces. Existem interfaces especiais que permitem que os objetos interajam com o sistema de tempo de execução. Os objetos que implementam ArrayAccess podem ser usados ​​com a sintaxe de array e os objetos que implementam Iterator ou IteratorAggregate podem ser usados ​​com a foreach construção da linguagem . Não há recurso de tabela virtual no mecanismo, portanto, as variáveis ​​estáticas são vinculadas a um nome em vez de uma referência em tempo de compilação.

Se o desenvolvedor criar uma cópia de um objeto usando a palavra reservada clone, o motor Zend verificará se um __clone()método foi definido. Caso contrário, ele chamará um padrão __clone()que copiará as propriedades do objeto. Se um __clone()método for definido, ele será o responsável por definir as propriedades necessárias no objeto criado. Por conveniência, o mecanismo fornecerá uma função que importa as propriedades do objeto de origem, para que o programador possa começar com uma réplica por valor do objeto de origem e apenas substituir as propriedades que precisam ser alteradas.

A visibilidade de propriedades e métodos PHP é definida de acordo com as palavras-chave public , privatee protected. O padrão é público, se apenas var for usado; varé sinônimo de public. Os itens declarados publicpodem ser acessados ​​em qualquer lugar. protectedlimita o acesso às classes herdadas (e à classe que define o item). privatelimita a visibilidade apenas para a classe que define o item. Objetos do mesmo tipo têm acesso aos membros privados e protegidos uns dos outros, embora não sejam a mesma instância.

Exemplo

A seguir está um exemplo básico de programação orientada a objetos no PHP 8:

<?php

abstract class User
{
    protected string $name;

    public function __construct(string $name)
    {
        // make first letter uppercase and the rest lowercase
        $this->name = ucfirst(strtolower($name));
    }

    public function greet(): string
    {
        return "Hello, my name is " . $this->name;
    }

    abstract public function job(): string;
}

class Student extends User
{
    public function __construct(string $name, private string $course)
    {
        parent::__construct($name);
    }

    public function job(): string
    {
        return "I learn " . $this->course;
    }
}

class Teacher extends User
{
    public function __construct(string $name, private array $teachingCourses)
    {
        parent::__construct($name);
    }

    public function job(): string
    {
        return "I teach " . implode(", ", $this->teachingCourses);
    }
}

$students = [
    new Student("Alice", "Computer Science"),
    new Student("BOB", "Computer Science"),
    new Student("Charlie", "Business Studies"),
];

$teachers = [
    new Teacher("Dan", ["Computer Science", "Information Security"]),
    new Teacher("Erin", ["Computer Science", "3D Graphics Programming"]),
    new Teacher("Frankie", ["Online Marketing", "Business Studies", "E-commerce"]),
];

foreach ([$students, $teachers] as $users) {
    echo $users[0]::class . "s:\n";

    array_walk($users, function (User $user) {
        echo "{$user->greet()}, {$user->job()}\n";
    });
}

// Output of program:
// Students:
// Hello, my name is Alice, I learn Computer Science
// Hello, my name is Bob, I learn Computer Science
// Hello, my name is Charlie, I learn Business Studies
// Teachers:
// Hello, my name is Dan, I teach Computer Science, Information Security
// Hello, my name is Erin, I teach Computer Science, 3D Graphics Programming
// Hello, my name is Frankie, I teach Online Marketing, Business Studies, E-commerce

Implementações

A única implementação completa do PHP é a original, conhecida simplesmente como PHP. É o mais amplamente usado e é alimentado pelo Zend Engine . Para separá-lo de outras implementações, às vezes é chamado não oficialmente de "Zend PHP". O Zend Engine compila o código - fonte PHP dinamicamente em um formato interno que pode ser executado, portanto, funciona como um intérprete . É também a "implementação de referência" do PHP, já que o PHP não tem especificação formal e, portanto, a semântica do Zend PHP define a semântica do PHP. Devido à semântica complexa e matizada do PHP, definida pela forma como Zend funciona, é difícil para implementações concorrentes oferecer compatibilidade completa.

O modelo de execução de solicitação única por script do PHP, e o fato de que o Zend Engine é um intérprete, leva à ineficiência; como resultado, vários produtos foram desenvolvidos para ajudar a melhorar o desempenho do PHP. Para acelerar o tempo de execução e não ter que compilar o código-fonte do PHP sempre que a página da web for acessada, os scripts de PHP também podem ser implantados no formato interno do mecanismo de PHP usando um cache de opcode , que funciona armazenando em cache a forma compilada de um script PHP (opcodes) na memória compartilhada para evitar a sobrecarga de análise e compilação do código toda vez que o script é executado. Um cache de opcode, Zend Opcache , é integrado ao PHP desde a versão 5.5. Outro exemplo de cache opcode amplamente usado é o Alternative PHP Cache (APC), que está disponível como uma extensão PECL .

Enquanto Zend PHP ainda é a implementação mais popular, várias outras implementações foram desenvolvidas. Alguns deles são compiladores ou suportam a compilação JIT e, portanto, oferecem benefícios de desempenho em relação ao Zend PHP às custas da falta de compatibilidade total do PHP. Implementações alternativas incluem o seguinte:

  • HHVM (HipHop Virtual Machine) - desenvolvido no Facebook e disponível como código aberto, ele converte o código PHP em um bytecode de alto nível (comumente conhecido como uma linguagem intermediária ), que é então traduzido em código de máquina x86-64 dinamicamente em tempo de execução por um compilador just-in-time (JIT), resultando em melhorias de desempenho de até 6 ×. No entanto, desde a versão 7.2, o Zend superou o HHVM, e o HHVM 3.24 é a última versão a oferecer suporte oficial ao PHP.
  • Parrot  - uma máquina virtual projetada para rodar linguagens dinâmicas com eficiência; O Pipp transforma o código-fonte do PHP na representação intermediária do Parrot , que é então traduzido para o bytecode do Parrot e executado pela máquina virtual.
  • PeachPie - um compilador de segunda geração para. Bytecode NET Common Intermediate Language (CIL), construído na plataforma Roslyn ; sucessor de Phalanger, compartilhando vários componentes arquitetônicos
  • Phalanger  - compila PHP em bytecode Common Intermediate Language (CIL); antecessor do PeachPie
  • Quercus  - compila PHP em bytecode Java
  • HipHop  - desenvolvido no Facebook e disponível como código aberto, transforma os scripts PHP em código C ++ e compila o código resultante, reduzindo a carga do servidor em até 50%. No início de 2013, o Facebook o substituiu em favor do HHVM por vários motivos, incluindo dificuldades de implantação e falta de suporte para toda a linguagem PHP, incluindo os construtos create_function()e eval().

Licenciamento

PHP é um software livre lançado sob a Licença PHP , que estipula que:

Os produtos derivados deste software não podem ser chamados de "PHP", nem "PHP" pode aparecer em seus nomes, sem permissão prévia por escrito de group@php.net. Você pode indicar que seu software funciona em conjunto com PHP dizendo " Foo para PHP" em vez de chamá-lo de "PHP Foo" ou "phpfoo".

Esta restrição no uso de "PHP" torna a Licença PHP incompatível com a Licença Pública Geral (GPL), enquanto a Licença Zend é incompatível devido a uma cláusula de publicidade semelhante à da licença BSD original .

Desenvolvimento e comunidade

O PHP inclui várias bibliotecas gratuitas e de código aberto em sua distribuição de código-fonte ou as usa em compilações binárias de PHP. PHP é fundamentalmente um sistema de Internet com módulos embutidos para acessar servidores File Transfer Protocol (FTP) e muitos servidores de banco de dados, incluindo PostgreSQL , MySQL , Microsoft SQL Server e SQLite (que é um banco de dados embutido), servidores LDAP e outros . Várias funções familiares aos programadores C, como as da família stdio , estão disponíveis em compilações PHP padrão.

O PHP permite que os desenvolvedores escrevam extensões em C para adicionar funcionalidade à linguagem PHP. As extensões do PHP podem ser compiladas estaticamente no PHP ou carregadas dinamicamente no tempo de execução. Inúmeras extensões foram escritas para adicionar suporte para a API do Windows , gerenciamento de processos em sistemas operacionais semelhantes ao Unix , strings multibyte ( Unicode ), cURL e vários formatos de compactação populares . Outros recursos PHP disponibilizados por meio de extensões incluem integração com IRC , geração dinâmica de imagens e conteúdo Adobe Flash , PHP Data Objects (PDO) como uma camada de abstração usada para acessar bancos de dados e até mesmo síntese de voz . Algumas das funções centrais da linguagem, como aquelas que lidam com strings e arrays, também são implementadas como extensões. O projeto PHP Extension Community Library (PECL) é um repositório para extensões para a linguagem PHP.

Alguns outros projetos, como Zephir , fornecem a capacidade de extensões PHP serem criadas em uma linguagem de alto nível e compiladas em extensões PHP nativas. Tal abordagem, em vez de escrever extensões PHP diretamente em C, simplifica o desenvolvimento de extensões e reduz o tempo necessário para programação e teste.

Em dezembro de 2018, o PHP Group era formado por dez pessoas: Thies C. Arntzen , Stig Bakken , Shane Caraveo , Andi Gutmans , Rasmus Lerdorf , Sam Ruby , Sascha Schumann , Zeev Suraski , Jim Winstead e Andrei Zmievski .

A Zend Technologies fornece uma Certificação PHP baseada no exame PHP 7 (e anteriormente baseada em PHP 5.5) para que os programadores se tornem desenvolvedores PHP certificados.

Instalação e configuração

Exemplo de saída da função phpinfo () no PHP 7.1

Existem duas maneiras principais de adicionar suporte para PHP a um servidor web - como um módulo de servidor web nativo ou como um executável CGI. PHP tem uma interface de módulo direta chamada Server Application Programming Interface (SAPI), que é suportada por muitos servidores web, incluindo Apache HTTP Server , Microsoft IIS , Netscape (agora extinto) e iPlanet . Alguns outros servidores web, como OmniHTTPd, apoiar o Internet Server Application Programming Interface (ISAPI), que é um Microsoft interface do módulo de servidor web 's. Se o PHP não tem suporte de módulo para um servidor web, ele sempre pode ser usado como uma Interface de Gateway Comum (CGI) ou processador FastCGI ; nesse caso, o servidor web é configurado para usar o executável CGI do PHP para processar todas as solicitações de arquivos PHP.

PHP-FPM (FastCGI Process Manager) é uma implementação FastCGI alternativa para PHP, incluída na distribuição oficial do PHP desde a versão 5.3.3. Quando comparada com a implementação FastCGI mais antiga, ela contém alguns recursos adicionais, principalmente úteis para servidores da web altamente carregados.

Ao usar o PHP para scripts de linha de comando, um executável de interface de linha de comando (CLI) PHP é necessário. O PHP suporta uma interface de programação de aplicativo de servidor CLI (SAPI) desde o PHP 4.3.0. O foco principal deste SAPI é desenvolver aplicativos shell usando PHP. Existem algumas diferenças entre o CLI SAPI e outros SAPIs, embora eles compartilhem muitos dos mesmos comportamentos.

PHP tem uma interface de módulo direta chamada SAPI para diferentes servidores web; no caso do PHP 5 e Apache 2.0 no Windows, ele é fornecido na forma de um arquivo DLL chamado php5apache2.dll , que é um módulo que, entre outras funções, fornece uma interface entre o PHP e o servidor web, implementado de uma forma que o servidor entende. Este formulário é conhecido como SAPI.

Existem diferentes tipos de SAPIs para várias extensões de servidor da web. Por exemplo, além dos listados acima, outros SAPIs para a linguagem PHP incluem a Common Gateway Interface (CGI) e a interface de linha de comando (CLI).

O PHP também pode ser usado para escrever aplicativos de interface gráfica do usuário (GUI) para desktop , usando a extensão PHP-GTK . O PHP-GTK não está incluído na distribuição oficial do PHP e, como uma extensão, pode ser usado apenas com as versões 5.1.0 e mais recentes do PHP. A maneira mais comum de instalar o PHP-GTK é compilando-o do código-fonte.

Quando o PHP é instalado e usado em ambientes de nuvem , kits de desenvolvimento de software (SDKs) são fornecidos para usar recursos específicos de nuvem. Por exemplo:

Várias opções de configuração são suportadas, afetando os principais recursos e extensões do PHP. O arquivo de configuração php.inié pesquisado em diferentes locais, dependendo da forma como o PHP é usado. O arquivo de configuração é dividido em várias seções, enquanto algumas das opções de configuração também podem ser definidas na configuração do servidor web.

Usar

Uma ampla visão geral do pacote de software LAMP, exibido aqui junto com o Squid

PHP é uma linguagem de script de propósito geral, especialmente adequada para o desenvolvimento da web do lado do servidor , caso em que o PHP geralmente é executado em um servidor da web . Qualquer código PHP em um arquivo solicitado é executado pelo tempo de execução do PHP, geralmente para criar conteúdo dinâmico de página da web ou imagens dinâmicas usadas em sites ou em outro lugar. Ele também pode ser usado para scripts de linha de comando e aplicativos de interface gráfica do usuário (GUI) do lado do cliente . O PHP pode ser implementado na maioria dos servidores web, muitos sistemas operacionais e plataformas e pode ser usado com muitos sistemas de gerenciamento de banco de dados relacional (RDBMS). A maioria dos provedores de hospedagem na web oferece suporte a PHP para uso por seus clientes. Ele está disponível gratuitamente e o Grupo PHP fornece o código-fonte completo para que os usuários criem, personalizem e estendam para seu próprio uso.

Página da web dinâmica: exemplo de script do lado do servidor (PHP e MySQL)

Originalmente projetado para criar páginas da web dinâmicas , o PHP agora se concentra principalmente em scripts do lado do servidor e é semelhante a outras linguagens de script do lado do servidor que fornecem conteúdo dinâmico de um servidor da web para um cliente , como o ASP.NET da Microsoft , Sun Microsystems ' JavaServer Pages , e . PHP também atraiu o desenvolvimento de muitos frameworks de software que fornecem blocos de construção e uma estrutura de design para promover o desenvolvimento rápido de aplicativos (RAD). Alguns deles incluem PRADO , CakePHP , Symfony , CodeIgniter , Laravel , Yii Framework , Phalcon e Laminas , oferecendo recursos semelhantes a outros frameworks web . mod_perl

A arquitetura LAMP se tornou popular na indústria da web como uma forma de implementação de aplicativos da web. PHP é comumente usado como P neste pacote junto com Linux , Apache e MySQL , embora o P também possa se referir a Python , Perl ou alguma combinação dos três. Pacotes semelhantes, WAMP e MAMP , também estão disponíveis para Windows e macOS , com a primeira letra representando o respectivo sistema operacional. Embora o PHP e o Apache sejam fornecidos como parte da instalação básica do macOS, os usuários desses pacotes procuram um mecanismo de instalação mais simples que possa ser atualizado com mais facilidade.

Para cenários de uso específicos e mais avançados, o PHP oferece uma maneira bem definida e documentada de escrever extensões personalizadas em C ou C ++ . Além de estender a própria linguagem na forma de bibliotecas adicionais , as extensões estão fornecendo uma maneira de melhorar a velocidade de execução onde ela é crítica e há espaço para melhorias usando uma linguagem verdadeiramente compilada . O PHP também oferece maneiras bem definidas de se embutir em outros projetos de software. Dessa forma, o PHP pode ser facilmente usado como uma linguagem de script interna para outro projeto, também fornecendo uma interface estreita com as estruturas de dados internas específicas do projeto .

O PHP recebeu críticas mistas devido à falta de suporte para multithreading no nível da linguagem central, embora o uso de threads seja possível pela extensão PECL "pthreads" .

Uma interface de linha de comando, php-cli, e dois motores de script ActiveX Windows Script Host para PHP foram produzidos.

Estatísticas de popularidade e uso

PHP é usado para sistemas de gerenciamento de conteúdo da Web, incluindo MediaWiki , WordPress , Joomla , Drupal , Moodle , eZ Publish , eZ Platform e SilverStripe .

Os sites que usam PHP incluem Facebook , Digg , Dailymotion e Tumblr .

Em janeiro de 2013, o PHP era usado em mais de 240 milhões de sites (39% da amostra) e estava instalado em 2,1 milhões de servidores web .

Em março de 2021, PHP era usado como linguagem de programação do lado do servidor em 79,1% dos sites, contra 83,5% anteriormente, onde a linguagem podia ser determinada, e PHP 7 é a versão mais usada da linguagem com 50,3% de todos sites na web estão usando essa versão.

Segurança

Em 2019, 11% de todas as vulnerabilidades listadas pelo National Vulnerability Database estavam vinculadas ao PHP; historicamente, cerca de 30% de todas as vulnerabilidades listadas desde 1996 neste banco de dados estão ligadas ao PHP. Falhas técnicas de segurança da própria linguagem ou de suas bibliotecas centrais não são frequentes (22 em 2009, cerca de 1% do total, embora o PHP se aplique a cerca de 20% dos programas listados). Reconhecendo que os programadores cometem erros, algumas linguagens incluem verificação de contaminação para detectar automaticamente a falta de validação de entrada que induz a muitos problemas. Esse recurso está sendo desenvolvido para PHP, mas sua inclusão em uma versão foi rejeitada várias vezes no passado.

Existem patches de proteção avançados, como Suhosin e Hardening -Patch, especialmente projetados para ambientes de hospedagem na web.

Historicamente, as versões antigas do PHP tinham alguns parâmetros de configuração e valores padrão para tais configurações de tempo de execução que tornavam alguns aplicativos PHP sujeitos a problemas de segurança. Entre estes, magic_quotes_gpce register_globalsdiretivas de configuração foram os mais conhecidos; o último tornava qualquer parâmetro de URL em variáveis ​​PHP, abrindo um caminho para vulnerabilidades de segurança sérias, permitindo que um invasor defina o valor de qualquer variável global não inicializada e interfira na execução de um script PHP. O suporte para configurações de " aspas mágicas " e "registrar globais" foi descontinuado desde o PHP 5.3.0 e removido do PHP 5.4.0.

Outro exemplo da vulnerabilidade potencial de configurações de tempo de execução vem da falha em desabilitar a execução do PHP (por exemplo, usando a enginediretiva de configuração) para o diretório onde os arquivos carregados são armazenados; ativá-lo pode resultar na execução de código malicioso embutido nos arquivos carregados. A melhor prática é localizar o diretório da imagem fora da raiz do documento disponível para o servidor da web e servi-lo por meio de um script intermediário ou desabilitar a execução do PHP para o diretório que armazena os arquivos carregados.

Além disso, habilitar o carregamento dinâmico de extensões PHP (via enable_dldiretiva de configuração) em um ambiente de hospedagem web compartilhado pode levar a problemas de segurança.

Conversões de tipo implícitas que resultam em valores diferentes sendo tratados como iguais, às vezes contra a intenção do programador, podem levar a problemas de segurança. Por exemplo, o resultado da comparação '0e1234' == '0'é true, porque strings que são analisáveis ​​como números são convertidas em números; neste caso, o primeiro valor comparado é tratado como notação científica com o valor (0 × 10 1234 ), que é zero. Erros como esse resultaram em vulnerabilidades de autenticação no Simple Machines Forum , Typo3 e phpBB quando os hashes de senha MD5 foram comparados. A forma recomendada é usar hash_equals () (para segurança de ataque de temporização ), ou o operador de identidade ( ), como resultados em . strcmp==='0e1234' === '0'false

Em uma análise de mais de 170.000 2.013 invasões de sites , publicado pelo Zone-H , a técnica utilizada com maior frequência (53%) foi a exploração da vulnerabilidade inclusão de arquivos , principalmente relacionadas ao uso inseguro das construções de linguagem PHP include, requiree allow_url_fopen.

Em abril de 2021, a W3Techs relatou que 64% dos sites que usam PHP usam as versões 7.2 ou anteriores (que não são mais suportadas pela Equipe de Desenvolvimento de PHP) com 35% de todos os sites PHP usando a versão 5.6 ou anteriores.

A versão 5 ainda é usada por 24,5% de todos os sites (setembro de 2021). É altamente recomendado migrar para a versão 7 ou 8 do PHP e usar random_int () ao invés de rand () ou mt_rand (). Existem dois ataques que podem ser executados sobre fontes de entropia do PHP: "Seed Attack" e "State recovery attack". Com as tecnologias atuais de GPU, um invasor pode realizar até 2 ^ 30 cálculos MD5 por segundo com uma GPU de $ 250, enquanto com um adicional de $ 500 pode chegar a até 2 ^ 32 cálculos. Em combinação com o " Ataque de aniversário ", isso pode levar a sérias vulnerabilidades de segurança.

Veja também

Referências

Leitura adicional

Ouça este artigo ( 35 minutos )
Ícone falado da Wikipedia
Este arquivo de áudio foi criado a partir de uma revisão deste artigo datada de 23 de novembro de 2011 e não reflete as edições subsequentes. ( 2011-11-23 )

links externos