PHP (um acrônimo recursivo para "PHP: Hypertext Preprocessor", originalmente Personal Home Page) é uma linguagem interpretadalivre, usada originalmente apenas para o desenvolvimento de aplicações presentes e atuantes no lado do servidor, capazes de gerar conteúdo dinâmico na World Wide Web.[2] Figura entre as primeiras linguagens passíveis de inserção em documentos HTML, dispensando em muitos casos o uso de arquivos externos para eventuais processamentos de dados. O código é interpretado no lado do servidor pelo módulo PHP, que também gera a página web a ser visualizada no lado do cliente. A linguagem evoluiu, passou a oferecer funcionalidades em linha de comando, e além disso, ganhou características adicionais, que possibilitaram usos adicionais do PHP, não relacionados a web sites. É possível instalar o PHP na maioria dos sistemas operacionais, gratuitamente. Concorrente direto da tecnologia ASP pertencente à Microsoft, o PHP é utilizado em aplicações como o MediaWiki, Facebook, Drupal, Joomla!, WordPress, Magento e o Oscommerce.
Criado por Rasmus Lerdorf em 1995, o PHP tem a produção de sua implementação principal, referência formal da linguagem, mantida por uma organização chamada The PHP Group. O PHP é software livre, licenciado sob a PHP License, uma licença incompatível com a GNU General Public License (GPL) devido a restrições no uso do termo PHP.
História
A linguagem foi criada em 1994 e o código fonte do PHP só foi liberado em 1995, como um pacote de programas CGI criados por Rasmus Lerdorf, com o nome Personal Home Page Tools, para substituir um conjunto de scripts Perl que ele usava no desenvolvimento de sua página pessoal. Em 1997 foi lançado o novo pacote da linguagem com o nome de PHP/FI, trazendo a ferramenta Forms Interpreter, um interpretador de comandosSQL. Mais tarde, Zeev Suraski desenvolveu o analisador do PHP 3 que contava com o primeiro recurso de orientação a objetos, que dava poder de alcançar alguns pacotes, tinha herança e dava aos desenvolvedores somente a possibilidade de implementar propriedades e métodos.[3][4] Pouco depois, Zeev e Andi Gutmans, escreveram o PHP 4, abandonando por completo o PHP 3, dando mais poder à máquina da linguagem e maior número de recursos de orientação a objetos. O problema sério que apresentou o PHP 4 foi a criação de cópias de objetos, pois a linguagem ainda não trabalhava com apontadores ou handlers, como são as linguagens Java, Ruby e outras. O problema fora resolvido na versão 5 do PHP, que já trabalha com handlers. Caso se copie um objeto, na verdade copiaremos um apontador, pois, caso haja alguma mudança na versão original do objeto, todas as outras também sofrem a alteração, o que não acontecia na PHP 4.[5]
Trata-se de uma linguagem extremamente modularizada, o que a torna ideal para instalação e uso em servidores web. Diversos módulos são criados no repositório de extensões PECL (PHP Extension Community Library) e alguns destes módulos são introduzidos como padrão em novas versões da linguagem. É muito parecida, em tipos de dados, sintaxe e mesmo funções, com a linguagem C e com a C++. Pode ser, dependendo da configuração do servidor, embarcada no código HTML. Existem versões do PHP disponíveis para os seguintes sistemas operacionais: Windows, Linux, FreeBSD, Mac OS, OS/2, AS/400, Novell Netware, RISC OS, AIX, IRIX e Solaris.
Construir uma página dinâmica baseada em bases de dados é simples com PHP, (em parte, vale lembrar), este provê suporte a um grande número de bases de dados: Oracle, Sybase, PostgreSQL, InterBase, MySQL, SQLite, MSSQL,
Firebird, etc., podendo abstrair o banco com a biblioteca ADOdb, entre outras. A Wikipédia funciona sobre um software inteiramente escrito em PHP, usando bases de dados MySQL: o MediaWiki.[5]
PHP tem suporte aos protocolos: IMAP, SNMP, NNTP, POP3, HTTP, LDAP, XML-RPC, SOAP. É possível abrir sockets e interagir com outros protocolos. E as bibliotecas de terceiros expandem ainda mais estas funcionalidades. Existem iniciativas para utilizar o PHP como linguagem de programação de sistemas fixos. A mais notável é a PHP-GTK. Trata-se de um conjunto do PHP com a biblioteca GTK, portada do C++, fazendo assim softwares inter-operacionais entre Windows e Linux. Na prática, essa extensão tem sido muito pouco utilizada para projetos reais.[5]
O acrônimo recursivo PHP representa um elefante, que é conhecido como o mascote da linguagem.
Produtos derivados deste software não devem ser chamado de PHP, nem pode conter "PHP" em seu nome, sem prévia permissão por escrito da [email protected]. Você pode indicar que o software funciona em conjunto com o PHP, dizendo "Foo para PHP", em vez de chamá-lo "PHP Foo" ou "phpfoo".
PHP recebeu diversas críticas por não ter suporte nativo a Unicode.[8][9] Em 2005, um projeto liderado por Andrei Zmievski foi iniciado para trazer esse dito suporte ao PHP através da incorporação da biblioteca International Components for Unicode (ICU) para poder passar-se a usar a codificação UTF-16.[10] Uma vez que isso causaria grandes mudanças tanto no código fonte como para o usuário, foi planejado lançá-la na versão 6.0 em conjunto com outros importantes recursos, então em desenvolvimento, em vez da 5.5.[11]
Entretanto, devido a falta de desenvolvedores que entendessem as mudanças necessárias e problemas de desempenho decorrentes da conversão para UTF-16, que raramente é usado em um contexto web, levou a atrasos no projeto. Como resultado, o PHP 5.3 foi lançado em 2009, sem total suporte ao Unicode, mas contendo algumas das novidades que seriam lançadas no PHP 6.0. Em março de 2010, o projeto em sua forma atual foi oficialmente abandonado, e uma versão 5.4 do PHP foi feita ainda sem total suporte a Unicode, também contendo as novidades que seriam lançadas no PHP 6.0.[12] Esperanças iniciais eram de que um novo plano seria formado para ter a integração Unicode, mas a partir de 2014 nenhum foi adotado.
Durante os anos, antes do lançamento do PHP 5.3 e 5.4, alguns livros foram publicados com base no conjunto de recursos esperado de PHP 6.0, incluindo o suporte a Unicode e os recursos que depois foram trazidos para outros lançamentos. Há, portanto, algum debate sobre se uma nova versão principal do PHP, com ou sem suporte a Unicode, deve ser chamado de "PHP 6", ou se a nomenclatura deve ser ignorado para evitar confusão.
O desenvolvimento passou a ser feito por vários desenvolvedores em colaboração. Zeev Suraski e Andi Gutmans reescreveram toda a base do PHP nesta versão.
A register_globals passou agora a estar desativada por padrão. Dados recebidos via rede são mais inseridos no escopo de variável global, fechando possíveis brechas de segurança.[15]
Melhorias na performance com a introdução de variáveis de compilação na reengenharia do motor PHP.[17] Adicionada biblioteca PHP Data Objects (PDO) como uma nova interface de acesso aos bancos de dados.[18][19]
Suporte a espaço de nomes (namespace), vinculação de nomes (late static bindings), rótulos de salto de código (goto limitado), clausura nativa, arquivos PHP nativos (phar), coletor de lixo para referências circulares, suporte ao Windows melhorado, sqlite3, mysqlnd em substituição a libmysql como biblioteca de extensão de trabalho com MySQL, fileinfo em substituição ao mime_magic para um melhor suporte ao MIME, extensão de internacionalização, e descontinuidade da extensão ereg.[21]
Suporte à trait, suporte a uma versão mais curta na sintaxe de vetores. Items removidos: register_globals, safe_mode, allow_call_time_pass_reference, session_register(), session_unregister() and session_is_registered(). Servidor web embutido.[22]. Várias melhorias nas fucionalidades já existentes e na performance. Redução dos requerimentos de memória.[23]
Expressões escalares constantes, funções variádicas, desempacotamento de argumento, novo operador de exponenciação, extensões da instrução use para funções e constantes, novo depurador phpdbg como um módulo SAPI e outras melhorias menores.[25]
6.x
Não foi lançada
—
—
Versão abandonada do PHP que planejava incluir suporte nativo ao Unicode.
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 árvore sintática abstrata, adicionado Closure::call(), 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 boolean), operador de comparação de três vias "nave espacial" <=>, delegação de gerador, classes anônimas, API CSPRNG mais simples e disponível de maneira mais consistente, substituição de muitos "erros" internos restantes do PHP pelas exceções mais modernas e sintaxe abreviada para importar vários itens de um espaço de nomes.[26]
Propriedades tipadas 2.0, pré-carregamento, operador de atribuição de coalescência nula, openssl_random_pseudo_bytes melhorada, referências fracas, FFI - interface de função externa, extensão hash sempre disponível, registro de hash de senha, divisão de string multibyte, reflexão para referências, remoção de ext/wddx, novo mecanismo de serialização de objeto personalizado.[30]
Compilação Just-In-Time (JIT), arrays começando com um índice negativo, semântica de linguagem mais rígida/sã (validação para métodos de traços abstratos), comparações de string para números mais sãs, strings 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), conversão de float para string independente de localidade, ajustes de sintaxe variável, atributos, argumentos nomeados, expressão de correspondência, promoção de propriedade do construtor, tipos em união, tipo misto, tipo de retorno static, operador nullsafe, non-capturing catches, expressão throw, extensão JSON está sempre disponível.[31]
Notação literal de inteiro octal explícita, enumerações, propriedades somente leitura, sintaxe chamável de primeira classe, new em inicializadores, tipos de interseção puros, tipo de retorno never, restrições de classe final, fibers.[32]
Classes apenas-leitura,[33] null, false, e true como tipos independentes de bool,[34][35] conversão de maiúsculas/minúsculas independente de localidade[36]
Legenda:
Versão antiga
Versão mais antiga, ainda mantida
Versão mais recente
Versão de prévia mais recente
Lançamento futuro
Principais características
A linguagem PHP é uma linguagem de programação de domínio específico, ou seja, seu escopo se estende a um campo de atuação que é o desenvolvimento web, embora tenha variantes como o PHP-GTK. Seu propósito principal é de implementar soluções web velozes, simples e eficientes[37]. Características:
Server-side (O cliente manda o pedido e o servidor responde em página HTML)
Exemplo 1 - Vetores e matrizes
Os vetores e matrizes em PHP, diferente do que ocorre em C/C++ e Pascal, são estruturas dinâmicas, o que pode facilitar muito o trabalho do programador.
Um exemplo:
<?php$vet01=array();$vet01[]="Sistemas operacionais";$vet01[]="Compiladores";$vet01[]="Bancos de dados";$vet02=array(1,2,3,4,5);$vet03=array(0=>0,2=>3,10=>"item 10");$vet04=['valor 1','string 2',3,4.0,false];$vet05=["chave1"=>'valor 1',2,3,4,array('item 1',2=>0.5)];for($i=0;$i<count($vet01);$i++){echo$vet01[$i]."<br />";}?>
O exemplo acima demonstra cinco maneiras diferentes de declarar vetores, sendo que os índices não são obrigatórios, e se declarados não precisam ser apenas números ou mesmo sequenciais.
Os exemplos $vet04 e $vet05 mostram que é possível misturar tipos de dados dentro do vetor, sendo que no $vet05 mostra que em qualquer posição do vetor é possível declarar um outro vetor, resultando em uma matriz.
Exemplo 2 - Teste de Conexão
O exemplo abaixo testa se há conexão com o banco de dados.
<?php// Conexão com o banco de dados$host="localhost";$db="nome-database";$user="root";$pass="";$con=mysql_connect($host,$user,$pass);if(mysql_select_db($db,$con)){echo"conexao bem sucedida";//Teste para garantir que há conexão}else{echo"conexao falhou";}?>
Exemplo 3 - Teste de Login
O exemplo abaixo testa se usuário está com login no banco de dados.
<?php// função verifica se o login está feitofunctionchecaLogin($login,$status){if(isset($login['login'])){if(!empty($login['login'])and($status['status']==false)){$aviso='Você não está logado, faça o login para continuar';$status=false;echo$aviso;die();}}else{$status['status']=true;$aviso='Você está logado';echo$aviso;}}?>
Exemplo 4 - Função Dias da Semana
O exemplo abaixo conforme a data atual, obtém os dias da semana.
<?phpdate_default_timezone_set("Brazil/São Paulo");functiondiasemana($data){$d=explode('/',$data);$anohoje=$d[2];$meshoje=$d[1];$diahoje=$d[0];$diasemana=date("w",mktime(0,0,0,$meshoje,$diahoje,$anohoje));switch($diasemana){case"0":$diasemana="Domingo";break;case"1":$diasemana="Segunda Feira";break;case"2":$diasemana="Terça Feira";break;case"3":$diasemana="Quarta Feira";break;case"4":$diasemana="Quinta Feira";break;case"5":$diasemana="Sexta Feira";break;case"6":$diasemana="Sabado";break;}return"$diasemana";}echo'<h1>',diasemana('20/05/2017'),' - Dia da Semana ','</h1>';?>
PHP 5
Em junho de 2004 foi lançada a versão 5 do PHP, introduzindo um novo modelo de orientação a objeto, incluindo a reformulação dos construtores e adição de destrutores (ver exemplo contextualizado em anexo), visibilidade de acesso, abstração de objeto e interfaces de objetos.[40]
O tratamento de objetos do PHP foi completamente reescrito, permitindo um desempenho melhor e mais vantagens. Enquanto na versão anterior era preciso muito esforço para atender à orientação a objetos e aos padrões de projectos (alguns não eram possíveis), o PHP 5 veio para sanar essa deficiência. Ainda sofre nesse sentido, contudo, por problemas devido a ser uma linguagem de tipagem fraca.[40]
Indução de tipo
Nesse sentido, foi adicionada uma característica chamada de indução de tipo, de acordo com a qual podemos ter uma certa tipagem quando passamos objetos aos parâmetros de uma função (ou método), algo inconcebível na versão anterior. Ver exemplo contextualizado em anexo.[carece de fontes?]
Visibilidade
A visibilidade de uma propriedade ou método pode ser definida com os seguintes modificadores de acesso: public, protected ou private. Itens declarados como públicos podem ser acessados pelo objeto (instância da classe). Membros protegidos estão acessíveis às classes filhas (herdadas). A visibilidade privada limita a apenas a classe que define o atributo ou método. Ver exemplo contextualizado em anexo.[carece de fontes?]
No polimorfismo paramétrico, um mesmo objeto pode ser utilizado uniformemente como parâmetro em diferentes contextos sem necessidade de alterações. Um método que exibe polimorfismo paramétrico (também chamada de método genérico) permite que o tipo do seu argumento seja determinado por um parâmetro de tipo implícito ou explícito, executando uma mesma operação, independente do tipo do argumento. O PHP não requer (ou suporta) a definição de tipo explícita na declaração de variáveis: o tipo de uma variável é determinado pelo:[carece de fontes?]
contexto em que a variável é utilizada. Isto significa que, se você atribuir um valor string para a variável $var, $var se torna uma string
Se você então atribuir um valor inteiro para $var, ela se torna um inteiro. Por isso o PHP não adota este tipo de polimorfismo, pois não possui parâmetros genéricos
Polimorfismo por Inclusão
No polimorfismo por inclusão um objeto pode ser visto como pertencendo a diferentes classes que não precisam ser disjuntas.
O PHP adota esse tipo de polimorfismo, pois é uma linguagem orientada a objeto que permite recursos de herança[41][42].
Polimorfismo por Coerção
O PHP também suporta o polimorfismo por coerção, no qual a linguagem dispõe de uma operação semântica para converter um argumento para um tipo esperado por uma função, em uma situação que de outra forma resultaria em um erro de tipo.[carece de fontes?]
MELO, Alexandre Altair de; NASCIMENTO, Mauricio G. F (2007). PHP Profissional. Aprenda a desenvolver sistemas profissionais orientados a objetos com padrões de projeto 1 ed. São Paulo: Novatec. 464 páginas. ISBN978-85-7522-141-9 !CS1 manut: Nomes múltiplos: lista de autores (link)
Herbert G. Fisher, PHP Guia de Consulta Rápida, Editora Novatec, ISBN 85-85184-69-8