PHP para Iniciantes: Variáveis - Variáveis Pré-definidas

Agora que você já sabe atribuir e capturar valores de uma variável, está na hora de falar sobre algumas variáveis "mágicas" que são criadas do nada pelo interpretador de acordo com o ambiente de execução.

Como assim de acordo com o ambiente, Kiko?

Então, até aqui eu mencionei umas três formas de rodar um código PHP, certo? Vamos refrescar a memória:

  • via CLI: php diretorio/seu-arquivo.php;
  • via WebServer do PHP: php -S localhost:8080 -> http://localhost:8080
  • via outros WebServers, por exemplo, NGINX, Apache, etc.

Além disso tudo, se você quiser fazer uns testes em várias versões do PHP, tem um site bem bacana que uso para isso, o PHP Sandbox. É só jogar o código do script na caixinha, escolher a versão e rodar. É similar a executar o PHP via CLI, pois não tem nenhum webserver para servir mais arquivos.

Por que tu não me mostrou esse site antes, Kiko?!

Pra você praticar um pouco com webservers! Afinal, esse site serve mais para validar códigos em diferentes versões do que testar algo, propriamente dito. Use com sabedoria, rs.

Continuando... Todas essas formas de rodar um script PHP acabam gerando contextos diferentes. Por exemplo, enquanto em ambientes voltados para comunicação web você recebe algumas informações de requisição, em outro voltado para CLI você deve receber, no máximo, alguns argumentos de entrada.

Por isso, é preciso estar sempre ciente sobre quem vai estar consumindo sua aplicação. Geralmente você vai ter um webserver e um console. Sim, os dois na mesma aplicação.

E você precisa organizar seu código de tal forma que um arquivo do console jamais tente consultar uma variável pré-definida em contexto web. Tem várias formas de se fazer isso, mas o foco desse artigo é sobre as tais variáveis que surgem milagrosamente para tentar nos ajudar.

Há uma tabela bem rica mencionando algumas dessas variáveis na documentação oficial do PHP: https://www.php.net/manual/pt_BR/reserved.variables.php. E conforme lá consta um aviso, também vou mencionar: o número de variáveis pré-definidas é tão grande que é inviável documentar. Mencionaremos então as mais importantes. Bora?!

Variáveis de contexto web

Quando falamos de back-end para web, a primeira estrutura que os desenvolvedores PHP pensam é em REST, sem querer generalizar. Acontece que REST é bem simples de se entender:

  • quem está acionando sua rota diz o verbo, o arquivo e as informações necessárias;
  • você que recebe, valida tudo isso e dá a resposta mais adequada.

FIM

Mas aí eu te disse três coisas:

  • verbo?? GET, POST, PUT, DELETE, PATCH, OPTION...?
  • arquivo?? diretório, arquivo...?
  • informações??? query, body, header...?!?

Tudo isso que mencionei são algumas palavras importantes para aplicações RESTful. Se você desconhece, recomendo a leitura! E, como você já deve estar imaginando, todas essas informações são coletadas pelo interpretador. São, de fato, dados que precisam estar acessíveis ao nosso código para que possamos usar as informações que nos passaram, concorda?

Então, falando em web, as variáveis pré-definidas que surgem em todas as conexões, quando há alguma informação nelas, são:

  • $_GET: informações enviadas em query no verbo GET;
  • $_POST: informações enviadas em body no verbo POST;
  • $_FILES: informações de arquivos anexados na requisição;
  • $_REQUEST: informações enviadas na requisição, independente do verbo;
  • $_SESSION: informações capturadas na sessão, se existir;
  • $_ENV: informações de variáveis de ambiente, se existir;
  • $_COOKIE: informações de cookies recebidos na requisição, se existir;

Observações importantes:

  • $_SESSION só existe depois de acionar a função session_start(). Após acioná-la pela primeira vez, o interpretador insere um COOKIE no header de resposta, o que representa o id único daquela sessão. Se não for a primeira vez, o interpretador buscará esse COOKIE para recuperar a sessão. Como? Bem: o browser ficará responsável por nos passar esse id nas próximas requisições. É preciso tomar cuidado com isso pois o gerenciamento nativo de sessões do PHP é uma porcaria bem complicado. Ele armazena cada sessão em arquivos temporários. Um projeto com muita manipulação de dados em sessão poderá sofrer consequências terríveis como "usuários desconectando do nada" ou perdendo informações de forma inesperada;
  • $_COOKIE é uma variável que não deve ser manipulada diretamente. Apesar de podermos recuperar informações diretamente por ela, para inserir dados é necessário utilizar a função setcookie;
  • toda manipulação de cookie são manipulações nos headers da resposta do servidor. Dito isso, é preciso que tudo isso aconteça antes de qualquer coisa ser impressa na saída do interpretador. Até um espaço em branco pode quebrar sua aplicação!

Variáveis de contexto CLI

Diferente do contexto web, o CLI é bem mais simples. Afinal, o conceito aqui é de usar um comando para abrir um script PHP podendo passar algumas instruções adicionais. Fácil, não? Com isso, temos uma lista bem pequena:

  • $argc: argument count, o número de argumentos recebidos no comando;
  • $argv: argument values, um array com todos os argumentos recebidos pelo interpretador, onde o primeiro índice é o nome do script que foi acionado.
      php script-soma.php 100 200 300 400 500
    
      <?php
      var_dump($argv); // [string(script-soma.php), string(100), string(200), string(300), string(400), string(500)]
      $soma = 0;
      for ($indice = 1; $indice < $argc; $indice++) {
          $soma += $argv[$indice];
      }
      echo $soma . PHP_EOL; // 1500
    

Para essas variáveis existirem, é preciso garantir que a configuração register-argc-argv está definida como true. Outro detalhe é que elas podem existir em contexto web, desde que o webserver esteja acionando o interpretador do PHP inserindo alguns parâmetros adicionais. Mas não necessariamente é algo que varia por requisição, meio que teria de ser configurado por você, por isso vamos manter a separação nesses contextos mesmo, beleza?

Outras variáveis

Além de tudo isso que mencionei, temos também:

  • $_SERVER: lista todas as informações sobre o servidor e o ambiente de execução, não sendo exclusivo de nenhum contexto em específico;
  • $php_errormsg: que contém a mensagem de erro logo após uma linha onde os erros foram suprimidos, por exemplo:
      <?php
      @strpos();
      var_dump($php_errormsg);
    
    PS.: não tente rodar no PHP Sandbox, pois ele tem uma configuração que desativa essa variável;
  • e outras mais que não acho que vale a pena mencionar.

E por hoje é só! No próximo artigo iremos falar sobre escopo de variáveis. Quando um dado pode sair da caixinha do if e como importar uma variável já existente para uma função. E no artigo depois desse, variáveis variáveis (meu favorito). Podem esperar que o conteúdo é bacana! Fechou?! Não esquece de curtir e compartilhar!

Inté!