Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Utilização do ::class

Poderiam me explicar o motivo do uso do ::class ? Em uma busca eu verifiquei que é utilizado para descobrir o no nome qualificado da classe junto com o namespace. Então seguindo essa lógica eu tirei o caminho completo da classe e não funcionou:

<?php

declare(strict_types=1);

return [
    'GET|/' => VideoListController::class,
    ];

Eu achava que o ::class já traria o caminho todo (\Alura\Mvc\Controller\VideoListController::class), mas isso não ocorreu.

2 respostas
solução!

Boa noite!

Sim, em resumo o ::class retorna uma string com o nome completo da classe junto com o seu namespace.

Mas observe que para que isso funcione, o seu autoload precisa conhecer a classe VideoListController para chamar simplesmente como:

'GET|/' => VideoListController::class;

Caso contrário você precisa fazer o require ou usar o nome completo, exemplo:

'GET|/' => \Meu\Name\Space\VideoListController::class;

Mas ai pode parecer que não adianta nada dizer o nome completo para receber uma string com o nome completo, mas o fato de usar:

'GET|/' => \Meu\Name\Space\VideoListController::class;

No lugar de:

'GET|/' => "\Meu\Name\Space\VideoListController";

É que usando a classe você faz uso também da verificação de sintaxe e o parsing do interpretador, ou seja, se tentar chamar uma classe que não existe terá um erro logo de cara, provavelmente direto na sua IDE.

E se usar uma string, só irá perceber o erro com o código rodando, ou seja, de qualquer forma, mesmo que seu autoload não consiga resolver o nome chamando apenas:

VideoListController::class;

Ainda assim é uma boa prática e garante que nada foi digitado errado, do que o uso de string pura.

Mas dai surge uma dúvida, é possível instanciar uma classe a partir de uma string?

Sim, no exemplo hipotético abaixo funcionaria:

$classe = "\Meu\Name\Space\VideoListController";
$objeto = new $classe;

Mas convenhamos que não é boa prática.

Muito obrigado pelas explicações.