PHP: Todos os artigos do TutsUP relacionados com PHP. Tutoriais, dicas, configurações, scripts e muito mais. Venha aprender mais sobre PHP.

Aprender PHP pode ser algo um pouco complexo até que o desenvolvedor iniciante tenha total habilidade para criar sua própria aplicação sem depender de frameworks ou bibliotecas externas. Por este motivo, venho escrevendo tudo o que sei sobre a linguagem no TEO (Todo Espaço Online) para que iniciantes não tenha tanta dificuldade na sua iniciação.

É claro que para aqueles que desejam aprender, livros irão ajudar bastante, mas aqui no TEO você poderá deixar sua opinião, tirar dúvidas, criticar, enfim, é a Internet e aqui você é quem manda.

Até o momento já escrevi mais de 50 aula, mas como o desenvolvimento nunca para, provavelmente aparecerão mais aulas ao longo do curso, portanto, salve este link nos seus favoritos e sempre de uma revisada aqui para ver se tem algo novo.

Observação: Fiz o mesmo com JavaScript em Venha aprender JavaScript de graça.

Sem mais delongas, abaixo deixo o link para todas as aulas já escritas até o momento.

Aprender PHP grátis

Seguem os links para que você possa aprender PHP de graça:

  • Introdução ao PHP – Aula 1 – Para iniciar nosso minicurso de PHP grátis, farei uma introdução ao PHP e explicarei como criar e executar seu primeiro arquivo em um servidor que roda PHP.
  • Aspas, comentários e echo em PHP – Aula 2 – Para dar continuidade em nossas aulas, vamos entender como exibir algo utilizando o comando echo em PHP. Também veremos como utilizar aspas adequadamente.
  • Variáveis em PHP – Aula 3 – Variáveis em PHP: continuando com nosso curso sobre PHP, hoje você vai aprender a criar e manipular variáveis, uma das partes mais utilizadas da linguagem.
  • Constantes em PHP – Aula 4 – Semelhantes às variáveis, constantes em PHP são objetos para reter e representar valores, porém, uma vez definidas, não podem ser modificadas. Saiba mais.
  • Tipos de dados em PHP – Aula 5 – Veja as diferenças entre os tipos de dados em PHP. Vamos falar sobre valores booleanos, inteiros, números de ponto flutuante, strings, arrays e demais.
  • Arrays em PHP – Aula 6 – Arrays em PHP são mapas que relacionam valores para chaves. É possível usá-los como arrays, listas, pilhas, filas e até mais. Entenda mais sobre os eles.
  • Operadores aritméticos em PHP – Aula 7 – Os operadores aritméticos em PHP são os mesmos que aprendemos no tempo da escola: mais, menos, divisão e subtração (+, -, /, -). Aprenda mais sobre eles.
  • Operadores de atribuição em PHP – Aula 8 – Operadores de atribuição em PHP são os que configuram o valor da direita para o operando da esquerda. Aprenda a utilizá-los, do básico ao avançado, agora.
  • Operadores de comparação em PHP – Aula 9 – Operadores de comparação em PHP servem para comparar se valores são iguais, diferentes, maiores ou menores, e assim por diante. Aprenda comparação em PHP.
  • Operador de controle de erros em PHP – Aula 10 – O operador de controle de erros em PHP é o @ (arroba). Se você precisa esconder algum erro, basta acioná-lo antes da expressão. Veja como é simples.
  • Operadores lógicos em PHP – Aula 11 – Operadores lógicos em PHP verificam comparações entre expressões que retornam valores verdadeiros e/ou falsos. Acesse e aprenda a utilizar lógica em PHP.
  • Operadores de Incremento e Decremento em PHP – Aula 12 – Operadores de Incremento e Decremento em PHP são dois sinais de mais (++) ou menos (–), que incrementam em 1 o valor da expressão. Saiba mais sobre eles.
  • Operador de execução em PHP – Aula 13 – O acento grave é um operador de execução em PHP, tudo o que estiver entre ` e `, é considerado como comando executado no servidor. Veja como utilizá-lo.
  • Operadores bit-a-bit em PHP – Aula 14 – Operadores bit-a-bit em PHP trabalham em um nível de abstração bem mais baixo, diretamente com a representação binária do valor. Saiba como utilizá-los.
  • If, else e elseif em PHP – Aula 15 – If, else e elseif em PHP são desvios condicionais para controlar o fluxo do código. Com eles é possível executar ações baseadas em condições. Aprenda mais.
  • Switch em PHP – Aula 16 – Switch em PHP é utilizado para desvios condicionais (assim como if, else e elseif). Com ele é possível executar ações baseadas em condições. Aprenda mais.
  • Laço While em PHP – Aula 17 – O laço while em PHP é bastante simples, enquanto a expressão avaliada for verdadeira (true) a ação é executada. Aprenda como utilizar while em PHP agora.
  • Laço do while em PHP – Aula 18 – O laço do while em PHP é utilizado para que uma ação seja executada enquanto um ação seja avaliada como verdadeira. Aprenda como isso funciona na prática.
  • Laço for em PHP – Aula 19 – For em PHP é utilizado para executar ações repetidas de acordo com três expressões: valor, expressão verdadeira e alteração do valor inicial. Saiba mais.
  • Laço foreach em PHP – Aula 20 – Foreach em PHP nos fornece uma opção para percorrer todas as chaves e valores de um array. Além disso, também funciona com objetos. Aprenda mais a respeito.
  • $_POST em PHP – Aula 21 – $_POST em PHP é uma variável superglobal que recebe dados do que é postado por formulários HTML que utilizam o método post. Aprenda a manipular tais dados.
  • $_GET em PHP – Aula 22 – $_GET em PHP é um array associativo de valores passados ao seu código pelo HTTP GET. Normalmente, links de nossas páginas dinâmicas utilizam $_GET. Confira.
  • $_COOKIES em PHP – Aula 23 – $_Cookies em PHP é uma forma de trocar dados entre o navegador e o servidor, colocado num arquivo criado no computador do cliente para manter sessões HTTP.
  • $_SESSION em PHP – Aula 24 – $_SESSION em PHP são sessões que permitem salvar dados ($variáveis) durante a visita do cliente. Os dados podem ser permanentes até o navegador ser fechado.
  • Datas em PHP – date, mktime, time – Aula 25 – Aprenda a trabalhar com datas em PHP utilizando as funções date, mktime e time. Você verá como criar datas em todos os formatos, nacionais e internacionais.
  • Como validar formulários em PHP – Aula 26 – Neste artigo, vamos ver como é simples validar formulários em PHP. Trataremos campos como email, URL, campos em branco, números e mais. Leia e aprenda.
  • Crie tabelas e bases de dados no phpMyAdmin – Aula 27 – Para iniciarmos com o PDO em PHP, devemos primeiro aprender a criar tabelas e bases de dados no phpMyAdmin – a forma mais simples para gerenciamento de BDs.
  • PDO em PHP – Aula 28 – PDO é uma classe que representa a conexão entre o PHP e a base de dados. Neste tutorial você vai aprender a manipular dados de BDs MySQL com a PDO Class.
  • Sistema de login simples com PHP – Aula 29 – Aprenda como criar um sistema de login simples com PHP. Vamos utilizar tudo o que você aprendeu até hoje em nossas aulas, como PDO, $_SESSION e formulários.
  • Expressões regulares em PHP – Aula 30 – Expressões regulares em PHP são uma forma de encontrar ou substituir trechos de texto em variáveis. Aprenda como manipular qualquer valor em seu código PHP.
  • Funções em PHP – Aula 31 – Funções em PHP são excelentes para criar trechos de código encapsulado e reutilizável para realizar pequenas e grandes tarefas em sua aplicação. Saiba mais.
  • Como criar classes em PHP – Aula 32 – Aprenda como criar classes em PHP e comece a criar seus programas com orientação a objetos. Essa é a primeira de muitas aulas sobre PHP Orientado a Objetos.
  • Herança e polimorfismo em PHP – Aula 33 – Veja como funciona herança e polimorfismo em PHP Orientado a Objetos. Crie subclasses (classes derivadas) que herdam propriedades e métodos de superclasses.
  • Abstração de Classes em PHP – Aula 34 – Abstração de Classes em PHP consiste em criar classes modelo para outras classes. Métodos abstratos deverão ser configurados nas subclasses. Saiba mais…
  • Membros de classes PHP – Na aula sobre membros de classes PHP, você vai aprender a utilizar constantes de classe e propriedades e métodos estáticos em superclasses e subclasses.
  • Associação, agregação e composição em classes PHP – Aula 36 – Em orientação a objetos, associação, agregação e composição referem-se à maneira como os objetos se relacionam entre si. Aprenda como isso funciona em PHP.
  • Métodos mágicos em classes PHP – Aula 37 – Métodos mágicos em PHP são métodos que são invocados quando tentamos utilizar ou manipular propriedades e métodos em classes e objetos. Veja como funciona.
  • Interfaces de Objetos em PHP – Aula 38 – Interfaces de Objetos em PHP são entidades que possuem métodos definidos sem corpo. Classes originadas dessa interface deverão implementar seus métodos.
  • __clone: Criando clones de objetos em PHP – Aula 39 – Veja como é simples criar clones de objetos PHP com “clone” e o método “__clone”. É uma excelente prática para facilitar sua vida enquanto desenvolvedor.
  • __autoload: Incluir classes automaticamente em PHP – Aula 40 – Crie uma função __autoload para carregar suas classes PHP automaticamente, assim você não precisa incluir o arquivo quando precisar da mesma. Saiba mais.
  • Objetos dinâmicos em PHP – Aula 41 – É possível criar propriedades de classe e objetos dinâmicos em PHP, ou seja, criar objetos sem criar uma classe antes, ou classes sem definir propriedades.
  • Manipulando erros em PHP – Aula 42 – Maneiras para configurar e gerenciar erros em PHP. Parte muito importante do seu código, tanto para feedback para usuário/desenvolvedor quanto para segurança.
  • Serialização e desserialização de dados PHP – Aula 43 – Serialização e desserialização de dados PHP: Salve estruturas de dados (array, objeto, etc) no BD como string e consiga recuperá-los em seu formato original
  • Como eliminar valores nulos de array em php – Aula 44 – Veja como é simples eliminar valores nulos de array em php utilizando a função array_filter. Veja também como recriar as chaves com valores numéricos.
  • Implode e Explode em PHP – Aula 45 – Aprenda a utilizar implode e explode em PHP para dividir um Array em string com algum divisor, ou criar um Array de uma string a partir de um valor divisor.
  • Namespaces em PHP – Aula 46 – Namespaces em PHP são utilizados para evitar colisões de nomes. Aprenda a utilizar este recurso e crie códigos mais robustos no seu novo projeto PHP.
  • Ler ou escrever arquivos com PHP – Aula 47 – Veja como ler ou escrever arquivos com PHP para realizar tarefas simples sem ter a necessidade de utilizar um SGBD (MySQL, PostgreSQL, ou qualquer outro).
  • Upload de imagens com PHP – Aula 48 – Veja como criar um formulário simples para upload de imagens com PHP. Suporta arquivos múltiplos e valida algumas informações sobre a imagem enviada.
  • printf e sprintf em PHP – Aula 49 – printf e sprintf em PHP são funções para exibir strings formatadas na tela, ou seja, mostram valores dependendo de diretivas para tratar tais valores. Saiba mais.
  • vprintf e vsprintf em PHP – Aula 50 – vprintf e vsprintf em PHP são funções para exibir ou criar um array formatado. Ambas as funções fazem o mesmo que printf e sprintf, porém, com arrays.
  • call_user_func e call_user_func_array em PHP – Aula 51 – call_user_func e call_user_func_array servem para executar funções dinamicamente no PHP. Muito útil quando não sabemos o nome da função a ser executada.
  • Upload de arquivos via FTP com PHP – Aula 52 – Neste artigo você vai aprender a fazer upload de arquivos via FTP com PHP utilizando as funções nativas que a linguagem nos oferece. É bastante útil, confira.
  • Como redimensionar imagens com PHP – Aula 53 – Veja como redimensionar imagens com PHP utilizando a extensão GD da linguagem. No final apresentarei uma classe para facilitar seu trabalho com imagens.
  • Exceções em PHP – Aula 54 – Exceções em PHP trouxeram uma nova maneira para manipular erros no seu código de uma maneira voltada para a programação orientada a objetos (OOP).

Até então são essas aulas que temos prontas, mas conforme descrevi, o desenvolvimento nunca para, portanto, poderão existir novidades no futuro.

Aulas extra

Abaixo algumas aulas extra para você aprimorar ainda mais no PHP:

Utilizando a estrutura MVC com PHP

  • Utilizando estrutura MVC em PHP – Parte 1 – Veja como criar uma aplicação com estrutura MVC em PHP. Vamos criar um sistema simples, com usuários, permissões e um sistema de notícias básico.
  • Utilizando estrutura MVC em PHP – Parte 2 – Para dar continuidade à nossa série de artigos sobre MVC em PHP, vamos falar sobre várias classes que geram a estrutura do nosso sistema. Veja como funciona.
  • Utilizando estrutura MVC em PHP – Parte 3 – Na parte 3 do nosso desenvolvimento de uma aplicação com estrutura MVC em PHP, vamos analisar o restante das nossas classes mais importantes do sistema.
  • Utilizando estrutura MVC em PHP – Parte 4 – Na quarta parte da série de tutoriais sobre a estrutura MVC em PHP, vamos criar a parte de cadastro de usuários, login e partes restritas no sistema.
  • Utilizando estrutura MVC em PHP – Parte 5 – Na última parte da criação da nossa aplicação com estrutura MVC em PHP, vamos criar um sistema de notícias extremamente simples, com imagem, título e texto.

Validar CPF e CNPJ com PHP

  • Classe para validar e formatar CPF e CNPJ em PHP – Classe perfeita para validar e formatar CPF e CNPJ em PHP. Fácil de utilizar e funciona perfeitamente com qualquer tipo de CPF/CNPJ, mesmo os já formatados.
  • Como validar CPF com PHP – Aprenda como fazer o cálculo para validar CPF com PHP. Também vou passar uma função pronta para reutilização em todos os seus formulários com campos de CPF.
  • Como validar CNPJ com PHP – Veja como fazer o cálculo para validar CNPJ com PHP. Também vou passar uma função pronta para reutilização em todos os seus formulários com campos de CNPJ.

Concluindo

Este é um daqueles artigos que não tem uma conclusão, ou seja, pode ser atualizado sem aviso prévio. Minha recomendação é que você salve o link em seus favoritos e sempre volte para ver se mudou algo. Além disso, acho que você tem bastante trabalho a fazer com a quantidade de material que deixei disponível para você.

Este curso é totalmente gratuito, caso queira me pagar um café, sinta-se à vontade em doar qualquer quantia que preferir no link abaixo:

Muito obrigado!

Os tipos de dados são praticamente idênticos em várias linguagens de programação, porém, você vai encontrar algumas diferenças no PHP que elevam ainda mais a facilidade de sua utilização.

Primeiramente, não é necessário declarar explicitamente que um valor é de determinado tipo. É possível criar uma variável com qualquer valor em tempo de execução do código; o interpretador do PHP vai declarar a variável e o tipo de valor que essa variável carrega.

Por exemplo:

<?php
// Declaro uma variável com tipo de dado string
$variavel = 'Um valor qualquer';

Nota: Quando estamos escrevendo códigos em PHP e sabemos que não vamos precisar incluir HTML após o código que acabamos de escrever, não é necessário utilizar a tag de fechamento do PHP ?>. Existem alguns benefícios em torno da não utilização dessa tag, veja mais detalhes.

Como você pôde ver no trecho de código acima, criei uma variável com um valor qualquer em uma única linha de código (fora o comentário); ela foi declarada com um valor do tipo string automaticamente pelo interpretador do PHP (vamos falar sobre isso no decorrer do artigo).

Os tipos de dados em PHP são úteis por vários motivos em seu script; algumas vezes para saber se é um valor numérico ou para comparar valores entre duas variáveis; noutras por questões de segurança e prevenção de SQL Injection; enfim, poderíamos ficar aqui o dia todo criando uma infinidade de cenários, porém, o importante é que você entenda que é extremamente necessário saber o que são, como criar e como verificar se determinado valor é de determinado tipo na hora da execução do seu script.

Tipos de dados em PHP

O PHP suporta oito tipos de dados primitivos e três pseudo-tipos:

Tipos básicos

  • boolean
  • integer
  • float (número de ponto flutuante, ou também double)
  • string

Tipos compostos

  • Arrays
  • Objetos

Tipos especiais

  • resource
  • NULL

Pseudo-tipos

  • mixed
  • number
  • callback

Vamos ver mais detalhes sobre cada um dos tipos abaixo.

Boolean (Booleanos)

Este é o tipo de dado mais simples que uma variável pode receber em PHP, true (verdadeiro) ou false (false).

Para criar uma variável com valor booleano, simplesmente escreva qualquer um dos dois valores da maneira que preferir, já que o interpretador do PHP não faz distinção entre letras maiúsculas e minúsculas para as palavras chave true e false.

<?php
$variavel = True; // Verdadeiro
$variavel = TRUE; // Verdadeiro
$variavel = true; // Verdadeiro
$variavel = false; // Falso
$variavel = False; // Falso
$variavel = FALSE; // Falso

Perceba que as palavras chave não devem vir entre aspas.

Além disso, qualquer valor em PHP é automaticamente convertido em true ou false quando necessário.

Uma variável será considerada falsa (false) quando ela:

  • for o próprio booleano FALSE;
  • for 0 (zero);
  • for 0.0 (zero ponto zero);
  • for um valor vazio ou “0”;
  • for um array sem elementos;
  • for um objeto sem elementos membros;
  • for NULL (incluindo variáveis não definidas);
  • for o objeto SimpleXML criado de tags vazias

Diferente disso qualquer outro valor é considerado verdadeiro (true), incluindo números negativos.

Você pode verificar se uma variável é verdadeira ou falsa simplesmente utilizando a estrutura de controle if (que você verá posteriormente neste curso).

<?php
// Cria uma variável
$variavel = 'Oi';

// Verifica se a variável é verdadeira
if ( $variavel ) {
	echo $variavel;
}

No trecho acima, a variável tem o valor Oi (verdadeiro). O comando de controle de estrutura if vai verificar se ela é verdadeira ou falsa; caso verdadeira, mostra seu valor na tela do usuário; caso falsa, não faz nada.

Integers (Inteiros)

Os integers (int) são todos os números negativos e positivos, mais o número zero (…-2, -1, 0, 1, 2…).

São os números inteiros (do conjunto Z).

Não é necessário utilizar aspas ou apóstrofos para criar uma variável com um número inteiro em PHP:

<?php
$variavel = -15542;

Números negativos devem ser representados com um sinal negativo no início; números positivos não precisam receber sinal algum (opcionalmente, você pode adicionar um sinal de mais):

$variavel = -15542; // Negativo
$variavel = 15542; // Positivo

Os números inteiros podem ser especificados em notação decimal (base 10), hexadecimal (base 16) ou octal (base 8), porém, para usar a notação octal, é necessário começar o número com um 0 (zero). Para utilizar a notação hexadecimal, inicie o número com 0x.

Exemplos:

<?php
$variavel = +1234; // número positivo
$variavel = -1234; // número negativo
$variavel =  0123; // número octal (83 em decimal)
$variavel =  0x1A; // número hexadecimal (26 em decimal)

Float (Números de ponto flutuante)

Números de ponto flutuante (também chamados de “floats”, “doubles” ou “números reais”), são números que trazem o ponto para separar a parte inteira da parte fracionária.

Em PHP, qualquer um dos exemplos abaixo é válido:

<?php
$variavel = 1.234; 
$variavel = 1.2e3; 
$variavel = 7E-10;

Strings

Uma string é uma série de caracteres misturados incluídos entre aspas ou apóstrofos.

Por exemplo:

$variavel = 'Um frase é uma string'; // String
$variavel = 'Uma palavra com um número (10) também'; // String
$variavel = 'TRUE'; // String
$variavel = 'false'; // String

Todos os exemplos acima são do tipo string.

Arrays e Objetos

Como ainda não falamos sobre arrays e objetos em nossos artigos sobre PHP, não fará muito sentido detalhar trechos de código aqui, porém, entenda que arrays são mapas  que relacionam valores com chaves. Um array pode carregar vários tipos de dados diferentes, incluindo outros arrays.

Objetos são parecidos com arrays, no entanto, eles são recursos para a programação orientada a objetos (algo que você vai entender um pouco mais adiante, se continuar seguido nossos artigos).

Resource (Recurso)

Um recurso é uma variável especial que mantém uma referência a um recurso externo (por exemplo, uma conexão MySQL, etc). Recursos são criados e usados por funções especiais que podem ser encontradas aqui.

NULL (Nulo)

Valor NULL é um valor que não tem valor nenhum (hum ?), ou, representam variáveis vazias.

Uma variável é considerada NULL se:

  • ela foi criada com a constante NULL.
$variavel = NULL;
  • ela ainda não recebeu nenhum valor.
<?php
function funcao() {
	static $variavel; // NULL
}
  • ela foi apagada com unset()
<?php
$variavel = 'Oi';
unset( $variavel ); // NULL

Pseudo-tipo mixed

O Pseudo-tipo mixed indica que um parâmetro pode aceitar vários (mas não necessariamente todos) os tipos de dados.

Pseudo-tipo number

number indica que um parâmetro pode ser tanto um integer (número inteiro) quanto float (número de ponto flutuante).

Pseudo-tipo callback

São funções que podem ser definidas por usuários e passadas como parâmetros para outras funções do PHP.

gettype: descubra o tipo

Para saber qual o tipo de uma variável, você pode utilizar a função gettype do PHP, veja:

<?php
$variavel = 'Oi';

echo gettype( $variavel ); // string

No exemplo acima, executei o comando echo do PHP, com a função gettype, na variável que havia criado. O valor retornado foi “string”.

Os possíveis valores retornados serão:

  • “boolean”
  • “integer”
  • “double” (por razões históricas “double” é retornado no caso de float, e não simplesmente “float”)
  • “string”
  • “array”
  • “object”
  • “resource”
  • “NULL”
  • “unknown type”

Modificando os tipos de dados em PHP

Em alguns casos não será possível saber qual o tipo de valor que uma variável vai retornar, no entanto, você pode forçar o interpretador do PHP para tratar o valor conforme necessário.

Por exemplo: suponhamos que eu precise de um valor inteiro em uma variável cujo valor será retornado por um campo que o usuário digitar em um input no navegador de Internet. Se este valor deve (obrigatoriamente) ser inteiro, eu posso fazer com que o PHP converta o mesmo utilizando (int) ou (integer).

Veja um exemplo:

<?php
// Uma frase número e uma frase
$variavel = '2254: Olá!';

// O valor é convertido para inteiro
echo (int)$variavel; // Exibe: 2254

Eu posso fazer isso com qualquer tipo de valor, veja as possibilidades:

  • (int), (integer) – converte para inteiro
  • (bool), (boolean) – converte para booleano
  • (float), (double), (real) – converte para número de ponto flutuante
  • (string) – converte para string
  • (binary) – converte para string binária (PHP 6)
  • (array) – converte para array
  • (object) – converte para objeto
  • (unset) – converte para NULL (PHP 5)

Exemplos:

<?php
// Uma frase número e uma frase
$variavel = '2254.54 : Olá!';

echo (int)$variavel; // Exibe: 2254
echo (bool)$variavel; // Exibe: 1 (verdadeiro)
echo (float)$variavel; // Exibe: 2254.54
echo (string)$variavel; // Exibe: 2254.54 : Olá!

print_r( (array)$variavel ); // Exibe: Array ( [0] => 2254.54 : Olá! )
var_dump( (object)$variavel ); // Exibe: object(stdClass)#1 (1) { ["scalar"]=> string(15) "2254.54 : Olá!" } 

unset($variavel); // Não exibe nada

Vídeo tutorial

O vídeo tutorial abaixo é um complemento ao texto acima:

Link do vídeo: https://www.youtube.com/watch?v=OYooJzWaGrg

Aulas anteriores

Caso queira acessar os links para aulas anteriores:

Concluindo

Em caso de dúvidas, críticas, ou qualquer outra coisa que queira falar, basta deixar um comentário aí abaixo. Estamos ansiosos para ouvir a sua opinião.

Veja todas as aulas, e mais, na categoria Curso de PHP do Tutsup.

Constantes em PHP, como o próprio nome já indica, é um objeto capaz de conter um valor fixo que nunca será alterado; uma vez definida, seu valor não poderá ser modificado até o final da execução do seu script.

Nota: Caso tente modificar o valor de uma constante, o PHP irá retornar um erro!

Semelhante às variáveis, também podemos utilizar o valor das constantes em qualquer parte do código, entretanto, devemos tomar cuidado para não utilizar os nomes das constantes pré-definidas pelo PHP. Existem várias constantes que já estão criadas e são utilizadas pela própria linguagem.

Comparação entre e Variáveis e Constantes em PHP

Vejamos abaixo uma pequena comparação entre as variáveis e as constantes em PHP:

Alteração de variáveis em PHP

Como mostrei anteriormente, utilizamos o sinal de cifrão para criar uma variável.

Por exemplo:

$valor = 100;

A variável $valor será o mesmo que 100 em qualquer parte do seu script, no entanto, eu posso falar que $variável será 200 no momento em que precisar modificar seu valor.

Veja um outro exemplo:

<?php
// Aqui o valor é 100
$variavel = 100;

// Exibe 100 na tela
echo $variavel;

// O valor agora é 200
$variavel = 200;

// Exibe 200 na tela
echo $variavel;

Perceba que a mesma variável tem dois valores diferentes no decorrer do script, um em cada parte.

Não há nenhum problema em alterar o valor de uma variável qualquer em tempo de execução; simplesmente escreva o que deseja e a mágica está feita.

Criação de constantes de PHP

Utilizamos a função define() do PHP para criar uma constante. Veja um exemplo:

define("valor", "100");

Com a função acima, definimos que, em qualquer parte do código, “valor” será “100“. Com isso, até o final da execução do meu script o valor será 100, não existe uma maneira de mudar isso.

Por exemplo, se eu tentar modificar o valor da constante:

<?php
// Cria a constante "valor"
define("valor", "100");

// Exibe a constante (100)
echo valor;

// Tento alterar o valor de uma constante
// O trecho abaixo vai gerar um erro
// Notice: Constant valor already defined in arquivo/do/erro.php on line 9
define("valor", "200");

// O valor aqui continua sendo 100
echo valor;

Perceba que, além de o valor da constante não ser alterado, seu script ainda mostrará um erro na tela.

Diferenças entre variáveis e constantes em PHP

A primeira diferença, como você viu anteriormente, é na criação. Enquanto na variável utilizamos apenas o $ (cifrão) para definir seu valor, nas constantes utilizamos uma função define().

define('NOME_DA_CONSTANTE', 'Valor da constante', false);

Nota: As constantes também são case sensitive (fazem distinção entre letras maiúsculas e minúsculas), isso significa que CONSTANTE é totalmente diferente de Constante. O último argumento da função define controla isso; se este for um valor booleano false, ou se for omitido (como fizemos nos primeiros exemplos), o interpretador do PHP vai distinguir letras maiúsculas de letras minúsculas; caso seja um valor booleano true, o PHP não vai diferenciar. Veja no exemplo abaixo:

<?php
// Cria uma constante com letras minúsculas
// O último argumento (true), diz ao interpretador do php
// para não verificar letras maiúsculas e minúsculas
define('constante', 'Valor da constante', true);

// Exibe "Valor da constante" na tela
// mesmo utilizando letras maiúsculas
// sendo que ela foi definida com letras minúsculas
echo CONSTANTE;

Outro ponto importante é na utilização; ao invés de “chamar” uma constante com o sinal de $ (cifrão) como fazemos com as variáveis, utilizamos apenas seu nome propriamente dito.

Veja uma exemplo para exibir o valor 100 no script abaixo:

// Define a variável $valor
$valor = 100;

// Define a constante valor
define("valor", "100");

// Imprime a variável
echo $valor;

// Imprime a constante
echo valor;

Como você viu no exemplo acima, existe uma pequena diferença na utilização das constantes, se as compararmos às variáveis.

Verificando se uma constante já está definida

Como descrevi anteriormente, se você tentar definir uma constante que já está definida, além do valor da constante não ser alterado, o PHP irá retornar um erro na tela explicando o que está acontecendo.

Para evitar este tipo de problema, podemos utilizar a função defined() para verificar se a constante já está definida.

<?php
// Define a constante
define( 'CONSTANTE', 'valor' );

// Verifica se a constante está definida e exibe o valor
if ( defined( 'CONSTANTE' ) ) {
	// Exibe o valor da constante
	echo CONSTANTE;
}

// Verifica se a constante NÃO está definida;
// se não, define seu valor
if ( ! defined( 'CONSTANTE' ) ) {
	// Define a constante
	define( 'CONSTANTE', 'valor' );
}

Não se preocupe com a estrutura condicional que aparece no trecho de código acima, você vai aprender a fazer isso posteriormente nessa mesma série de artigos sobre PHP.

Por agora, entenda que if verifica se uma condição é verdadeira. Se você utilizar um sinal de exclamação (!), if verifica se a condição o contrário do que você deseja:

if ( condição ) {
	ação
}

if ( ! contrário da condição ) {
	ação
}

Dicas sobre constantes em PHP

Seguem algumas dicas sobre as constantes no seu script PHP:

  • Sempre se lembre: o valor de uma constante nunca pode ser alterado na execução do script;
  • Pense bem antes de criar uma constante;
  • Considere o uso de variáveis dependendo do caso;
  • Normalmente, utilizamos todas as letras maiúsculas quando definimos uma constante (tente utilizar um padrão);
  • Cuidado com as constantes predefinidas pelo PHP.

Vídeo tutorial

O vídeo tutorial abaixo detalha o que foi descrito acima:

Link do vídeo: https://www.youtube.com/watch?v=tQ3uUWvpWe4

Aulas anteriores

Caso queira acessar o links para aulas anteriores:

Concluindo

Em caso de dúvidas, críticas, ou qualquer outra coisa que queira falar, basta deixar um comentário aí abaixo. Estamos ansiosos para ouvir a sua opinião.

Veja todas as aulas, e mais, na categoria Curso de PHP do Tutsup.

Em nossa última aula, deixei um pequeno trecho de código exibindo como funcionam as variáveis em PHP:

<?php
// Meu nome
$meu_nome = 'Luiz Otávio';

// Frase com concatenação do meu nome
$frase = 'Meu nome é ' . $meu_nome;

// Exibe a frase
echo $frase;
?>

E, conforme descrevi, hoje vamos entrar em detalhes mais profundos sobre o que são as variáveis e para qual motivo você vai utilizá-las em seu código PHP.

O que são variáveis em PHP?

As variáveis em PHP (ou em qualquer outra linguagem de programação), são objetos capazes de reter e representar valores, expressões e funções no tempo de execução do script. Cada variável está associada a uma posição de memória do seu computador ou servidor.

Por exemplo: Suponhamos que eu tenha um script onde existem milhares de linhas de código onde devo exibir meu nome (Luiz Otávio Miranda Figueiredo); para simplificar as coisas, eu poderia criar uma variável chamada lomf ($lomf) com o valor “Luiz Otávio Miranda Figueiredo”; ao invés de escrever Luiz Otávio Miranda Figueiredo todas as vezes, escreveria apenas $lomf. Com isso, o PHP vai entender que $lomf tem o valor “Luiz Otávio Miranda Figueiredo”, e todas as vezes que eu chamar essa variável, seu valor será entregue à parte do código que eu precisar.

Seria, basicamente, como apelidar partes do código.

No PHP, utilizamos o sinal de $ (Cifrão), para representar a criação ou utilização de uma variável. Na representação do nosso exemplo anterior, o código ficaria como no exemplo seguinte:

$lomf = "Luiz Otávio Miranda Figueiredo";

Uma forma simples para imprimir variáveis na tela, é utilizando o comando echo que falamos na aula anterior, assim você já pode deduzir o que o próximo exemplo faz:

echo $lomf;
// Mostra "Luiz Otávio Miranda Figueiredo" na tela do navegador

Lembre-se dos comentários

Para que você não confunda, lembre-se que tudo o que estiver depois dos caracteres // (duas barras), é contado como comentário no PHP, ou seja, não faz parte do código, mas sim observações de texto puro que escrevemos para documentação. Lembre-se que essa parte do código deve ser lida, pois, na maioria delas vou detalhar o que aquele trecho faz.

Exemplo:

// Isto é um comentário, o interpretador do PHP pula esta parte do script

Criando variáveis em PHP

Como descrevi anteriormente, criamos variáveis em PHP utilizando um sinal de cifrão ($) mais o nome que vai identificar a variável. Porém, o primeiro caractere após o cifrão deve ser uma letra ou um underline (_), nunca um número ou um traço (-).

Veja exemplos abaixo:

Correto

<?php
$_variavel               = 'Correto';
$_variavel_              = 'Correto';
$_variável_              = 'Correto';
$Variável                = 'Correto';
$variavel_qualquer       = 'Correto';
$VARIÁVEL_QUALQUER       = 'Correto';
$variavelQualquer        = 'Correto';
$variavel_22_Qualquer_11 = 'Correto';
?>

Perceba que todas as variáveis acima estão criadas de maneira correta e não vão gerar nenhum erro no programa que você estiver criando. Até existem algumas variáveis que apresentam acentos nas palavras e o PHP ainda aceita esses valores.

Observação: Sempre evite utilizar acentos nas suas variáveis, isso pode causar um problema de codificação posteriormente. Como dica, utilize apenas letras (de A a Z), underline (_) ou números (de 0 a 9).

Por fim, lembre-se que os números (de 0 a 9) só podem ser utilizados no meio ou no fim das variáveis, eles nunca devem estar após o cifrão.

Veja exemplos de variáveis criadas incorretamente, nunca faça isso:

<?php
$1variavel         = 'Incorreto';
$ variavel         = 'Incorreto';
$variavel qualquer = 'Incorreto';
$-variavel         = 'Incorreto';
$variavel-qualquer = 'Incorreto';
?>

Criando valores para variáveis em PHP

Uma variável sempre deve ter um valor qualquer, seja uma string, uma função, uma classe, enfim, qualquer coisa em PHP pode estar no valor da variável.

Para nossas aulas, vamos começar devagar e apenas utilizar strings e números.

O valor de uma variável deve vir depois de um sinal de igual (=) após a criação da mesma, ou seja:

$nome = 'João';

Perceba que os valores de strings (como vimos na aula anterior sobre o comando echo) devem estar entre aspas; já os valores numéricos não precisam delas:

<?php
$numero = 22.55;

// Exibe 22.55 na tela
echo $numero;

Concatenando (juntando) variáveis em PHP

Outro fato que você vai precisar muito em PHP é a junção (concatenação) de valores de duas ou mais variáveis.

Para fazer isso, o ponto (.) deve ser utilizado:

<?php
// Cria as variáveis com o valores necessários
$meu_nome = 'Luiz Otávio Miranda Figueiredo';
$minha_idade = 27;

// Exibe uma frase com as variáveis concatenadas
echo 'Olá, meu nome é ' . $meu_nome . ' e minha idade é ' . $minha_idade;

No exemplo anterior, existem duas variáveis com meu nome e minha idade, logo abaixo delas, utilizei o comando “echo” do PHP para exibir uma frase com o valor das variáveis.

Perceba que sempre que for necessário entrar com um comando PHP (como no caso de uma variável), eu preciso fechar as aspas, colocar um ponto, e digitar o comando. Se eu precisar entrar com outro valor que não é um comando, devo colocar outro ponto, abrir aspas, colocar o valor, e fechar as aspas. Se eu precisar fazer isso novamente, devo repetir todo o processo:

<?php
// Cria as variáveis com o valores necessários
$meu_nome = 'Luiz Otávio Miranda Figueiredo';
$minha_idade = 27;
$peso = 80;

// Exibe uma frase com as variáveis concatenadas
echo 'Nome: '   . $meu_nome    . 
     ' Idade: ' . $minha_idade .	
     ' Peso: '  . $peso;

Também perceba que o final da sua linha de código sempre deve terminar com um ponto e vírgula (;). Caso você esqueça, terá um erro na tela do navegador e o código não será executado.

Apesar de o exemplo acima ter três linhas, ele poderia ser criado apenas em uma linha e ainda sim estaria correto.

Dica: Evite fazer esse emaranhado de concatenações, mantenha seu código organizado. O mesmo trecho acima poderia ser atingido com o trecho de código abaixo:

<?php
// Cria as variáveis com o valores necessários
$meu_nome = 'Luiz Otávio Miranda Figueiredo';
$minha_idade = 27;
$peso = 80;

// Exibe uma frase com as variáveis concatenadas
echo 'Nome: '   . $meu_nome;
echo ' Idade: ' . $minha_idade;
echo ' Peso: '  . $peso;

Fica muito mais organizado.

Fazendo conta com variáveis

Como as variáveis também podem receber valores numéricos, também é possível somar, subtrair, multiplicar e dividir seu conteúdo facilmente, veja o exemplo:

$a = 1; 
// $a tem o valor 1

$b = 2; 
// $b tem o valor 2

$c = $a + $b; 
// $c tem o valor de $a(1) + $b(2) = 3

Para que você possa entender melhor, eu poderia dizer sem termos técnicos ou coisas do tipo, que uma variável seria algo parecido com um apelido de uma pessoa, assim como João da Silva Sauro tem apelido de Joãozinho na vida real, no PHP podemos dar um apelido para qualquer coisa utilizando variáveis, como em nosso exemplo anterior, onde $a representou 1, $b o número 2 e $c a soma das duas variáveis ($a + $b), que resultou no número 3.

O mesmo se aplica para subtrair, multiplicar e dividir, veja o exemplo:

$a = 10; 
// $a tem o valor 10
$b = 2; 
// $b tem o valor 2
$c = $a - $b; 
// $c tem o valor de $a(10) menos o valor de $b(2) = 8
$c = $a / $b; 
// $c tem o valor de $a(10) dividido pelo valor de $b(2) = 5
$c = $a * $b;
// $c tem o valor de $a(10) multiplicado pelo valor de $b(2) = 20

Cuidado com as variáveis

No PHP temos algumas variáveis que são predefinidas para utilização, com isso, não podemos utilizar estas variáveis com outro valor, veja um exemplo incorreto da utilização de variáveis predefinidas:

$GLOBALS = "Qualquer valor"; 
// $GLOBALS faz referencia para todas variáveis disponíveis no escopo global

$_SERVER = "Qualquer valor"; 
// $_SERVER contém Informação do servidor e ambiente de execução do script

$_GET = "Qualquer valor"; 
// $_GET contém informações do HTTP GET

$_POST = "Qualquer valor"; 
// $_POST contém informações do HTTP POST

$_FILES = "Qualquer valor"; 
// $_FILES contém dados de arquivos enviados HTTP File Upload

$_REQUEST = "Qualquer valor"; 
// $_REQUEST contém informações das Variáveis de requisição HTTP

$_SESSION = "Qualquer valor"; 
// $_SESSION contém dados das variáveis de sessão

$_ENV = "Qualquer valor"; 
// $_ENV contém valores das variáveis de ambiente

$_COOKIE = "Qualquer valor"; 
// $_COOKIE contém valores dos Cookies HTTP

$php_errormsg = "Qualquer valor"; 
// $php_errormsg contém valores de erros do PHP

$HTTP_RAW_POST_DATA = "Qualquer valor";
// $HTTP_RAW_POST_DATA contém Informação não-tratada do POST

$http_response_header = "Qualquer valor"; 
// $http_response_header contém valores dos cabeçalhos de resposta HTTP

$argc = "Qualquer valor"; 
// $argc contém o número de argumentos passados para o script

$argv = "Qualquer valor"; 
// $argv contém o array de argumentos passados para o script

Todos os exemplos acima estão incorretos e não devem ser utilizados na execução do seu script.

Outro ponto importante que você deve lembrar, é que também não podemos utilizar caracteres especiais (Espaço, -, *, &, |, (), ¨,%, etc) no meio da variável.

Veja outro exemplo de variáveis incorretas:

$Tuts up = "Blog";
// Está incorreto, não podemos utilizar o espaço
// O correto seria:
$Tuts_up = "Blog";

Por fim, devemos saber que o PHP é uma linguagem Case sensitive, ou seja, faz distinção entre letras maiúsculas e minúsculas, logo você já pode deduzir que $Tutsup é diferente de $tutsup, as duas variáveis podem receber valores diferentes no mesmo script.

Por exemplo:

<?php
// Cria as variáveis com o valores necessários
$tutsup = 'blog';
$Tutsup = 'Tutsup';

// Tenho um blog chamado Tutsup
echo 'Tenho um ' . $tutsup . ' chamado ' . $Tutsup;

Aspas duplas e variáveis em PHP

Um ponto interessante das aspas duplas em PHP, é que seu interpretador vai ler o código que estiver dentro delas, por exemplo:

<?php
$meu_nome = 'Luiz Otávio';

// Aspas simples exibe: Meu nome é $meu_nome
echo 'Meu nome é $meu_nome';

// Aspas duplas interpreta o código: Meu nome é Luiz Otávio
echo "Meu nome é $meu_nome";

Perceba que na primeira parte do código utilizei aspas simples, com isso o interpretador do PHP não conseguiu interpretar a variável $meu_nome; então isso foi exibido na tela:

Meu nome é $meu_nome

Na segunda parte do código utilizei aspas duplas, assim o interpretador do PHP conseguiu ler variável $meu_nome:

Meu nome é Luiz Otávio

Talvez seja melhor utilizar aspas duplas do que concatenar variáveis com o ponto, vai depender de você.

Veja um exemplo que mostrei anteriormente neste artigo, porém, agora vou utilizar aspas duplas e não o ponto:

<?php
// Cria as variáveis com o valores necessários
$meu_nome = 'Luiz Otávio Miranda Figueiredo';
$minha_idade = 27;
$peso = 80;

// Exibe: Nome: Luiz Otávio Miranda Figueiredo Idade: 27 Peso: 80
echo "Nome: $meu_nome Idade: $minha_idade Peso: $peso";

Bem mais simples, não?

Escopo das variáveis em PHP

Apesar de ser uma área que ainda vamos chegar neste curso, é importante que você saiba que variáveis pode ter escopo local ou global.

Uma variável global estará disponível em todo o seu script; uma variável local estará disponível somente dentro da função que a criou.

Veja o exemplo abaixo (não se preocupe, você vai aprender isso posteriormente):

<?php
// Cria uma variável comum
$variavel_global = 10;

function soma() {
	// Define que $variavel_global é global
	global $variavel_global;
	
	// Cria uma variável local (apenas dentro da função)
	$variavel_local = 20;
	
	// Soma o valor das duas variáveis
	return $variavel_global + $variavel_local;
}

// Exibe 10 na tela;
echo $variavel_global;

// Exibe um erro na tela dizendo que a variável não está definida
echo $variavel_local;

// Exibe 30 na tela
echo soma();

No exemplo acima, temos uma variável global (que poderá ser acessada fora e dentro da função) e uma variável local, que, se for acessada fora da função, é tratada como variável indefinida.

Variáveis geradas dinamicamente

Outro ponto interessante que você vai ter que utilizar qualquer dia desses, são as variáveis criadas dinamicamente. Apesar de ser um pouco confuso, é importante que você entenda este conceito.

As variáveis criadas dinamicamente são geradas através do valor de outra variável qualquer, por exemplo:

<?php
// Cria uma variável com um valor qualquer
$variavel = 'valor';

// Utilizar o valor da variável para criar uma nova variável com valor
// dinâmico
$$variavel = 'dinâmico';

// Exibe: dinâmico
echo $valor;

Perceba que eu não criei uma variável chamada $valor, ela foi gerada dinamicamente através de dois sinais de cifrão $$ (ao invés de um).

Funciona basicamente assim: tenho uma variável $X com valor V, se eu utilizar $$X, vou utilizar V (valor de $X) para criar uma nova variável $V, veja isso na prática novamente:

<?php
$X = 'V';
$$X = 'Sou o valor de $V';

// Exibe: Sou o valor de $V
echo $V;

Entenda isso, pois, em alguns casos só este método vai resolver seu problema.

Vídeo tutorial

O vídeo abaixo complementa o texto acima:

Link do vídeo: https://www.youtube.com/watch?v=0NEl8d_lRZc

Aulas anteriores

Caso queira acessar o links para aulas anteriores:

Concluindo

Em caso de dúvidas, críticas ou qualquer outra coisa que queira falar, basta deixar um comentário aí abaixo. Estamos ansiosos para ouvir a sua opinião.

Veja todas as aulas, e mais, na categoria Curso de PHP do Tutsup.

Agora que já criamos nosso servidor, estipulamos um editor de textos padrão e criamos nosso primeiro script em PHP, temos que entender como funciona a linguagem. Vamos começar pelas aspas e o comando echo, que tratam de uma das partes mais utilizadas em todos os scripts em PHP, a exibição de conteúdo na tela do navegador.

Observação: Antes de continuar a leitura, crie uma pasta dentro da nossa pasta “php” (que está dentro da pasta “cursos”) chamada “aula_2”. Dentro dessa última, crie um arquivo chamado “index.php” e teste todos os scripts que criaremos nessa aula nesse arquivo. (Vimos sobre isso na primeira aula).

Echo em PHP

Como vimos em nossa primeira aula, tudo o que é parte do código PHP deve estar entre as tags de abertura da linguagem <?php e ?>. Por exemplo, se eu abrir o arquivo index.php e digitar o seguinte:

<?php
echo 1;
?>

E abrir o endereço http://127.0.0.1/cursos/php/aula_2/ em meu navegador, verei exatamente o número 1 na tela.

Isso acontece porque o comando echo serve simplesmente para exibir algo na tela quando seu programa for executado, porém, você deve tomar alguns cuidados antes de utilizar este comando.

Como você pode utilizar o comando echo para exibir strings, é necessário que você utilize aspas simples ou duplas para que os valores que você deseja exibir, não sejam interpretados como linhas de código pelo interpretador do PHP. Nesse caso, sempre que for necessário exibir um texto comum, você deve envolver o conteúdo do texto entre aspas simples ou duplas.

Veja um exemplo:

<?php
echo 'Posso exibir quase qualquer coisa aqui dentro.';
?>

Veja o que acontece no trecho acima:

  • <?php – A tag de abertura do PHP;
  • echo – Um dos comandos mais utilizados em PHP, exibe algo na tela;
  • Aspas simples (‘) – Indica que estou abrindo um container onde posso escrever praticamente qualquer coisa;
  • Texto: Posso exibir quase qualquer coisa aqui dentro.
  • Aspas simples (‘) – Indica que estou fechando o container que havia aberto anteriormente;
  • Ponto e vírgula (;) – Sempre que você terminar de escrever um código em PHP, deve fechar o trecho com um ponto e vírgula;
  • ?> – Tag de fechamento do código PHP.

Se eu executar o trecho acima em meu navegador, o texto “Posso exibir quase qualquer coisa aqui dentro.” será mostrado na tela.

Se eu quiser exibir vários textos em sequência, posso fazer da seguinte maneira:

<?php
echo 'Texto 1 ';
echo 'Texto 2 ';
echo 'Texto 3 ';
echo 'Texto 4 ';
echo 'Texto 5 ';
?>

Se você executar o trecho acima em seu navegador, verá todos os textos que estão entre as aspas, porém, em uma única linha. Isso acontece porque nada que está fora das aspas é considerado pelo comando echo, assim, não existem quebras de linhas, apenas os próprios espaços que estão dentro das aspas.

Se você quisesse que os espaços aparecessem, poderia fazer da seguinte maneira:

<?php
echo 'Texto 1
Texto 2 
Texto 3 
Texto 4 
Texto 5';
?>

Perceba que antes de fechar as aspas e utilizar o ponto e vírgula para finalizar minha linha de código, eu pulei as linhas dentro do comando echo, assim obtive o seguinte resultado:

Texto 1
Texto 2 
Texto 3 
Texto 4 
Texto 5

No entanto, você só vai conseguir visualizar as quebras de linha se exibir o código fonte do seu navegador (CTRL + U), isso acontece porque seu navegador está renderizando HTML e não texto puro (como estamos exibindo). Se quiséssemos que o navegador mostrasse um texto em cada linha, deveríamos escrever uma tag de quebra de linha ao final de cada linha. Por exemplo:

<?php
echo 'Texto 1 <br />
Texto 2  <br />
Texto 3  <br />
Texto 4  <br />
Texto 5';
?>

Ou:

<?php
echo 'Texto 1 <br />';
echo 'Texto 2 <br />';
echo 'Texto 3 <br />';
echo 'Texto 4 <br />';
echo 'Texto 5 ';
?>

A tag <br /> fará o serviço de pular uma linha cada vez que o navegador a encontrar, portanto, teremos o seguinte:

Exemplo do comando echo em PHP

E se analisarmos o código-fonte do navegador, veremos o seguinte:

Exemplo do código-fonte do navegador

Exatamente o que queríamos.

Exibindo HTML dentro do comando echo

Se você precisar exibir HTML dentro do comando echo, na verdade não precisa fazer nada além de escrever o que precisa. Veja um exemplo:

<?php
echo '<h1>Este é meu cabeçalho em HTML</h1>';
echo '<p>Este é meu parágrafo <b>com isso em negrito</b></p>';
?>

Isso vai gerar exatamente o HTML que você enviou dentro do comando echo, ou seja:

HTML gerado com echo em PHP

Porém, pode acontecer ao contrário e você precisar exibir HTML fora do contexto do PHP. Para esses casos é mais simples ainda, basta fechar abrir e fechar as tags de abertura do PHP sempre que precisar escrever algum trecho em PHP.

Vamos ver no código como ficaria:

<!doctype html>
<html>
	<head>
		<meta charset="UTF-8">
		
		<title><?php echo 'título';?></title>
	</head>
	<body>
		<h1>Cabeçalho</h1>
		<?php echo '<p>Qualquer coisa em PHP</p>';?>
	</body>
</html>

Perceba no trecho acima, que estou intercalando PHP e HTML, com isso, posso abrir e fechar as tags do PHP quantas vezes forem necessárias.

Aspas e echo em PHP

Conforme descrevi anteriormente, você deve utilizar aspas simples ou duplas sempre que for necessário escrever algo que o PHP não entende como código, como um texto simples (também chamado de string). Porém, e se esse texto também tiver aspas simples ou duplas?

Veja o que acontece:

<?php
echo 'Meu texto tem 'aspas'';
?>

No trecho acima, as aspas que estão dentro do texto estão fazendo o código se comportar de maneira incorreta, isso porque a primeira aspa simples do texto, está, na verdade, fechando a aspas simples do código.

Isso irá gerar um erro de sintaxe:

Parse error: syntax error, unexpected ‘aspas’ (T_STRING), expecting ‘,’ or ‘;’ in E:ProgramasEasyPHPdatalocalwebcursosphpaula_2index.php on line 2

Para resolver este problema, existem duas maneira:

  • Intercalar aspas duplas e aspas simples;
  • Utilizar a barra invertida () para escapar as aspas que não forem do código

Na primeira opção, podemos abrir o nosso código aspas duplas ao invés de aspas simples, assim, as aspas do texto não afetarão as aspas do código:

<?php
echo "Meu texto tem 'aspas'";
?>

O mesmo acontece quando utilizamos aspas duplas dentro do texto, basta alterar as aspas do código para aspas simples:

<?php
echo 'Meu texto tem "aspas"';
?>

Porém, pode chegar um dia em que não existe outra possibilidade, é necessário colocar as mesmas aspas do código dentro do texto (ou vice-versa). Nesse caso, você pode utilizar a barra invertida () como caractere de escape antes de cada uma das aspas do texto.

<?php
echo 'Meu texto tem 'aspas'';
?>

As barras invertidas não aparecem na saída do comando echo, simplesmente servem para escapar as aspas simples ou duplas que forem utilizadas na sua string dentro do código.

Considerações finais sobre as aspas

Apesar do texto acima estar bem detalhado, vale ressaltar alguns pontos interessantes sobre as aspas:

  • Não é permitido abrir com aspas simples e fechar com aspas duplas (ou vice-versa):
<?php
echo 'Meu texto'; // Correto ''
echo "Meu texto"; // Correto ""
echo 'Meu texto"; // Incorreto '"
echo "Meu texto'; // Incorreto "'
?>
  • Utilize aspas intercaladas quando seu texto tiver aspas:
<?php
echo 'Meu texto com "aspas"'; // Correto
echo "Meu texto com 'aspas'"; // Correto
echo 'Meu texto com 'aspas''; // Incorreto
echo "Meu texto com "aspas""; // Incorreto
?>
  • Utilize a barra invertida () para escapar aspas se for necessário utilizar as mesmas aspas no texto e no código;
echo 'Meu texto com "aspas"'; // Correto
echo "Meu texto com 'aspas'"; // Correto
echo 'Meu texto com 'aspas''; // Correto
echo "Meu texto com "aspas""; // Correto

Comentários em PHP

Normalmente quando escrevemos códigos em PHP, o arquivo ficará gigante, com várias linhas e trecho que fazem coisas diferentes. Por este motivo, vai chegar um momento em que não vamos mais entender o que fizemos naquele código, como corrigimos determinado problema, ou porque existe uma linha a mais para fazer determinada tarefa.

Para resolver este problema, precisamos documentar o que estamos fazendo, simplesmente escrever o que determinada linha ou função faz para que possamos lembrar depois.

Em PHP, utilizamos os comentários para documentar nossos códigos, isso garante que sempre que alguém ler aquele código, saberá exatamente como manipulá-lo, até mesmo você, quando esquecer porque escreveu aquela função estranha (e vai por mim, a gente esquece mesmo).

Existem várias maneiras de comentar em PHP, mas vejamos apenas duas: utilizando duas barra (//) ou os caracteres /* e */.

Os comentários com duas barras (//) servem apenas para uma linha:

<?php
// Isso é um comentário
echo 'Isso é código';

// Isso é outro comentário
echo 'Isso é código';
?>

O interpretador do PHP ignora os comentários, assim, eles não atrapalham seu código, não geram erros e não aparecem na saída final.

Os comentários com os sinais de /* e */, equivalem para comentários com quantas linhas você desejar, porém, você sempre deve fechar os comentários com */. Veja um exemplo:

<?php
/* Isso é um comentário 
e eu posso utilizar quantas
linhas eu precisar,
contando que feche os comentários 
com --> */
echo 'Isso é código';
?>

Considerações finais sobre echo em PHP

Como eu descrevi ao longo do artigo, o comando echo é um dos comandos mais utilizados em PHP, e você pode exibir praticamente tudo o que quiser.

Basicamente, você vai utilizar este comando para exibir variáveis, que são uma forma para guardar valores em PHP, veja um exemplo:

<?php
// Meu nome
$meu_nome = 'Luiz Otávio';

// Frase com concatenação do meu nome
$frase = 'Meu nome é ' . $meu_nome;

// Exibe a frase
echo $frase;
?>

Ainda vamos ver variáveis em muito mais detalhes, porém, saiba que elas são uma forma de salvar um valor qualquer em um trecho de texto bem menor. Em PHP utilizamos o sinal de $ (cifrão) para criar uma variável (conforme o código acima mostra). Caso queira concatenar (juntar duas variáveis), basta utilizar um ponto (.).

Não entre em pânico sobre variáveis ainda, vamos falar sobre isso na próxima aula. Por agora, brinque com os trechos de código que deixei no artigo para pegar intimidade com a linguagem.

Na próxima aula aprofundaremos muito mais.

Vídeo tutorial

O vídeo tutorial abaixo é um complemento ao texto acima:

Link do vídeo: https://www.youtube.com/watch?v=jCUlliIPjvg

Aula anterior

Caso queira acessar a aula anterior, segue o link:

Concluindo

Em caso de dúvidas, críticas ou qualquer outra coisa que queira falar, basta deixar um comentário aí abaixo. Estamos ansiosos para ouvir a sua opinião.

Veja todas as aulas, e mais, na categoria Curso de PHP do Tutsup.

Se você precisa de uma classe PHP para cálculo de máscara de sub-rede IPv4, talvez este artigo irá ajudá-lo a concluir seu projeto. A classe precisa receber um endereço IP com o prefixo CIDR (ex. 192.168.0.1/24) para retornar o restante dos valores de configuração da rede para você.

Os valores retornados serão: Endereço/Prefixo CIDR, Endereço IP, Prefixo CIDR, Máscara de sub-rede, IP da Rede, Broadcast da Rede, Primeiro Host, Último Host, número total de IPs e o número total de hosts.

Por exemplo: Para o IP 172.16.5.10/30, os valores retornados estão abaixo.

Endereço/Rede: 172.16.5.10/30
Endereço: 172.16.5.10
Prefixo CIDR: /30
Máscara de sub-rede: 255.255.255.252
IP da Rede: 172.16.5.8/30
Broadcast da Rede: 172.16.5.11
Primeiro Host: 172.16.5.9
Último Host: 172.16.5.10
Total de IPs:  4
Hosts: 2

Você pode fazer um teste da classe no link abaixo:

Agora vamos aos códigos.

A classe

<?php
/**
 * calc_ipv4 - Cálculo de máscara de sub-rede IPv4
 */
class calc_ipv4
{
    // O endereço IP
    public $endereco;
    
    // O cidr
    public $cidr;
    
    // O endereço IP 
    public $endereco_completo;

    /**
     * O construtor apenas configura as propriedades da classe
     */
    public function __construct( $endereco_completo ) {
        $this->endereco_completo = $endereco_completo;
        $this->valida_endereco();
    }
    
    /**
     * Valida o endereço IPv4
     */
    public function valida_endereco() {
        // Expressão regular
        $regexp = '/^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}/[0-9]{1,2}$/';
        
        // Verifica o IP/CIDR
        if ( ! preg_match( $regexp, $this->endereco_completo ) ) {
            return false;
        }
        
        // Separa o IP do prefixo CIDR
        $endereco = explode( '/', $this->endereco_completo );
        
        // CIDR
        $this->cidr = (int) $endereco[1];
        
        // Endereço IPv4
        $this->endereco = $endereco[0];
        
        // Verifica o prefixo
        if ( $this->cidr > 32 ) {
            return false;
        }
        
        // Faz um loop e verifica cada número do IP
        foreach( explode( '.', $this->endereco ) as $numero ) {
        
            // Garante que é um número
            $numero = (int) $numero;
            
            // Não pode ser maior que 255 nem menor que 0
            if ( $numero > 255 || $numero < 0 ) {
                return false;
            }
        }
        
        // IP "válido" (correto)
        return true;
    }

    /* Retorna o endereço IPv4/CIDR */
    public function endereco_completo() { 
        return ( $this->endereco_completo ); 
    }

    /* Retorna o endereço IPv4 */
    public function endereco() { 
        return ( $this->endereco ); 
    }

    /* Retorna o prefixo CIDR */
    public function cidr() { 
        return ( $this->cidr ); 
    }

    /* Retorna a máscara de sub-rede */
    public function mascara() {
        if ( $this->cidr() == 0 ) {
            return '0.0.0.0';
        }

        return ( 
            long2ip(
                ip2long("255.255.255.255") << ( 32 - $this->cidr ) 
            )
        );
    }

    /* Retorna a rede na qual o IP está */
    public function rede() {
        if ( $this->cidr() == 0 ) {
            return '0.0.0.0';
        }

        return (
            long2ip( 
                ( ip2long( $this->endereco ) ) & ( ip2long( $this->mascara() ) )
            )
        );
    }

    /* Retorna o IP de broadcast da rede */
    public function broadcast() {
        if ( $this->cidr() == 0 ) {
            return '255.255.255.255';
        }
        
        return (
            long2ip( ip2long($this->rede() ) | ( ~ ( ip2long( $this->mascara() ) ) ) )
        );
    }
    
    /* Retorna o número total de IPs (com a rede e o broadcast) */
    public function total_ips() {
        return( pow(2, ( 32 - $this->cidr() ) ) );
    }
    
    /* Retorna os número de IPs que podem ser utilizados na rede */
    public function ips_rede() {
        if ( $this->cidr() == 32 ) {
            return 0;
        } elseif ( $this->cidr() == 31 ) {
            return 0;
        }
        
        return( abs( $this->total_ips() - 2 ) );
    }
    
    /* Retorna os número de IPs que podem ser utilizados na rede */
    public function primeiro_ip() {
        if ( $this->cidr() == 32 ) {
            return null;
        } elseif ( $this->cidr() == 31 ) {
            return null;
        } elseif ( $this->cidr() == 0 ) {
            return '0.0.0.1';
        }
        
        return (
            long2ip( ip2long( $this->rede() ) | 1 )
        );
    }
    
    /* Retorna os número de IPs que podem ser utilizados na rede */
    public function ultimo_ip() {
        if ( $this->cidr() == 32 ) {
            return null;
        } elseif ( $this->cidr() == 31 ) {
            return null;
        }
    
        return (
            long2ip( ip2long( $this->rede() ) | ( ( ~ ( ip2long( $this->mascara() ) ) ) - 1 ) )
        );
    }
}

Todos os métodos são públicos, ou seja, você pode utilizar qualquer um deles individualmente.

Utilização da classe

Para utilizar a classe, é recomendado que você utilize primeiro o método de validação do IP, veja um exemplo:

<?php 
// Inclui a classe
include 'classes/class_calc_ipv4.php';

// Cria o objeto da classe já recebendo o IP/CIDR
$ip = new calc_ipv4('192.168.0.5/29');

// Checa se o IP é válido
if( $ip->valida_endereco() ) {
    // Utiliza os métodos disponíveis
    echo "<b>Endereço/Rede: </b>" . $ip->endereco_completo() . '<br>';
    echo "<b>Endereço: </b>" . $ip->endereco() . '<br>';
    echo "<b>Prefixo CIDR: </b>/" . $ip->cidr() . '<br>';
    echo "<b>Máscara de sub-rede: </b>" . $ip->mascara() . '<br>';
    echo "<b>IP da Rede: </b>" . $ip->rede() . '/' . $ip->cidr() . '<br>';
    echo "<b>Broadcast da Rede: </b>" . $ip->broadcast() . '<br>';
    echo "<b>Primeiro Host: </b>" . $ip->primeiro_ip() . '<br>';
    echo "<b>Último Host: </b>" . $ip->ultimo_ip() . '<br>';
    echo "<b>Total de IPs:  </b>" . $ip->total_ips() . '<br>';
    echo "<b>Hosts: </b>" . $ip->ips_rede();
    echo "</pre>";
} else {
    echo 'Endereço IPv4 inválido!';
}
?>

Simples assim!

Download

Você pode baixar o exemplo criado nesse artigo no link abaixo:

Qualquer dúvida é só perguntar aí nos comentários.

Lançar (throw) e capturar (try / catch) exceções em PHP é parte essencial da sua programação orientada a objetos. Com elas você pode criar um “erro” (uma exceção) que deverá ser capturado quando a classe ou função for executada.

Utilizamos throw para lançar uma nova exceção da seguinte maneira:

<?php
function mensagem ( $mensagem = null ) {
    // Verifica se a mensagem NÃO foi enviada
    if ( ! $mensagem ) {
        // Lança uma nova exceção
        throw new Exception('Mensagem não enviada!');
    }
    
    // Exibe a mensagem
    echo $mensagem;
}
?>

No código acima, criei uma função que exibirá uma mensagem que deverá (obrigatoriamente) ser enviada para o parâmetro $mensagem da mesma. Se a mensagem não for enviada pelo desenvolvedor, lanço uma exceção detalhando o que ocorreu.

Quando throw é encontrado pelo interpretador do PHP, o código irá ler o que ele diz e não executará o restante daquela função, ou seja, eu não preciso verificar novamente se o parâmetro foi enviado para continuar escrevendo o restante dos códigos daquela função.

Um ponto importante a ser ressaltado, é que agora você não deve executar a função diretamente, como era de costume.

// Executa a função sem o parâmetro mensagem
mensagem();

Isso irá lançar o seguinte erro fatal:

Fatal error: Uncaught exception ‘Exception’ with message ‘Mensagem não enviada!’ in D:hd_antigoProgramasEasyPHPdatalocalwebindex.php:6 Stack trace: #0 D:hd_antigoProgramasEasyPHPdatalocalwebindex.php(14): mensagem() #1 {main} thrown in D:hd_antigoProgramasEasyPHPdatalocalwebindex.php on line 6

O que aconteceu no erro acima foi que o interpretador do PHP encontrou uma exceção lançada com o bloco throw na linha 6 do arquivo index.php, mas não encontrou uma maneira de capturar essa exceção.

Capturar uma exceção significa utilizar o bloco try para tentar executar a função, e pelo menos um bloco catch para capturar e manipular o erro.

A maneira mais simples para resolver o problema acima seria:

// Executa o código
try {
    // Executa a função sem o parâmetro mensagem
    mensagem();
} catch( Exception $e ) {
    // Exibe a exceção (erro)
    echo $e->getMessage();
}

O bloco try/catch em PHP funcionam de maneira similar às estruturas condicionais em PHP, porém, ao invés de imaginar “Se / se não”, imagine “Tente / capture”.

Try sempre será executado enquanto um throw não for encontrado. Se throw for encontrado pelo interpretador do PHP, o código daquela função ou método imediatamente para de ser executado e os comandos do bloco catch serão executados.

Veja mais um exemplo, mas agora com classes PHP:

<?php
// Cria uma classe
class Mensagem
{
    // Um método
    public function exibe( $mensagem = false ) {
        // Verifica se a mensagem NÃO (!) foi enviada como parâmetro
        if ( ! $mensagem ) {
            throw new Exception('Envie a mensagem em $mensagem!');
        }
        
        // Exibe a mensagem
        echo $mensagem;
    }
}

// Executa o código
try {
    // Cria uma instância da classe
    $mensagem = new Mensagem();
    
    // Executa o método exibe
    $mensagem->exibe();
} catch( Exception $e ) {
    // Exibe a exceção (erro)
    echo $e->getMessage();
}
?>

No código acima, o bloco catch será executado, já que tentamos executar o método “exibe” sem enviar o parâmetro $mensagem. Consequentemente, ao invés de exibir qualquer coisa na tela, o usuário verá apenas:

Envie a mensagem em $mensagem!

Para que o bloco try seja executado, deveríamos executar o método “exibe” da seguinte maneira:

$mensagem->exibe("Oi, agora tenho uma mensagem!");

E resolveríamos o problema do parâmetro $mensagem.

Você também pode estender a classe “Exception” para criar suas próprias exceções da seguinte maneira:

<?php
// Nova exceção
class MinhaExcecao Extends Exception { }

Nesse caso nosso código mudaria um pouco, veja:

<?php
// Nova exceção
class MinhaExcecao Extends Exception { }

// Cria uma classe
class Mensagem
{
    // Um método
    public function exibe( $mensagem = false ) {
        // Verifica se a mensagem NÃO (!) foi enviada como parâmetro
        if ( ! $mensagem ) {
            // Lança a nova excessão
            throw new MinhaExcecao('Envie a mensagem em $mensagem!');
        }
        
        // Exibe a mensagem
        echo $mensagem;
    }
}

// Executa o código
try {
    // Cria uma instância da classe
    $mensagem = new Mensagem();
    
    // Executa o método exibe
    $mensagem->exibe();
} catch( MinhaExcecao $e ) {
    // Exibe a exceção (erro)
    echo $e->getMessage();
}
?>

No trecho de código acima, ao invés de lançar e capturar exceções na classe “Exception”, faço o mesmo na minha nova classe de exceções “MinhaExcecao”.

Uma parte importante da classe “Exception” no PHP, é que ela tem vários métodos interessantes, são eles:

  • getMessage () – A mensagem de erro
  • getCode () – O código de erro
  • getFile () – O arquivo de erro
  • getLine () – A linha do erro
  • getTrace () – Informações de contexto do erro
  • getTraceAsString () – Mesmo informação anterior, só que com string

Com isso podemos gerar erros mais precisos, veja:

// Executa o código
try {
    // Cria uma instância da classe
    $mensagem = new Mensagem();
    
    // Executa o método exibe
    $mensagem->exibe();
} catch( MinhaExcecao $e ) {
    echo '<b>Erro: </b>';
    echo $e->getMessage() . '<br>';
    echo ' <b>Na linha: </b>';
    echo $e->getLine() . '<br>';
    echo ' <b>Arquivo: </b>';
    echo $e->getFile() . '<br>';
}

O trecho de código acima deverá lançar um erro da seguinte maneira:

Erro: Envie a mensagem em $mensagem!
Na linha: 13
Arquivo: D:hd_antigoProgramasEasyPHPdatalocalwebindex.php

Bem mais detalhado.

Concluindo

Exceções trazem uma nova maneira de trabalhar com o PHP Orientado a Objetos, deixando o PHP mais próximo de linguagens como Java ou C. Utilize com sabedoria.

Caso queira tirar alguma dúvida, basta deixar um comentário.

Você sabia que é possível criar bases de dados e tabelas com PDO em PHP? Não é necessário conectar-se a um BD para realizar a conexão, somente precisamos do HOST ou IP do servidor, usuário e senha.

Por exemplo, em nosso artigo PDO em PHP, induzimos o usuário a conectar-se a servidor MySQL utilizando o HOST, base de dados, usuário e senha da seguinte maneira:

<?php
/* Variáveis PDO */
$base_dados = 'contatos';
$usuario_bd = 'user_db_contatos';
$senha_bd   = 'senha_db_contatos';
$host_db    = 'localhost';
$conexao_pdo = null;
 
/* Concatenação das variáveis para detalhes da classe PDO */
$detalhes_pdo = 'mysql:host=' . $host_db . ';dbname='. $base_dados;
 
// Tenta conectar
try {
    // Cria a conexão PDO com a base de dados
    $conexao_pdo = new PDO($detalhes_pdo, $usuario_bd, $senha_bd);
} catch (PDOException $e) {
    // Se der algo errado, mostra o erro PDO
    print "Erro: " . $e->getMessage() . "<br/>";
    // Mata o script
    die();
}
?>

Veja que acima estamos realizando uma conexão com um servidor PDO e já selecionando a base de dados. Mas e se ainda não tivermos uma base de dados pronta?

Vamos realizar uma conexão com o servidor sem selecionar uma base de dados para que você entenda:

<?php
/* Variáveis PDO */
$usuario_bd = 'root'; // Usuário da base de dados
$senha_bd   = ''; // Senha
$host_db    = 'localhost'; // Host
$conexao_pdo = null; // Nossa conexão PDO

/* Concatenação das variáveis para detalhes da classe PDO */
$detalhes_pdo = "mysql:host=$host_db;";

// Tenta conectar
try {
	// Cria a conexão PDO
	$conexao_pdo = new PDO($detalhes_pdo, $usuario_bd, $senha_bd);
} // try

// Se algo der errado
catch (PDOException $e) {
	// Se der algo errado, mostra o erro PDO
	print "Erro: " . $e->getMessage() . "<br/>";
   
	// Mata o script
	die();
} // catch
?>

Se criarmos um arquivo php com o código acima, podemos incluí-lo em qualquer outro arquivo e utilizar a variável “$conexao_pdo” para realizar comandos MySQL, como CREATE DATABASE, para criar bases de dados, ou CREATE TABLE para criar tabelas.

Se você não tem intimidade com esses comandos, leia nosso artigo:

Por exemplo:

<?php 
// Inclui o arquivo de conexão com o código descrito anteriormente
include('conexao.php');

// Nosso novo banco de dados
$bd = "minha_nova_base_de_dados";

// Cria o banco de dados e da permissão para nosso usuário no mesmo
$verifica = $conexao_pdo->exec(
    "CREATE DATABASE IF NOT EXISTS `$bd`;
    GRANT ALL ON `$bd`.* TO '$usuario_bd'@'localhost';
    FLUSH PRIVILEGES;"
);

// Verificamos se a base de dados foi criada com sucesso
if ( $verifica ) {
    echo 'Banco de dados criado com sucesso!';
} else {
    echo 'Falha ao criar banco de dados!';
}
?>

Você também pode executar um comando maior, inserindo uma tabela nesse banco de dados, por exemplo:

<?php 
// Inclui o arquivo de conexão com o código descrito anteriormente
include('conexao.php');

// Nosso novo banco de dados
$bd = "minha_nova_base_de_dados";

// Cria o banco de dados e da permissão para nosso usuário no mesmo
$verifica = $conexao_pdo->exec(
    "CREATE DATABASE IF NOT EXISTS `$bd`;
    GRANT ALL ON `$bd`.* TO '$usuario_bd'@'localhost';
    FLUSH PRIVILEGES;
    CREATE TABLE IF NOT EXISTS `$bd`.`minha_tabela` (
        cliente_id INT(11) NOT NULL AUTO_INCREMENT,
        cliente_nome VARCHAR(255),
        PRIMARY KEY ( cliente_id )
    )"
);

// Verificamos se a base de dados foi criada com sucesso
if ( $verifica ) {
    echo 'Comandos MySQL executados com sucesso!';
} else {
    echo 'Falha!';
}
?>

Veja que agora eu criei a base de dados (se ela não existir) e uma tabela (se ela não existir). Neste caso você só vai precisar executar o comando completo, ou seja, indicando a base de dados e a tabela da seguinte maneira:

CREATE TABLE IF NOT EXISTS `base_de_dados`.`tabela`;

Simples assim!

A combinação do PHP e uma base de dados como MySQL nos proporciona uma maneira bem simples de criar um modelo de paginação estilo o que estamos acostumados a ver todos os dias no Google ou aqui mesmo no Tutsup. Utilizando o limite do MySQL podemos dividir todo o conteúdo da nossa consulta em partes menores, que proporcionam facilidade para o usuário navegar pelo seu site.

Neste artigo você vai entender como funciona o processo de criação da paginação utilizando especificamente PHP e MySQL, mas a teoria funciona para outras linguagens de programação também.

Como funciona a paginação?

O limite (limit) da consulta MySQL nos permite selecionar valores de duas formas:

  • Especificando um limite único;
  • Especificando a linha onde iniciar a contagem e o limite;

O segundo formato nos proporciona uma opção rápida para criar paginação no seguinte formato:

/* Mostra 10 começando do 0 */
SELECT * FROM tabela LIMIT 0,10;
/* Mostra 10 começando do 10 */ 
SELECT * FROM tabela LIMIT 10,10;
/* Mostra 10 começando do 20 */ 
SELECT * FROM tabela LIMIT 20,10;

No trecho de código acima, teríamos linhas sendo exibidas de 10 em 10.

No PHP, precisamos saber o seguinte:

  • Qual o total de linhas da consulta MySQL;
  • Quantas linhas serão exibidas por vez;
  • Qual o número de páginas serão exibidas para o usuário;

A última opção é necessária para que bases de dados muito grandes não exibam uma quantidade excessiva de números de páginas para o usuário, quebrando o layout do site.

Para obter o número total de página, basta dividirmos o número total de linhas pela quantidade de linhas exibidas por vez, assim podemos fazer um laço com o número total de página e exibir para o usuário final.

Cada página tem seu próprio link, que normalmente utiliza HTTP GET para obter o número da página atual. Sabendo tal número, podemos até mesmo estilizar cada número em um formato único, indicando que é a página atual para o usuário que está navegando pelo seu site.

O Google utiliza uma maneira muito peculiar para fazer isso, como todos já devem ter percebido.

Paginação do Google

Paginação do Google

É importante lembrar que a paginação depende da sua consulta e do sistema que está criando. Talvez o código que você vai ver neste artigo deva ser modificado para seu sistema, de maneira que se adapte às suas necessidades.

Vamos ver um pouco de código?

 Criando a base de dados, tabela e valores

Para o exemplo desse tutorial, vamos precisar de um servidor local onde possamos testar tudo o que estamos fazendo sem afetar um site em produção. Você pode fazer isso com o EasyPHP (tutorial abaixo):

Depois de instalado, podemos utilizar PDO para criar nossa base de dados, tabela e valores. Vou detalhar como criar tudo isso um pouco mais adiante neste artigo.

Criando as pastas

Vamos começar criando as pastas que vamos utilizar nesse tutorial, então faça o seguinte:

  • Abra a pasta “localweb” do seu EasyPHP (a pasta onde estão os arquivos disponíveis via HTTP);
  • Crie uma pasta chamada paginacao_simples;
  • Dentro da pasta paginacao_simples, crie outras duas pastas chamadas de “bd” e “functions“;

Cada um dos arquivos que vamos precisar vai dentro de uma das pastas acima, vou descrever onde colocá-los no momento de sua criação.

Arquivo de detalhes da conexão

Vamos criar um arquivo que contém apenas os detalhes da nossa conexão, assim podemos reutilizá-lo em cada uma das partes de nosso código, conforme necessário.

Abra seu editor de textos preferido e crie um arquivo com o seguinte código:

<?php
// Charset UTF-8
header('Content-Type: text/html; charset=utf-8');

// Detalhes da conexão
$servidor = 'localhost';
$usuario  = 'root';
$senha    = '';
$bd       = 'paginacao_tutsup';
$tabela   = 'noticias_exemplo';
$prefixo  = 'noticia_';
$charset  = 'utf8';

Salve este arquivo com o nome de “detalhes_conexao.php” dentro da pasta “bd“.

As variáveis acima contém as configurações padrão do EasyPHP, tais como o servidor, usuário e senha (em branco). Você deve modificar isso caso seu servidor tenha configurações diferentes.

O cabeçalho na linha 3 apenas indica que vamos utilizar UTF-8 como charset. Você pode alterar isso se preferir.

Observação importante: A função header do PHP não pode aparecer após algo ser exibido na tela, por isso, ao incluir este arquivo em outros arquivos, certifique-se de que nada foi exibido anteriormente.

Arquivo de configuração

Crie outro arquivo dentro da pasta “bd” chamado de “configura.php“. Este arquivo será temporário e servirá apenas para criar nossa base de dados, tabela e inserir os valores que vamos utilizar para testar.

Segue seu conteúdo:

<?php
// Inclui os detalhes da conexão
require 'detalhes_conexao.php';

// Tenta conectar e executar a configuração
try {
    // Cria o objeto da conexão PDO
    $conexao = new PDO("mysql:host=$servidor;charset=$charset;", $usuario, $senha);
    
    // Cria a base de dados e a tabela
    $verifica = $conexao->exec(
        "CREATE DATABASE IF NOT EXISTS `$bd`;
        GRANT ALL ON `$bd`.* TO '$usuario'@'localhost';
        FLUSH PRIVILEGES;
        CREATE TABLE IF NOT EXISTS `$bd`.`$tabela` (
          `{$prefixo}id` INT (11) NOT NULL AUTO_INCREMENT,
          `{$prefixo}titulo` VARCHAR (255),
          PRIMARY KEY (`{$prefixo}id`)
        ) CHARSET = $charset ;"
    );
    
    // Insere 50 valores na tabela
    for ( $i = 1; $i <= 50; $i++ ) {
        $conexao->exec("INSERT INTO `$bd`.`$tabela` ( `{$prefixo}id`, `{$prefixo}titulo` ) VALUES ( $i, 'Título $i' )");
    }
    
    // Verifica se tudo ocorreu conforme esperado
    if ( $verifica ) {
        echo 'Base de dados, tabela e valores inseridos com sucesso!';
    } else {
        // Caso contrário, mostra os detalhes do erro.
        echo 'Erro ao inserir dados. Detalhes:';
        $erro = $conexao->errorInfo();
        
        echo '<pre>';
        print_r( $erro );
        echo '</pre>';
    }
    
} catch(PDOException $e) {
    // Se não conectar, mostra o erro
    echo $e->getMessage();
    exit;
}

Observação: Se você quiser criar a base de dados, tabela e inserir os valores manualmente, este arquivo não será necessário.

Uma vez salvo, acesse este arquivo pelo seu navegador preferido e certifique-se de que os dados foram inseridos com sucesso. Caso verdadeiro, exclua-o.

Arquivo de conexão

Agora que já temos nossa base de dados, tabela e valores, vamos criar um arquivo chamado “conexao.php” (ainda dentro da pasta “bd”). Este arquivo será responsável por fazer a conexão com a base de dados utilizando PDO.

Veja seu conteúdo:

<?php
// Inclui os detalhes da conexão
require 'detalhes_conexao.php';

// Tenta conectar e executar a configuração
try {
    // Cria o objeto da conexão PDO
    $conexao = new PDO("mysql:host=$servidor;dbname=$bd;charset=$charset;", $usuario, $senha);    
} catch(PDOException $e) {
    // Se não conectar, mostra o erro
    echo $e->getMessage();
    exit;
}

 Criando a função de paginação

Ao invés de termos que criar uma paginação para cada parte do nosso sistema, vamos criar uma função genérica que gera os números pra gente. Vamos precisar apenas enviar os três valores: “Total de linhas”, “Linhas por página”, “Offset” (páginas a serem exibidas).

A função de paginação deve ser criada na pasta “functions”, em um arquivo chamado “paginacao.php”.

Veja seu conteúdo:

<?php
/**
 * Paginação
 *
 * Cria uma paginação simples.
 *
 * @param int $total_artigos Número total de artigos da sua consulta
 * @param int $artigos_por_pagina Número de artigos a serem exibidos nas páginas
 * @param int $offset Número de páginas a serem exibidas para o usuário
 *
 * @return string A paginação montada
 */
function paginacao( 
    $total_artigos = 0, 
    $artigos_por_pagina = 10, 
    $offset = 5
) {    
    // Obtém o número total de página
    $numero_de_paginas = floor( $total_artigos / $artigos_por_pagina );
    
    // Obtém a página atual
    $pagina_atual = 1;
    
    // Atualiza a página atual se tiver o parâmetro pagina=n
    if ( ! empty( $_GET['pagina'] ) ) {
        $pagina_atual = (int) $_GET['pagina'];
    }
    
    // Vamos preencher essa variável com a paginação
    $paginas = null;
    
    // Primeira página
    $paginas .= " <a href='?pagina=0'>Home</a> ";
    
    // Faz o loop da paginação
    // $pagina_atual - 1 da a possibilidade do usuário voltar
    for ( $i = ( $pagina_atual - 1 ); $i < ( $pagina_atual - 1 ) + $offset; $i++ ) {
        
        // Eliminamos a primeira página (que seria a home do site)
        if ( $i < $numero_de_paginas && $i > 0 ) {
            // A página atual
            $página = $i;
            
            // O estilo da página atual
            $estilo = null;
            
            // Verifica qual dos números é a página atual
            // E cria um estilo extremamente simples para diferenciar
            if ( $i == @$parametros[1] ) {
                $estilo = ' style="color:red;" ';
            }
            
            // Inclui os links na variável $paginas
            $paginas .= " <a $estilo href='?pagina=$página'>$página</a> ";
        }
        
    } // for

    $paginas .= " <a href='?pagina=$numero_de_paginas'>Última</a> ";
    
    // Retorna o que foi criado
    return $paginas;
    
}

Isso deve gerar algo parecido com a imagem abaixo quando executado.

Paginação simples

Paginação simples

Vamos executar essa função no arquivo index.php, o que descreverei posteriormente.

Arquivo principal (index.php)

O arquivo index.php fica na raiz da pasta “paginacao_simples” e comanda tudo, ou seja, inclui todos os arquivos que criamos anteriormente, executa a consulta principal e executa a função de paginação.

Veja seu código:

<?php
// Inclui a conexão PDO
require 'bd/conexao.php';
require 'functions/paginacao.php';

// Número de artigos por página
$artigos_por_pagina = 9;

// Página atual onde vamos começar a mostrar os valores
$pagina_atual = ! empty( $_GET['pagina'] ) ? (int) $_GET['pagina'] : 0;
$pagina_atual = $pagina_atual * $artigos_por_pagina;

// Cria a consulta para o MySQL e executa
$stmt = $conexao->prepare("SELECT * FROM $tabela LIMIT $pagina_atual,$artigos_por_pagina");
$stmt->execute();

// Mostra os valores
while( $f = $stmt->fetch() ) {
   echo $f["{$prefixo}titulo"] . '<br>';
}

// Pegamos o valor total de artigos em uma consulta sem limite
$total_artigos = $conexao->prepare("SELECT COUNT(*) AS total FROM $tabela");
$total_artigos->execute();
$total_artigos = $total_artigos->fetch();
$total_artigos = $total_artigos['total'];

// Exibimos a paginação
echo paginacao( $total_artigos, $artigos_por_pagina, 5 );

Veja nos comentários acima o que cada uma das linhas faz.

Com isso já devemos ter uma paginação funcionando em nosso sistema. Não é nada complicado, é?

Download da paginação simples

Se você quiser baixar tudo o que criamos anteriormente para analisar melhor, segue o link abaixo:

paginacao_simples.zip

Observação: O arquivo acima inclui tudo o que criamos acima, não abaixo.

Paginação com URLs amigáveis

No método que detalhei anteriormente a paginação funciona perfeitamente, porém nossas URLs são feias. Todas elas ficam mais ou menos assim:

http://127.0.0.1/index.php?pagina=4

Onde seria ideal criamos algo como:

http://127.0.0.1/pagina/4/

Para resolver este problemas, temos que modificar várias coisas em nosso sistema, a começar pelo arquivo .htaccess que ainda não existe.

.htaccess

Abra o seu editor de textos favoritos e crie um arquivo chamado .htaccess com o seguinte conteúdo:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule ^(.+)$ index.php?p=$1 [QSA,L]

Isso faz com que qualquer coisa adicionada em nossa URL que não seja um arquivo ou um diretório (algo que não exista, por exemplo), caia no parâmetro “p” do HTTP GET.

Por exemplo:

127.0.0.1/paginacao_simples/teste/de/parametros

É igual a:

127.0.0.1/paginacao_simples/index.php?p=teste/de/parametros

Função para obter os parâmetros

Isso nos leva a criar um novo arquivo chamado de “parametros.php” dentro da pasta “functions”. O novo arquivo terá o seguinte:

<?php
/**
 * Obtém parâmetros de $_GET['p']
 *
 * Obtém os parâmetros de $_GET['p'] e retorna um array.
 * A URL deverá ter o seguinte formato:
 * http://www.example.com/parametro1/valor/parametro2/valor/etc...
 *
 * @return array Os parâmetros
 */
function obter_parametros () {
    
    $p = array();
    
    // Verifica se o parâmetro path foi enviado
    if ( isset( $_GET['p'] ) ) {

        // Captura o valor de $_GET['p']
        $p = $_GET['p'];
        
        // Limpa os dados
        $p = rtrim($p, '/');
        $p = filter_var($p, FILTER_SANITIZE_URL);
        
        // Cria um array de parâmetros
        $p = explode('/', $p);
    }
    
    return $p;
}

Aqui estamos simplesmente explodindo o que encontramos no parâmetro $_GET[‘p’] e gerando um array com tudo.

Modificando o arquivo index.php

Agora precisamos incluir a função para obter os parâmetros em nosso arquivo index.php. Além disso, precisamos trocar tudo onde aparece $_GET para o novo parâmetro.

Veja:

<?php
// Inclui a conexão PDO
require 'bd/conexao.php';
require 'functions/paginacao.php';

/*** Arquivo adicionado ***/
require 'functions/parametros.php';

/*** Função executada ***/
// Obtém os parâmetros da URL amigável
$parametros = obter_parametros();

// Número de artigos por página
$artigos_por_pagina = 9;

/*** $_GET alterado ***/
// Página atual onde vamos começar a mostrar os valores
$pagina_atual = ! empty( $parametros[1] ) ? (int)$parametros[1] : 0;
$pagina_atual = $pagina_atual * $artigos_por_pagina;

// Cria a consulta para o MySQL e executa
$stmt = $conexao->prepare("SELECT * FROM $tabela LIMIT $pagina_atual,$artigos_por_pagina");
$stmt->execute();

// Mostra os valores
while( $f = $stmt->fetch() ) {
   echo $f["{$prefixo}titulo"] . '<br>';
}

// Pegamos o valor total de artigos em uma consulta sem limite
$total_artigos = $conexao->prepare("SELECT COUNT(*) AS total FROM $tabela");
$total_artigos->execute();
$total_artigos = $total_artigos->fetch();
$total_artigos = $total_artigos['total'];

// Exibimos a paginação
echo paginacao( $total_artigos, $artigos_por_pagina, 5 );

Perceba nos comentários acima o que foi modificado.

Alterando nossa função de paginação

Também precisaremos alterar nossa função de paginação, se não fizermos isso nossas URLs não vão funcionar perfeitamente.

<?php
/**
 * Paginação
 *
 * Cria uma paginação simples.
 *
 * @param int $total_artigos Número total de artigos da sua consulta
 * @param int $artigos_por_pagina Número de artigos a serem exibidos nas páginas
 * @param int $offset Número de páginas a serem exibidas para o usuário
 *
 * @return string A paginação montada
 */
function paginacao( 
    $total_artigos = 0, 
    $artigos_por_pagina = 10, 
    $offset = 5
) {

    /*** Precisamos dos parâmetros aqui dentro da função ***/
    // Obtém os parâmetros
    global $parametros;
    
    /*** Vamos precisar de uma variável contendo a URL da home do site ***/
    // A URL da nossa home
    $url_site = 'http://127.0.0.1/cursos/php/paginacao';
    
    // Obtém o número total de página
    $numero_de_paginas = floor( $total_artigos / $artigos_por_pagina );
    
    // Obtém a página atual
    $pagina_atual = 1;
    
    /*** GET alterado ***/
    // Atualiza a página atual se tiver o parâmetro pagina/valor
    if ( 
        ( ! empty( $parametros[0] ) && $parametros[0] == 'pagina' ) &&
        ( ! empty( $parametros[1] ) )
    ) {
        $pagina_atual = (int)$parametros[1];
    }
    
    // Vamos preencher essa variável com a paginação
    $paginas = null;
    
    /*** URL alterada ***/
    // Primeira página
    $paginas .= " <a href='$url_site/pagina/0'>Home</a> ";
    
    // Faz o loop da paginação
    // $pagina_atual - 1 da a possibilidade do usuário voltar
    for ( $i = ( $pagina_atual - 1 ); $i < ( $pagina_atual - 1 ) + $offset; $i++ ) {
        
        // Eliminamos a primeira página (que seria a home do site)
        if ( $i < $numero_de_paginas && $i > 0 ) {
            // A página atual
            $página = $i;
            
            // O estilo da página atual
            $estilo = null;
            
            // Verifica qual dos números é a página atual
            // E cria um estilo extremamente simples para diferenciar
            if ( $i == @$parametros[1] ) {
                $estilo = ' style="color:red;" ';
            }
            
            /*** URL alterada ***/
            // Inclui os links na variável $paginas
            $paginas .= " <a $estilo href='$url_site/pagina/$página'>$página</a> ";
        }
        
    } // for
    
    /*** URL alterada ***/
    $paginas .= " <a href='$url_site/pagina/$numero_de_paginas'>Última</a> ";
    
    // Retorna o que foi criado
    return $paginas;
    
}

Veja nos comentários acima o que foi alterado.

Download da paginação com URL amigável

Caso queira baixar o trecho que criamos no trecho anterior, sinta-se à vontade:

paginacao.zip

Altere conforme preferir.

Concluindo

A paginação depende da sua consulta e do modo com que você deseja que ela seja feita, este tutorial visa exemplificar como as coisas são feitas para que você tenha uma base para criar seu próprio sistema de paginação em PHP.

Você pode utilizar o código dos exemplos caso queira, porém, tente compreender o que foi descrito primeiro.

Em caso de dúvidas, não hesite em comentar.

Volta e meia precisamos encontrar imagens HTML dentro de nosso código, seja para substituir valores, para alterar endereços ou até mesmo nomes de imagens. Com expressões regulares podemos fazer isso em tempo real, sem a necessidade de alterar o conteúdo original. Com elas é possível ler o conteúdo, encontrar e/ou substituir valores de maneira simples e rápida, você só precisa saber o que está fazendo.

Especificamente para este artigo, vou explicar como encontrar e mostrar todos os endereços de tags de imagens (src). Também vou mostrar como encontrar e substituir o endereço da imagem, o que é muito útil para pessoas que trocam de domínio, por exemplo, e querem substituir apenas o domínio da imagem, deixando o nome do arquivo intacto.

Nós já falamos sobre expressões regulares aqui no Tutsup, tanto para PHP quando para JavaScript. Caso não tenha afinidade com este recurso da linguagem, não hesite em ler os artigos abaixo:

Se você já trabalha com isso e sabe do que estou falando, vamos lá.

Um HTML genérico

Vamos utilizar um HTML genérico para todos os nossos exemplos. Para isso, vou criar uma variável PHP que vai receber tal valor.

<?php
// Um HTML de exemplo
$html = '<p>Lorem ipsum dolor...</p>
<img class="lorem ipsum" src="https://exemplo.com/img.jpg" />
<p>Lorem ipsum dolor...</p>
<p>       <IMG class="lorem ipsum" src="http://www.exemplo.com/img.jpg" /> </p>
<p>Lorem ipsum dolor...</p>
<img class="lorem ipsum" src="http://www.exemplo.com/img.PNG" id="img" />
<p>Lorem ipsum dolor...</p>
<img class="lorem ipsum" src='img.jpg' style="width: 100%;">
<p>Lorem ipsum dolor...</p>
<img  src="http://www.exemplo.com/img.gif">
<p>Lorem ipsum dolor...</p>';

Perceba que utilizei vários estilos para nossas tags de imagens, justamente para garantir que nossa expressão regular vai encontrar imagens independente do modo que o HTML foi escrito.

Encontrando as imagens

Se você deseja apenas encontrar as imagens e fazer qualquer coisa que preferir com seu valor, preg_match_all é a função recomendada para você.

Essa função vai encontrar todas as ocorrências da sua expressão regular em um determinado valor.

Veja a expressão regular que vamos utilizar:

// Procura pelas imagens e retorna um array
// Obs: Se algo for encontrado, estará no índice 2 do array $imgs
preg_match_all(
    '/(<img.*?src=['|"])' . // A tag da imagem até src=' ou "
    '([^'|"]*)'           . // O endereço
    '(['|"].*?/?>)'     . // Fechamendo do src e o resto da tag de imagem
    '/mi',                   // PCRE_MULTILINE e PCRE_CASELESS 
    $html,                   // O HTML
    $imgs                    // Um array do que foi encontrado
);

Como queremos apenas o endereço das imagens, precisamos criar grupos para cada trecho da imagem. Para este exemplo, se algum endereço de imagem for encontrado, seu valor estará no índice 2 (dois) do array $imgs. Veja como capturar seu valor:

// Primeiro vamos verificar se algo foi encontrado
if ( ! empty( $imgs ) && ! empty( $imgs[2] ) ) {

    // Agora vamos fazer o laço e mostrar os endereços encontrados
    // Você pode fazer o que preferir aqui, é apenas exemplo
    foreach ( $imgs[2] as $endereco_img ) {
        echo $endereco_img . '<br>';
    }
    
}

Com isso você verá o endereço de todas as imagens encontradas.

Detalhando a expressão regular

Entenda como funciona a expressão regular que criamos:

Primeiramente veja que concatenamos o valor:

'/(<img.*?src=['|"])' .
'([^'|"]*)'           .
'(['|"].*?/?>)'     .
'/mi'

Isso é o mesmo que:

'/(<img.*?src=['|"])([^'|"]*)(['|"].*?/?>)/mi'

Cada desenvolvedor prefere fazer isso de um modo. Particularmente, faço assim porque acho que fica mais fácil para ler e entender posteriormente.

Veja a expressão detalhada:

  • / – Abra o delimitador;
  • (<img.*?src=[‘|”]) – Encontra <img + qualquer coisa + src= + aspa simples ou aspa dupla;
  • ([^’|”]*) – É o endereço da imagem. Qualquer coisa que não seja aspa simples ou dupla.
  • ([‘|”].*?/?>) – Encontra tudo o que vem depois da aspa que fecha o src até > (fechamento da tag de imagem). O caractere / (barra) é opcional.
  • / – Fecha o delimitador;
  • mi – O “m” significa que a função deve procurar em todas as linhas. O “i” significa que a expressão regular serve tanto para letras maiúsculas quanto minúsculas.

Código de exemplo completo

Veja como ficou o código completo:

<?php
// Um HTML de exemplo
$html = '<p>Lorem ipsum dolor...</p>
<img class="lorem ipsum" src="https://exemplo.com/img.jpg" />
<p>Lorem ipsum dolor...</p>
<p>       <IMG class="lorem ipsum" src="http://www.exemplo.com/img.jpg" /> </p>
<p>Lorem ipsum dolor...</p>
<img class="lorem ipsum" src="http://www.exemplo.com/img.PNG" id="img" />
<p>Lorem ipsum dolor...</p>
<img class="lorem ipsum" src='img.jpg' style="width: 100%;">
<p>Lorem ipsum dolor...</p>
<img  src="http://www.exemplo.com/img.gif">
<p>Lorem ipsum dolor...</p>';

// Procura pelas imagens e retorna um array
// Obs: Se algo for encontrado, estará no índice 2 do array $imgs
preg_match_all(
    '/(<img.*?src=['|"])' . // A tag da imagem até src=' ou "
    '([^'|"]*)'           . // O endereço
    '(['|"].*?/?>)'     . // Fechamendo do src e o resto da tag de imagem
    '/mi',                   // PCRE_MULTILINE e PCRE_CASELESS 
    $html,                   // O HTML
    $imgs                    // Um array do que foi encontrado
);

// Primeiro vamos verificar se algo foi encontrado
if ( ! empty( $imgs ) && ! empty( $imgs[2] ) ) {

    // Agora vamos fazer o laço e mostrar os endereços encontrados
    // Você pode fazer o que preferir aqui, é apenas exemplo
    foreach ( $imgs[2] as $endereco_img ) {
        echo $endereco_img . '<br>';
    }
    
}

 Observação: Neste caso, a tag de fechamento do PHP não é necessária.

Substituindo o domínio de imagens

Você pode utilizar a mesma ideia para substituir o domínio das imagens do seu conteúdo HTML, porém, agora a função que vamos utilizar é a preg_replace.

O legal da função preg_replace é que você pode utilizar referências numéricas no formato \n ou $n para substituir o valor pelo local que ela foi encontrada. Basicamente, se você procurou por grupos, o grupo um estará disponível em \1, o grupo dois em \2… e assim por diante.

Isso nos leva a modificar um pouco os grupos da nossa expressão regular anterior, veja:

// Procura pelas imagens e retorna um array
// Obs: Se algo for encontrado, estará no índice 2 do array $imgs
$html = preg_replace(
    '/(<img.*?src=['|"]*.?)'                 . // A tag da imagem até src=' ou "
    '(https?://(w{3,}.)?exemplo.com/?)' . // Endereço do site
    '(.*?[jpg|jpeg|png|gif|bmp])'             . // A imagem
    '(['|"].*?/?>)'                        . // Resto da imagem
    '/mi',                                      // PCRE_MULTILINE e PCRE_CASELESS
    '\1http://www.novoendereco.com/\4\5',    // Novo endereço
    $html                                       // O HTML
);

Agora adicionamos um grupo para o domínio (grupo 2) e um para o arquivo da imagem (grupo 3).

Detalhando a expressão regular

Veja como ficou:

 

  • / – Abra o delimitador;
  • (<img.*?src=[‘|”]) – Encontra <img + qualquer coisa + src= + aspa simples ou aspa dupla;
  • (https?://(w{3,}.)?exemplo.com/?) – Encontra qualquer endereço web (domínio). Apenas lembre-se de modificar “exemplo.com” para o domínio do seu site (indicando a pasta de imagens). E não se esqueça, você deve colocar uma barra invertida para cada ponto.
  • (.*?[jpg|jpeg|png|gif|bmp]) – Encontra qualquer coisa que termine com jpg, jpeg, png, gif e bmp;
  • ([^’|”]*) – É o endereço da imagem. Qualquer coisa que não seja aspa simples ou dupla.
  • ([‘|”].*?/?>) – Encontra tudo o que vem depois da aspa que fecha o src até > (fechamento da tag de imagem). O caractere / (barra) é opcional.
  • / – Fecha o delimitador;
  • mi – O “m” significa que a função deve procurar em todas as linhas. O “i” significa que a expressão regular serve tanto para letras maiúsculas quanto minúsculas.

O valor a ser substituído ficou assim:

  • \1
  • http://www.novoendereco.com/
  • \4
  • \5

Você só precisará substituir o endereço acima para o novo domínio com a pasta de imagens.

Código de exemplo completo

Veja como ficou:

<?php
// Um HTML de exemplo
$html = '<p>Lorem ipsum dolor...</p>
<img class="lorem ipsum" src="https://exemplo.com/img.jpg" />
<p>Lorem ipsum dolor...</p>
<p>       <IMG class="lorem ipsum" src="http://www.exemplo.com/img.jpg" /> </p>
<p>Lorem ipsum dolor...</p>
<img class="lorem ipsum" src="http://www.exemplo.com/img.PNG" id="img" />
<p>Lorem ipsum dolor...</p>
<img class="lorem ipsum" src='img.jpg' style="width: 100%;">
<p>Lorem ipsum dolor...</p>
<img  src="http://www.exemplo.com/img.gif">
<p>Lorem ipsum dolor...</p>';

// Procura pelas imagens e retorna um array
// Obs: Se algo for encontrado, estará no índice 2 do array $imgs
$html = preg_replace(
    '/(<img.*?src=['|"]*.?)'                 . // A tag da imagem até src=' ou "
    '(https?://(w{3,}.)?exemplo.com/?)' . // Endereço do site
    '(.*?[jpg|jpeg|png|gif|bmp])'             . // A imagem
    '(['|"].*?/?>)'                        . // Resto da imagem
    '/mi',                                      // PCRE_MULTILINE e PCRE_CASELESS
    '\1http://www.novoendereco.com/\4\5',    // Novo endereço
    $html                                       // O HTML
);

// Mostra o novo HTML
echo $html;
?>

Você pode manipular isso conforme preferir.

Concluindo

Expressões regulares são divertidas (mas podem ser um tanto complexas também). Brinque com elas, tire dúvidas, pergunte, seja curioso, assim você vai entender como tudo isso funciona.

E por falar em dúvidas, pergunte conforme preferir, estamos aqui para ajudar.

Quando você cria uma aplicação completa em PHP, em algum momento será necessário copiar arquivos de uma pasta para outra, e nessa hora a função copy vai ajudar (e muito) o seu desenvolvimento.

Ela recebe apenas dois parâmetros (três, na verdade), o arquivo a ser copiado e o destino para o qual você está o enviando.

bool copy ( string $fonte, string $destino [, resource $contexto ] )

Veja a descrição dos parâmetros da função copy:

  • fonte – Caminho para o arquivo de origem.
  • destino – O caminho de destino. Se o destino for uma URL, a cópia pode falhar se o wrapper não suportar a sobrescrita de arquivos existentes.
  • contexto – Um válido resource de contexto criado com stream_context_create().

A função irá retornar true caso o arquivo seja copiado com sucesso. Em caso de falha, além de retornar false, irá lançar um erro descrevendo que não pode copiar o arquivo. Você pode utilizar o operador de controle de erros @ para ocultar os erros da função, mas lembre-se, isso é um típico caso onde você esconde os erros sabendo que eles podem ocorrer, e essa não é a melhor prática. Saiba mais sobre os erros no PHP em nossos artigos:

Como você pode ver nos parâmetros acima, você pode até mesmo copiar arquivos remotos utilizando uma URL (tanto para fonte quando destino).

Veja exemplos para copiar um arquivo de uma pasta para outra utilizando copy em PHP:

<?php
$imagem = 'imagens/imagem.jpg';
$nova_imagem = 'novas_imagens/novo_nome.jpg';

if ( @copy( $imagem, $nova_imagem ) ) {
    echo 'Arquivo copiado.';
} else {
    echo 'Arquivo não copiado.';
}
?>

Agora  veja outro exemplo, porém com arquivo remoto:

<?php
$imagem = 'http://www.exemplo.com/imagens/imagem.jpg';
$nova_imagem = 'novas_imagens/novo_nome.jpg';

if ( @copy( $imagem, $nova_imagem ) ) {
    echo 'Arquivo copiado.';
} else {
    echo 'Arquivo não copiado.';
}
?>

Simples assim!

Caso tenha alguma dúvida sobre o que eu descrevi acima, não hesite em deixar o seu comentário.

Até o próximo tutorial!

Uma função extremamente útil do PHP é a getimagesize, que retorna o tamanho das imagens (width e height) em pixels. Porém, além do tamanho, ela também irá retornar uma informação muito útil para quem deseja validar ou precisa saber o MIME Type do arquivo.

O MIME Type irá indicar exatamente qual o formato daquele arquivo para que o software que estiver tentando exibi-lo saiba renderizar seu conteúdo corretamente.

Utilizamos a função getimagesize em nossa classe “TPEpubCreator” (que cria e-books no formato EPUB com PHP) para gerar os arquivos de conteúdo do livro, saiba mais em:

Mas deixando de conversa, vamos ao que realmente interessa.

Observação: Existem outras funções para este fim, mas estou passando getimagesize porque acho ela mais útil e simples neste momento.

MIME Type de imagens em PHP

Veja como é simples:

<?php
// Especifique o caminho da imagem
$imagem = getimagesize( 'imagem.jpg' );

// Obtenha o mimetype
echo $imagem['mime']; // image/jpeg
?>

Simplesmente especifique o caminho da imagem para a função getimagesize e acesse a chave “mime” do array gerado.

Por falar em array, veja como ver tudo o que é retornado pela função:

<?php
// Especifique o caminho da imagem
$imagem = getimagesize( 'imagem.jpg' );

// Ver tudo sobre o array retornado
echo '<pre>';
print_r( $imagem );
echo '</pre>';
?>

Com isso você verá o seguinte:

Array
(
    [0] => 150
    [1] => 150
    [2] => 2
    [3] => width="150" height="150"
    [bits] => 8
    [channels] => 3
    [mime] => image/jpeg
)

Vou descrever o conteúdo do array:

  • O índice 0 (zero) contém a largura da imagem em pixels;
  • O índice 1 (um) contém a altura;
  • O índice 2 (dois) é uma indicação do tipo de imagem: 1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF, 5 = PSD, 6 = BMP, 7 = TIFF(intel byte order), 8 = TIFF(motorola byte order), 9 = JPC, 10 = JP2, 11 = JPX, 12 = JB2, 13 = SWC, 14 = IFF, 15 = WBMP, 16 = XBM. Estes valores correspondem as constantes IMAGETYPE que foram adicionadas no PHP 4.3.
  • O índice 3 é uma string com o height=”yyy” width=”xxx” correto que pode ser usado diretamente numa tag IMG;
  • Também temos o índice “bits”, que é o número de bits para cada cor;
  • O índice “channels”, que será 3 para imagens RGB e 4 para imagens CMYK;
  • E por fim, o índice “mime”, que corresponde ao tipo MIME (MIME Type) da imagem.

Essa função é tão interessante, que você pode obter valores até mesmo de imagens remotas, como por exemplo:

<?php
$imagem = getimagesize( 'https://www.todoespacoonline.com/w/wp-content/uploads/2014/09/wordpress-logo1-150x150.jpg' );
echo $imagem['mime']; // image/jpeg
?>

Ajuda bastante.

Caso tenha alguma dúvida, sugestão ou crítica, basta comentar aí abaixo.

Até o próximo tutorial.