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

Qual método de autoload utilizar?

Boa noite.

No curso "PHP: Avançando com Orientação a objetos parte 2" é ensinado como utilizar o autoload com um código...sendo que para chamar nossas classes devemos utilizar o comando "USE" no início.

<?php
function load($namespace){

    $namespace = str_replace("\\","/",$namespace);
    $caminhoAbsoluto = __DIR__ . "/". $namespace . ".php";
    return include_once $caminhoAbsoluto;
}

spl_autoload_register(__NAMESPACE__ . "\load");
?>

Porém, no curso "PHP: Manipulando coleções com Arrays" é ensinado OUTRO código para autoload...onde para chamar nossas classes não se faz necessário utilizar nada além é claro do único require que é do próprio autoload.php...nem require, nem USE...nada...lembrando que este professor cita as PSRs...sendo assim fica nas entre linhas que o método dele seria o correto e absoluto uma vez que segue os padrões da comunidade. No exemplo dele apenas damos os new "nome_da_classe" e pronto, elas são chamadas automaticamente sem termos que fazer mais nada.

<php
spl_autoload_register(
    function (string $namespaceClasse): void {
        $caminho = “/src”;
        $diretorio_classe = str_replace("\\", DIRECTORY_SEPARATOR, $namespaceClasse);
        @include_once getcwd() . $caminho . DIRECTORY_SEPARATOR . "{$diretorio_classe}.php";
    }
);

?>

Mais para frente, no curso de Laravel, onde a estrutura do framework já vem com autoload é ensinado que devemos usar o USE para chamar as classes...

Enfim, qual método utilizar? Achei um pouco confuso ter em uma mesma formação cursos ensinando métodos diferentes sem explicar qual devemos seguir.

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
2 respostas
solução!

Oi Rodrigo,

Na comunidade PHP é muito comum utilizar o Autoload do Composer, os frameworks mais comuns (Laravel, Symfony) já vem com ele incluído sem precisar fazer nenhuma configuração.

Nos primeiros cursos de PHP da formação, é feito o autoload "na mão" com a função spl_autoload_register para aprender como o autoload do Composer funciona por baixo dos panos (ele utiliza essa mesma função!). Mais pra frente da formação tem um curso só de Composer, aí a partir disso ele é utilizado até o final com o Laravel.

Com relação à palavra chave use é uma questão de resumir o código, quando você tem um código como o seguinte por exemplo:

<?php 

namespace Framework\Http;

class Requisicao
{
...
}

Se você estiver em uma classe que pertence ao mesmo namespace, você pode instânciar sem precisar informar nada, por exemplo:

<?php

namespace Framework\Http; //Mesmo namespace aqui.

class Resposta
{
    ...
    public function analisaRequisicao(Requisicao $requisicao)
    {
        $requisicao = new Requisicao(); //Aqui não precisa informar o namespace pois ele pertence ao mesmo.
    }
}

E se você for instânciar essa classe a partir de outro arquivo cujo namespace seja diferente dele, você vai precisar informar o caminho:

<?php 

namespace App\Controllers;

$requisicao = new \Framework\Http\Requisicao();

Mas fica meio ruim ter que digitar esse caminho gigante toda vez que for instânciar uma classe, não é? então foi daí que foi criado o use que nada mais é do que uma maneira da gente abreviar os imports, possibilitando da gente fazer isso:

<?php 

namespace App\Controllers;

use Framework\Http\Requisicao;

$requisicao = new Requisicao();

Então fica uma questão de preferência pessoal, dependendo do arquivo você pode utilizar o use se facilitar a legibilidade, se não, pode digitar o caminho inteiro do namespace na instânciação que não faz diferença nenhuma.

Se tiver qualquer outra dúvida pode perguntar aqui mesmo no fórum que a gente te ajuda! :)

Durante a aula em vídeo eu havia entendido que pelo seu método eu não precisaria utilizar o USE em nenhuma situação...eu havia me confundido rs. Assisti novamente a aula, fiz alguns testes e minha dúvida está sanada.

Obrigado pela rápida e detalhada explicação!