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.

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!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software