PHP para Iniciantes: Constantes Mágicas

Já falamos sobre o básico de constantes e as pré-definidas, onde soltei alguns spoiler sobre constantes mágicas. Lembre-se: toda constante mágica é uma constante pré-definida.

Então por que tem um artigo só sobre isso, Kiko?

Porque as mágicas tem suas particularidades, como escopos e contextos. Diferente das outras constantes, que são interpretadas durante a execução do script, as mágicas são interpretadas durante a compilação, ou seja, no momento em que você o interpretador aciona a constante mágica é que seu valor é definido.

Então não é pré-definida?!

É confuso mesmo, nem eu sei explicar muito bem, mas dá pra entender que sim! Pois você não consegue definir uma constante mágica. Dará como já definida, logo, pré-definida.

Ba-dum-tis

Então quais constantes mágicas existem, Kiko?

Lá na documentação oficial do PHP tem uma tabelinha com toda a lista de constantes. Aparentemente, essa página ainda não existe na versão em pt-BR, então vou traduzir tudo e jogar mais abaixo (depois eu vejo como faço pra contribuir com a tradução, rs):

ConstanteDescrição
__LINE__O número da linha atual do script onde está sendo acionado.
__FILE__O caminho absoluto, incluindo o nome, do script onde está sendo acionado, já tratado pelos links simbólicos do sistema.
__DIR__O diretório do script onde está sendo adicionado. Equivalente a dirname(__FILE__). O diretório não termina com barra (/), exceto se for a raiz (/).
__FUNCTION__O nome da função ou {closure} em funções anônimas.
__CLASS__O nome da classe incluindo seu namespace, se houver (ex: MeuApp\Exemplo). Quando é usado dentro de um método de uma trait, será o nome da classe onde o método está sendo acionado. Equivalente a Classe::class (ex: MeuApp\Exemplo::class)
__TRAIT__O nome da trait incluindo seu namespace, se houver (ex: MeuApp\ExemploTrait).
__METHOD__O nome do método com a referência da classe onde ele está (ex: MeuApp\Exemplo::meuMetodo. Se acionado dentro de uma função, retorna o mesmo que __FUNCTION__.
__NAMESPACE__O nome do namespace atual (ex: dentro da classe MeuApp\Exemplo, viria MeuApp).

Na documentação também é citado como constante mágica o Classe::class, mas vamos concordar que isso parece mais uma informação estática da classe, concorda? Até a escrita é o acesso a uma propriedade estática ou constante de classe, diferente da escrita das constantes mágicas. Como é citado lá, vou deixar apenas a informação de que é o mesmo que __CLASS__, exceto que não é sobre a classe atual e sim sobre o nome da classe Classe incluindo seu namespace.

É muito utilizada em frameworks como o Laravel. Por exemplo:

<?php

namespace App\Services;

class PosterService
{
    public function imprimaOi(): void
    {
        echo "oi" . PHP_EOL;
    }
}

Quando você quer criar uma nova instância dessa classe no container do Laravel, você só precisa fazer algo assim:

<?php

use App\Services\PosterService; // importante para reduzir a chamada

// ... código blablabla

$posterService = app(PosterService::class);
$posterService->imprimaOi();

// blablabla código ...

Naquele momento, app(PosterService::class), estamos acionando app('App\Services\PosterService').

Ok, Kiko... Laravel? Framework? Service? O que é tudo isso?

Só um spoiler de coisas que você vai poder explorar beeeeem mais pra frente. Uma dica que eu gosto de deixar para todo iniciante é: não aprenda framework no começo. Aprenda PHP. Depois aprenda padrões de desenvolvimento, os famosos Patterns, e aí sim se joga nos frameworks. Eles estão lá para ajudar, mas aprender somente eles pode limitar bastante sua visão, beleza?

E por hoje é só! Curtiu? Comenta e compartilha! No próximo tópico falaremos sobre expressões, que é um único artigo gigantesco na documentação. Se não souber o que é, eu vou tentar explicar na próxima, fechado?

Inté!