1
resposta

require somente funciona se incluir previamente um use

No meu projeto foi necessário adicionar um use previamente para que ele reconhecesse o require:

<?php
use Alura\Usuario;
use Alura\Contato;

require 'Usuario.php';
require 'Contato.php';

$usuario = new Usuario($_POST['nome']);
$contato = new Contato($_POST['email']);

?>

Na aula, o instrutor não utiliza. Fiquei sem entender como fazer desta forma.

Estou usando o eclipse, com PHP 7.4 no linux Fedora. Tentei no Visual Studio Code e foi necessário utilizar também.

Assim, não entendi como implementar o autoload.

1 resposta

Olá, Elisson! Tudo bem com você?

Peço desculpa pela demora para responder o seu tópico.

Em PHP, a declaração use é utilizada para importar namespaces. Um namespace é uma forma de organizar e evitar conflitos de nomes em um código PHP.

Quando você usa o require para incluir os arquivos "Usuario.php" e "Contato.php", você está fazendo a inclusão física do código contido nesses arquivos no seu script atual. No entanto, para poder utilizar as classes definidas nesses arquivos, você precisa informar ao PHP em qual namespace essas classes estão definidas.

Ao usar a declaração use, você está dizendo ao PHP para importar o namespace do arquivo especificado. Isso permite que você use as classes desse namespace sem ter que qualificá-las com o caminho completo toda vez que as utilizar.

Quanto ao autoload, ele é uma forma de carregar automaticamente as classes do seu projeto, sem precisar utilizar o require manualmente para cada uma delas. Para implementar o autoload, você pode utilizar o recurso spl_autoload_register, que permite registrar uma função de autoload personalizada.

Aqui está um exemplo de como implementar o autoload no seu projeto:

<?php
spl_autoload_register(function ($classe) {
    $arquivo = str_replace('\\', '/', $classe) . '.php';
    if (file_exists($arquivo)) {
        require $arquivo;
    }
});

use Alura\Usuario;
use Alura\Contato;

$usuario = new Usuario($_POST['nome']);
$contato = new Contato($_POST['email']);
?>

Nesse exemplo, a função de autoload é registrada através do spl_autoload_register. Dentro dessa função, é feita uma substituição dos caracteres \ por / no nome da classe, para que o caminho do arquivo seja formado corretamente. Em seguida, é verificado se o arquivo existe e, caso exista, ele é incluído utilizando o require.

Dessa forma, as classes Usuario e Contato serão carregadas automaticamente pelo autoload, sem a necessidade de utilizar o require manualmente.

Espero ter ajudado. Caso tenha mais dúvidas ou problemas relacionados com esse tópico, estarei à disposição para ajudar.

Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.