PHP: Lição 2
Autor: 4luada | Publicado: 2014-03-25T20:54:00-03:00

Como continuação do meu aprendizado de PHP, resolvi usar o tutorial de um dos meus sites favoritos para HTML, CSS, Javascript e JQuery, o W3Schools. Não farei um passo a passo desta vez, apenas anotações e resumo do tutorial disponível no site.

Sintaxe

Script
Um script pode ser colocado em qualquer parte da página, e fica sempre entre as tags "&lt;?php" e "?&gt;".
Cada linha de código deve ser finalizada com um ponto-vírgula ';', assim como em javascript.
Funções, classes e palavras-chaves (if, else...) não são case-sensitive. Ou seja, "echo", "Echo" e "ECHO" são iguais. Contudo, todas as variáveis são case-sensitive

Comentários
Há três formas de se comentar um bloco de texto do código. Eles são:

// Comentário de 1 linha
#Comentário de 1 linha
/* Comentário de n linhas, sendo n &gt;= 1 */


Variáveis

Variáveis server para guardar informações. Toda variável tem o formato "$&lt;nome_da_variavel&gt;", ou seja, iniciar com um '$'. Seu nome pode ser constituído por letras, números ou '_', exceto a primeira letra, que não pode ser um número. O nome das variáveis são case-sensitive.

Não há como declarar uma variável, a não ser atribuindo um valor a ela. E não é necessário especificar o tipo de informação que essa variável irá guardar. O tipo da variável é definido pelo tipo de dado que ela está guardando no momento.

Abrangência da variável
A abrangência da variável pode variar dependendo de onde ela tiver sido declarada. Se dentro de uma função, ela é uma variável local e só poderá ser acessada dentro de tal função. Se fora de qualquer função, ela será uma variável global, e só será acessada fora de funções, a não ser que seja através de um método especial: todas as variáveis globais são guardadas numa Array especial $GLOBALS[&lt;index&gt;], e você pode acessá-las de qualquer lugar usando o nome da variável global como index. Exemplo: uma variável global $glub pode ser acessada de dentro de uma função usando $GLOBALS['glub'].

Variável estática
É um tipo de variável que persiste, mesmo depois da função terminar, de modo que, caso a função seja chamada novamente, o valor final da última chamada ainda estará mantido na variável na nova chamada.

Variáveis globais - Superglobais
Várias das variáveis pré-definidas são Superglobais, ou seja, são sempre acessíveis de qualquer lugar do código normalmente, sem precisar usar nenhum método especial. Saiba mais. São elas:
$GLOBAL - array usada para acessar variáveis globais de qualquer lugar do script, sendo a Key&nbsp;o nome da variável global.
$_SERVER - guarda informações sobre cabeçalhos, paths&nbsp;e localizações de scripts, sendo a Key&nbsp;a palavra-chave da informação procurada.
$_REQUEST - usado para coletar dados submetidos por um formulário. Quando o usuário submete dados ao clicar no botão de submit, os dados do formulário são enviados para o arquivo especificado pelo atributo action&nbsp;da tag form. E esse arquivo pode acessar os dados por essa variável global, usando o nome (atributo name) do campo do formulário como índice.
$_POST - normalmente utilizado para coletar dados de formulários cujo método é post. Ou também é usado para passar variáveis. O índice pode ser o nome do campo do formulário.
$_GET - também pode coletar dados de formulários que usam o método get. E também pode coletar valores enviados pela url.

Tipos de dados

String
Sequência de caracteres delimitados por aspas (simples ou duplas).
Strings possuem métodos próprios:

strlen(&lt;string&gt;): retorna o comprimento de uma string (número de caracteres)
strpos(&lt;string1&gt;,&lt;string2&gt;): retorna a posição da string2 na string1 (contagem a partir do zero). Se não encontrar a string2, a função irá retornar FALSE.
...(etc)...


Integer
Um número inteiro, seja positivo ou negativo. Pode ser especificado em três formatos: decimal, hexadecimal (prefixo: 0x) ou octal (prefixo: 0).

Float
Um número com parte decimal ou na forma exponencial (ex.: 2.3e3 = 2.3^3).

Boolean
Um valor booleano é TRUE (verdadeiro) ou FALSE (falso), apenas. São normalmente usados em testes condicionais.

Arrays
Uma array é capaz de guardar vários valores numa única variável, e você pode acessar cada um ao se referir a uma número de índice.
A função array() é usada para se criar uma array, e existem três tipos de arrays: índice numérico, associativo (Keys) ou multi-dimensionais (arrays que contém arrays). Para se descobrir o "comprimento" de uma array (número de elementos) de uma array, pode-se utilizar a função&nbsp;count(). Saiba mais. Dentre os métodos das Arrays, alguns servem para ordenar seus elementos (saiba mais).
Ex.: $lista = array("item 1", "item 2"); ou&nbsp;$lista[0] = "item1";
Ex.: $dict = array("key1"=&gt;"val1", "key2"=&gt;"val2"); ou $dict['key1']="val1";
(verifique o exemplo do uso de foreach() para rodar por todo $dict)
Ex.: $lista2 = array(
&nbsp; &nbsp; array("lista2-1",1,2),
&nbsp; &nbsp; array("lista2-2",2,3)
);

Objects/Class
É uma classe, uma estrutura que guarda dados (propriedades) E informações de como processar esses dados (métodos). É o único caso em que se deve ser explicitamente declarado usando a palavra-chave "class".
Ex.:
class Car {
&nbsp; &nbsp; var $color;
&nbsp; &nbsp; function Car($color="green"){
&nbsp; &nbsp; &nbsp; &nbsp; this-&gt;color = $color;
&nbsp; &nbsp; }
&nbsp; &nbsp; function what_color(){
&nbsp; &nbsp; &nbsp; &nbsp; return $this-&gt;color;
&nbsp; &nbsp; }
}

Null
Esse é um valor usado para representar que uma variável não possui valor, ou para esvaziar uma variável.

Constants
Uma variável constante que guarda um valor simples que não pode ter seu valor modificado pelo script. Ela é definida pela função define(&lt;string_name&gt;, &lt;value&gt;[, &lt;bool_case-sensitive&gt;]). O terceiro parâmetro é opcional - seu valor-padrão é FALSE, e determina se NAME==name.
Ex.: define("GREETING", "Welcome!");

Formatação
Data
Leia aqui. Há uma função date() que imprime uma data numa determinada formatação.

Operadores
Operadores Aritméticos
- Adição: '+' (ou '+=' como operador de atribuição)
- Incremento: '++&lt;var&gt;' (pré-incremento*) ou '&lt;var&gt;++' (pós-incremento*)
- Subtração: '-' (ou '-=' para operação de atrobuição)
- Decremento: '--&lt;var&gt;' (pré-decremento*) ou '&lt;var&gt;--' (pós-decremento*)
- Multiplicação: '*' (ou '*=' como operador de atribuição)
- Divisão: '/' (ou '/=' como operador de atribuição)
- Resto da divisão: '%' (ou '%=' como operador de atribuição)

* No pré-(de/in)cremento, primeiro a conta é feita e então o valor é retornado. No pós-(de/in)cremento, o valor é retornado e só depois a conta é feita.

Operadores de Strings
- Concatenação: '.' (ou '.=' como operador de atribuição)

Operadores de Comparação
- Igualdade: '==' (TRUE se valor igual)
- Identidade: '===' (TRUE&nbsp;se&nbsp;mesmo valor e mesmo tipo)
- Inegualdade: '!=' ou '&lt;&gt;' (TRUE&nbsp;se&nbsp;valores diferentes)
- Não-Identidade: '!==' (TRUE&nbsp;se&nbsp;valor diferente OU tipo diferente)
- Maioridade: '&gt;' (TRUE&nbsp;se&nbsp;maior), '&gt;=' (TRUE&nbsp;se maior ou igual)
- Minoridade: '&lt;' (TRUE&nbsp;se&nbsp;menor), '&lt;=' (TRUE&nbsp;se&nbsp;menor ou igual)

Operadores Lógicos
- 'and' ou '&amp;&amp;' (TRUE&nbsp;se ambas as expessoões forem&nbsp;TRUE)
- 'or' ou '||' (TRUE&nbsp;se pelo menos uma das expessões for&nbsp;TRUE)
- 'xor' (TRUE&nbsp;se apenas uma das expressões for&nbsp;TRUE,&nbsp;não ambas)
- '!' (TRUE&nbsp;se a expressão for FALSE)

Operadores de Arrays
- União: '+' (une duas arrays, e Keys repetidas não se sobre-escrevem)
- Igualdade: '==' (retorna TRUE se ambas arrays tiverem as mesmas Keys e valores correspondentes iguais)
- Identidade: '===' (retorna TRUE se, além dos pares Keys-valores serem iguais, os pares estiverem na mesma ordem e forem dos mesmos tipos)
- Inegualdade: '!=' ou '&lt;&gt;' (retorna TRUE se as arrays não forem iguais)
- Náo-Identidade: '!==' (retorna TRUE se as arrays não forem idênticas)

Comandos

Outputs
ECHO - pode imprimir uma ou mais strings contendo texto ou código html que será interpretado pelo browser. Seu(s) parâmetro(s) pode(m) ser:

echo $str_var;
echo "&lt;p&gt;text&lt;/p&gt;";
echo "text1", "text2", "text3";
echo "text $str_var";
echo "text {$array_var[0]}";

PRINT - imprime uma string e retorna 1 (portanto é um pouco mais lento que echo). Seus parâmetros são iguais ao do echo, exceto o terceiro caso, já que esse comando aceita apenas um único parâmetro.

Condicionais
IF()/[ELSE] - executa o bloco determinado pelo IF apenas se a condição for verdadeira, e executa o bloco do ELSE caso contrário (se especificado). Saiba mais.

SWITCH()&nbsp;- executa determinados blocos de códigos dependendo do valor atribuído à variável usada como parâmetro. Saiba mais.

Loops
[DO]/WHILE()&nbsp;- executa um bloco de código repetidamente enquanto a condição do&nbsp;WHILE&nbsp;for verdadeira. Se o&nbsp;DO&nbsp;for especificado, executa o código uma vez antes de fazer a primeira verificação, senão, faz a verificação antes mesmo da primeira execução do bloco. Saiba mais.

FOR() - é usado para rodar um código um número determinado de vezes. Existe a variância&nbsp;FOREACH(), que roda um loop para cada Key&nbsp;de uma Array.&nbsp;Saiba mais.

Includes/Require
Com os comandos include &lt;file&gt;; ou require &lt;file&gt;; é possível acrescentar scripts de PHP durante a execução. A diferença entre um e o outro é ao falhar, o primeiro produz um alerta mas o script continua executando, enquanto que o segundo gera um erro fatal e interrompe a execução.

Funções

Uma função não é executada automaticamente, mas sim, quando chamada. Ela é definida declarando-a com a palavra "function". Seu nome pode começar com letra ou '_', mas não com números, e os nomes são case-insensitive.

Argumentos
Informações passadas às funções, para variáveis locais da função. Pode-se passar inúmeros argumentos separados por vírgulas entre si.
Um argumento pode ter um valor padrão, que será adotado caso a chamada não atribua nenhum valor para o argumento.

Retorno
Pode-se usar a expressão "return" para que a função retorne um determinado valor à chamada.
Exemplo:
function &lt;nome_da_funcao&gt; ($&lt;arg&gt;, $&lt;default_arg&gt;=&lt;default_val&gt;, ...){
&nbsp; &nbsp; &lt;bloco_de_codigo&gt;
&nbsp; &nbsp; return &lt;value/arg&gt;;
}

Arquivos
fopen() - usado para abrir arquivos em determinados modos (read, write, ...). Para tratar erro ao tentar abrir o arquivo, pode-se usar OR &lt;code_tratamento&gt; na mesma linha de código. Usa-se a função fclose() para fechar um arquivo aberto. Lê-se uma linha do arquivo com a função fgets(), e pode-se ler uma letra de cada vez usando fgetc(), e é possível checar final de arquivo com a função feof(). Saiba mais sobre file system functions.

Cookies
Cookies são pequenos arquivos guardados no computador do usuário pelo servidor. Saiba mais.
setcookie() - define um cookie (deve ser usado antes da tag &lt;html&gt;). Essa função automaticamente codifica no formato URL - para prevenir isso, use a função setrawcookie().
Para acessar os cookies existentes, se utiliza a superglobal $_COOKIE. E para deletar um cookie, basta redefinir a data de validade para uma data passada.

Seções
Saiba mais.
session_start() - inicia a sessão (deve ser chamado antes da tag &lt;html&gt;).
Os dados de sessões podem ser acessados pela superglobal $_SESSION. E para se destruir uma única sessão, pode-se usar a função unset(&lt;session&gt;), ou pode-se destruir todas as sessões de uma vez com session_destroy().

Erros
Para interromper um script após o levantamento de um erro, existe a função die([&lt;error_message&gt;]). É comum também se criar funções customizadas para error handler, e de define a função de tal forma com a função:
set_error_handler(&lt;nome_da_funcao_customizada&gt;[, &lt;tipo_de_erro&gt;]) - se o tipo de erro não for especificado, a função será usada para manusear qualquer tipo de erro.
É possível levantar um erro pelo código com a função trigger_error(&lt;msg_de_erro&gt;[, &lt;tipo_de_erro&gt;]).
Quando um erro é levantado, o PHP automaticamente arquiva o log do erro (no sistema de&nbsp;logs do servidor, ou em um arquivo, dependendo de como estiver configurado em php.ini). Para arquivar o log em um arquivo específico ou um local remoto, existe a função error_log(). Saiba mais.

Exceções
Uma exceção muda o fluxo da execução do script quando um erro é levantado. Quando uma exceção é desencadeada, o estado do script é salvo, o programa irá executar o&nbsp;exception handler e depois, dependendo, o handler pode retornar ao ponto salvo do script, ou terminar a execução, ou retomar o script de um ponto diferente. Saiba mais. Os passos para se manipular uma exceção é:
1o: TRY - bloco que contém um código que pode desencadear uma exceção. Se a exceção não for ativada, a execução do script continuará normalmente, se não, a exceção será&nbsp;thrown.
2o: THROW - desencadeia uma exceção, e deve ter pelo menos um método catch.
3o: CATCH - um bloco que tratará a exceção, recebendo as informações referentes à exceção.
É possível definir uma função para manusear exceções que não têm catch, pela função set_exception_handler(&lt;funcao&gt;).

Formulários
Segurança: Método
É importante processar os dados de formulários com segurança, de forma a proteger os dados de seus usuários de hackers e spammers. Portanto, saiba quando usar $_GET e $_POST.
Informações passadas pelo método GET é visível a todos (na URL), e a quantidade de informação passada por esse método é limitada (2000 caracteres). Contudo ele permite que a página seja marcada (bookmark).
Já informações passadas por POST&nbsp;é inacessível para outros (valores são passados incorporados na solicitação da página), e o número de informações passadas é ilimitado. Além disso, o método suporta funcionalidades avançadas que podem aumentar ainda mais a segurança no envio de dados. Contudo, o método não possibilita a marcação (bookmark) da página. O método POST&nbsp;é o mais aconselhável para o envio de dados por formulário.

Validação
A página sobre validação de formulários dá várias dicas de segurança, e vale a pena dar uma relida. Citarei apenas os mais comuns ou importantes.
A função htmlspecialchars() converte caracteres especiais para o formato HTML. Isso ajuda a prevenir que hackers explorem o código, injetando códigos (cross-site scripting attacks) a formulários. Portanto, é crucial passar todas as variáveis através dessa função.
Outra coisa importante a se fazer com os dados submetidos é remover espaços em branco desnecessários (com a função trim()) e remover barras invertidas (com a função stripslashes()).

Erros e Campos obrigatórios
Pode-se verificar se um campo do formulário foi enviado vazio com a função empty().
Para se verificar se o campo possui apenas letras ou algum determinado conjunto de caracteres, pode-se usar a função preg_match(), que verifica se uma string (segundo parâmetro) segue um padrão (passado no primeiro parâmetro). Ex.: para verificar se um campo contém um e-mail válido (padrão de e-mail): preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email).

Uploading
É possível que um usuário carregue um arquivo através de um formulário. Neste caso, utiliza-se o atributo enctype na tag form para definir a o "content-type" dos dados submetidos pelo formulário. No caso de arquivos, recomenda-se usar dados binários, portanto, o valor do atributo seria "multipart/form-data". Já a entrada para se selecionar o arquivo é o &lt;input type="file"&gt;, que já apresenta um botão "browse" para se selecionar um arquivo do computador ao lado do campo.
Para se acessar o arquivo uploaded&nbsp;usa-se a superglobal $_FILE[&lt;name_of_input&gt;][&lt;atributo&gt;], sendo o atributo um dado específico do arquivo, podendo ser "name" (nome do arquivo), "type" (tipo do arquivo), "size" (tamanho em bytes do arquivo), "tmp_name" (nome da cópia temporária guardada no servidor) e "error" (código do erro levantado ao fazer o upload&nbsp;do arquivo).
O&nbsp;upload&nbsp;do arquivo cria uma cópia temporária dele na pasta temp&nbsp;do servidor, e a cópia some ao final do script. Para salvar o arquivo, é necessário copiá-lo para outro local. Primeiro, pode-se chegar se já existe uma cópia de mesmo nome com file_exists("&lt;path&gt;/&lt;file_name&gt;") que retorna um boolean. E para copiar: move_uploaded_file(&lt;temp_file&gt;,&lt;new_file&gt;).

Filtros
Filtros servem para validar, testar e filtrar dados provenientes de fontes inseguras. Deve-se SEMPRE filtrar todo e qualquer dado externo! Existem diversas funções para se filtrar dados:
filter_var() - filtra uma variável com um filtro específico
filter_var_array() - filtra várias variáveis com o mesmo ou diferentes filtros
filter_input - obtém uma variável&nbsp;input&nbsp;e a filtra
filter_input_array - obtém várias variáveis e as filtra com o mesmo ou diferentes filtros
Essas funções podem aceitar parâmetros optativos, que são as opções ou bandeiras (flags), que adicionam novas opções de filtragem. Eles devem ser arrays&nbsp;associativas (objetos) com o nome "options".
Existem dois tipos de filtros: validating e sanitizing, sendo o primeiro para validar dados submetidos seguindo regras de formatação estritas e retornando true&nbsp;ou&nbsp;false; enquanto que o segundo permitem ou proíbem caracteres específicos numa string, e sempre retorna a string.
Ainda é possível usar uma função customizada para filtrar dados usando o filtro FILTER_CALLBACK (ou usar uma função pré-existente). A função customizada é especificada como se fosse uma opção, ou seja, numa array&nbsp;associativa na chave "options". Saiba mais e veja exemplos.

E-mail
É comum se enviar dados de um formulário para um endereço de e-mail, e essa tarefa é facilitada pela função:
mail(&lt;destinatario&gt;, &lt;assunto&gt;, &lt;msg&gt;[, &lt;headers&gt;][, &lt;parametros&gt;])
Contudo, usar um hardcoded&nbsp;e-mail é vulnerável a ataques de spammers. Um meio de evitar esse problema é "filtrar" (saiba mais) os dados inseridos com:
filter_var(&lt;dado&gt;, FILTER_SANITIZE_EMAIL) - remove caracteres ilegais (para um e-mail)
filter_var(&lt;dado&gt;, FILTER_VALIDATE_EMAIL) - valida um valor como um endereço de e-mail

Fim da segunda lição
Desta vez saí da lição sabendo muito mais. Infelizmente o tutorial não tem muitas tarefas práticas. O passo seguinte será aprender MySQL para finalmente tentar fazer um projeto próprio.