Tutorial PHP: variáveis, constantes e tipagem de dados

Blog Sobre tecnologia

Tutorial PHP: variáveis, constantes e tipagem de dados

Tutorial PHP: constantes, variaveis e tipagem de dados

Neste Tutorial PHP, falaremos um pouco sobre as variáveis e constantes no PHP, o que nos remete também a tipagem de dados.

Vimos no último post os tipos de dados com os quais o PHP pode lidar (caso não tenha lido, clique aqui), isso é importante para sabermos o que acontece com nossas variáveis e constantes.

Começaremos falando de constantes e variáveis.

 

Constantes

Como o nome já diz, uma constante é um valor fixo, ou seja, que não poderá ser alterado durante a execução do script. É muito útil quando precisamos fixar algum valor no nosso código, seja um valor de PI, um endereço de um banco de dados etc.

Um exemplo:

<?php
define('PI', 3.14159265359);
$raio = 10;
$areaCirculo = PI * pow($raio, 2);
echo $areaCirculo;

 

O código acima calcula a área de um círculo com raio 10. Veja que o valor de PI sempre será o mesmo, então pode ser definido em uma constante.

As constantes podem ser definidas de duas formas distintas:

<?php
define('CONSTANTE', 'valor');

// Ou
const CONSTANTE = 'valor'; // Sendo esta mais usada em constantes de classe

 

Um outro exemplo, agora para um arquivo de configuração para banco de dados:

<?php
define('DB_HOST', 'mysql.localhost');
define('DB_USER', 'usuario');
define('DB_PASS', '123');

 

Observemos que temos três constantes, como estas informações não são variáveis, ou seja, não precisam ser alteradas durante a execução do script, não é necessário colocarmos ela em uma variável.

 

Segundo o PSR-1, constantes devem ser declaradas utilizando-se sempre letras maiúsculas, quando seu nome for composto, utilizamos underscore (famoso underline) separando as palavras, exemplos:

<?php

namespace App\Exemplo;

class ExemploConstante
{
    const PI = 3.14;
    const SIS_VERSION = 1.0;
}
<?php
define('PI', 3.14);
define('SIS_VERSION', 1.0);

 

Variáveis

As variáveis são espaços reservados na memória para armazenamento de dados variáveis, ou seja, que recebem a atribuição de valores em tempo de execução. Sendo assim seu valor pode ser alterado a qualquer momento durante a execução do script.

Em PHP toda variável deve ser precedida pelo símbolo do cifrão ($), isto indica que aquela palavra é uma variável.

Vejamos um exemplo:

<?php
// Estas medidas poderiam vir de um banco de dados, ou de um formulário
// e serem atribuídas às variáveis
$largura = 10;
$altura = 10;
$profundidade = 10;

// Calcula o volume de um cubo
$volumeCubo = $largura * $altura * $profundidade;

// Soma a altura de dez cubos
$soma = 0;
for($i = 1; $i <= 10; $i++){
    $soma += $altura; // Acumula a soma da altura na variável $soma
}

 

 

O nome das variáveis deve ser algo coerente com o conteúdo da variável, ou seja, precisamos evitar ao máximo o uso de variáveis com nomes como $var1, $var2 etc, isso torna nosso código menos coeso, por consequência se precisarmos fazer uma manutenção futuramente corremos o risco de não entender nosso próprio código.

O nome de uma variável pode conter letras e números, mas nunca pode iniciar com um número, sendo assim o nome a seguir é possível:

$variavel1 = '';

 

Porém o seguinte não:

$1variavel = '';

 

 

Variáveis variáveis

Ainda neste âmbito, no PHP temos o recurso de utilizar variáveis variáveis, isso significa que podemos criar uma variável com um nome vindo de outra variável, exemplo:

<?php

$a = 'foo';
$$a = 'bar';

echo $a; // Irá imprimir em tela "foo"
echo $foo; // Irá imprimir em tela "bar"

 

Se observarmos acima, podemos notar que a variável foo não foi declarada explicitamente, mas, como o valor da variável $a é “foo“, colocando um cifrão adicional antes da variável, estamos dizendo ao PHP que o nome desta nova variável será o valor da variável $a, sendo assim temos a declaração implícita da variável $foo.

 

Tá… mas onde usamos isso?

Suponhamos que estamos desenvolvendo um sistema qualquer, e que neste sistema, o usuário poderá criar fórmulas personalizadas utilizando campos dinâmicos num banco de dados, notas em um sistema de gestão escolar, por exemplo.

Notemos que diferentes escolas podem ter diferentes avaliações, e diferentes formas de obtenção da média final. Vejamos:

Escola A:

IDnotaabrev
1Trabalho MensalTM
2Prova 1P1
3Prova 2P2
4ComplementarC

Média: (TM * 0.5 +P1 + P2 + C * 0.5) / 3

Escola B:

IDnotaabrev
1Prova 1P1
2CadernoCAD
3PesquisaPES

Média: (P1 + (CAD + PES) * 0.5 )  / 2

Analisando bem as duas escolas acima, e levando em consideração que nosso sistema pode ser instalado em n escolas com formas de avaliação totalmente diferentes, com fórmulas completamente diferentes também, faz sentido termos as variáveis variáveis, as quais poderíamos utilizar para “declarar” variáveis com o nome de cada nota do aluno recebendo seu valor e no final executar a fórmula vinda do banco de dados utilizando a função eval()*.

Uma possível solução para o problema sugerido acima seria algo do gênero:

<?php

    // Rotina que recebe as notas do aluno vindas de um formulário
    // Para efeito didático o formulário será omitido e utilizaremos um
    // código  sem orientação a objetos
    $notas = array();

    // Aqui teríamos uma rotina que traria a fórmula de cálculo do banco de dados
    // Para efeito de exemplo iremos inserir diretamente a fórmula no código
    $formula = '($P1 + ($CAD + $PES) * 0.5 )  / 2';

    // Este trecho "filtra" os valores vindos do formulário
    // Evitando possíveis valores que possam significar uma quebra do nosso código
    // e também, possíveis ataques
    foreach($_POST as $key=>$valor){
        $notas[$key] = filter_input(INPUT_POST, $key, FILTER_SANITIZE_NUMBER_FLOAT);
    }

    // Aqui acontece toda a mágica
    // Todas as notas contidas no array $notas, serão convertidas em variáveis variáveis,
    // com os nomes de cada chave ($key), que por sua vez vieram dos campos do formulário
    foreach($notas as $key=>$valor){
        $$key = $valor;
    }


    // Para finalizar o script, calculamos a média do aluno
    $media = eval('return ' . $formula . ';');

    // Rotina que irá salvar as notas no banco de dados

 

 

Variáveis super-globais

Para finalizar a parte de variáveis, vamos falar um pouco das variáveis super-globais, estas variáveis são internas do PHP e estão acessíveis em todos os escopos e em todo o script, as variáveis super-globais disponíveis são:

  • $GLOBALS
  • $_SERVER
  • $_GET
  • $_POST
  • $_FILES
  • $_COOKIE
  • $_SESSION
  • $_REQUEST
  • $_ENV

Todas elas são arrays, sendo assim dentro delas temos vários parâmetros em cada uma, podermos também criar nossos próprios parâmetros, o que será visto mais a frente em nossa série.

 

O PSR só tem uma recomendação com relação a variáveis, que é que manter o mesmo padrão para todo o projeto, porém o praticado pela maioria dos profissionais é utilizar o camel case, ou seja, o nome da variável iniciando em letra minúscula, e caso seja um nome composto, a primeira letra de cada palavra subsequente maiúscula, por exemplo:

$variavel
$variavelComCamelCase

 

 

Tipagem

Toda variável recebe um conteúdo, e este conteúdo tem um tipo, que pode ser, entre outros, string, inteiro, real, booleano, conforme vimos no nosso último post. Este tipo, basicamente, diz quanto de espaço alocado em memória esta variável precisará, e o que pode ser feito com esta informação alocada neste espaço da memória.

Com relação a tipagem, podemos considerar 4 características, das quais uma linguagem se enquadrará em duas simultaneamente.

Destas 4 características, 2 delas são relacionadas a determinação do tipo da variável, e as outras 2 ao que se pode fazer com o conteúdo das variáveis.

 

Determinação do tipo de dados (Inferência de tipo)

Neste aspecto temos a tipagem estática e a tipagem dinâmica.

A tipagem estática nos obriga a informar o tipo da variável explicitamente no momento em que a declaramos, e uma vez declarada com um tipo de dados, este tipo não mudará.

Já na tipagem dinâmica, a linguagem de programação identifica o tipo da variável pelo valor associado a ela.

O que pode ser feito com a variável

Já neste caso, temos duas classificações, tipagem forte ou tipagem fraca (flexível).

Uma linguagem de programação é considerada de tipagem forte, quando esta não permite que se façam determinadas operações com variáveis cujo tipo não permite esta operação, por exemplo, quando tentamos somar dois textos.

Ao passo que uma linguagem é considerada de tipagem fraca quando esta permite que as operações mencionadas no paragrafo anterior possam ser realizadas, em alguns casos isso permite uma flexibilidade maior, porém uma linguagem com esta tipagem sempre exige mais atenção do programador para evitar aberrações no código.

Um exemplo, sem levar em consideração a linguagem de programação usada:

int var1 = 1;
String var2 = "1";

int var3 = var1 + var2; // Esta operação geraria um erro, pois tentamos somar um texto com um inteiro

 

No código acima, o código nem compilaria, pois tentamos realizar uma operação que é incompatível com uma variável do tipo String (uma soma).

Se escrevermos o mesmo código em PHP, que é uma linguagem com tipagem fraca (flexível):

<?php
va1 = 1;
var2 = "1";

var3 = var1 + var2; // Neste caso a operação funcionaria

 

No código acima, a operação funcionaria, porém, conforme dito antes, é necessário uma atenção maior do programador, pois este comportamento pode gerar resultados inesperados.

Uma linguagem com tipagem fraca não significa que a linguagem em si é fraca, muito pelo contrário, significa sim, que a forma como esta linguagem trabalha com os tipos de dados é mais flexível do que a forma que uma linguagem com tipagem forte trabalharia, sendo assim, muitas vezes a torna mais robusta.

 

E… Onde o PHP fica?

O PHP é uma linguagem com tipagem dinâmica e fraca, sendo assim, o tipo de dados das variáveis é definido pelo PHP no momento em que esta variável recebe um valor, e ele permite executar operações entre as variáveis, mesmo que o tipo destas variáveis seja incompatível com a operação.

Sendo assim, o seguinte é possível no PHP:

<?php

$a = 5;
$b = '7';

echo $a+$b; // O Resultado impresso em tela para essa operação será 12

 

Note que mesmo uma variável recebendo um inteiro e a outra recebendo uma string a operação foi realizada.

E se fizermos isso:

<?php

$a = 5;
$b = 'teste';

echo $a+$b;

 

Neste caso o resultado seria 5, pois uma string que não possui um número é convertida para 0, a menos que ela comece com um valor numérico, ou seja, se nossa variável $b tivesse o valor ‘5teste’, este 5 seria somado ao valor da variável $a, e o restante da string seria ignorado.

Este comportamento pode trazer benefícios, visto sua flexibilidade, porém exige bem mais atenção por parte do programador, visto que poderia acontecer algo do tipo:

<?php

$a = 5;
$b = new DateTime();

echo $a+$b;

Como retorno teríamos um aviso do PHP faltando que o objeto não pode ser convertido em inteiro, e ao valor de $a seria somado 1;

A saída completa seria esta:

> php -r "echo 5 + new DateTime();"
PHP Notice: Object of class DateTime could not be converted to int in Command line code on line 1
PHP Stack trace:
PHP 1. {main}() Command line code:0
6

 

Notemos que mesmo gerando um aviso, o código foi executado, e, a depender da configuração de erros no php.ini, este aviso pode nem mesmo ser exibido, ocultando assim um possível bug em nosso código.

 

* Sobre a função eval() usada nas variáveis variáveis

Esta função recebe como parâmetro uma string e a interpreta como se fosse uma função do PHP, no nosso caso teríamos o resultado do cálculo da média, vejamos um possível exemplo:

<?php

// Qualquer rotina que traga a fórmula do banco de dados
$formula = '';

$media = eval('return ' . $formula . ';');

 

Vale a pena notarmos que existe ali dentro do parâmetro do eval() executa uma string como um código PHP. Porém, quando precisamos que, além de ele executar o código, também retorne para a gente algum dado vindo deste código, usamos o comando return (como no exemplo acima).

 

Bom, ficaremos por aqui, por enquanto, espero que o tutorial PHP de hoje tenha sido útil, se foi, compartilhe, pode ser útil para mais alguém.

Acha que faltou algo?

Deixe nos comentários, será agregado ao post com os devidos créditos.

Sobre Rodrigo Teixeira Andreotti

Técnico em Informática formado pela ETE Lauro Gomes Cursando atualmente o curso de Análise e Desenvolvimento de sistemas. Atuo como programador PHP há, pelo menos, 6 anos, sendo os dois últimos em empresas e os demais como Freelancer.