# 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](https://www.php.net/manual/en/language.constants.magic.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)*:

| Constante | Descriçã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
<?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
<?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é!**
