Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Possível erro no código

Olá,

Acredito que o código do autoload no video tem um erro:

spl_autoload_register(
    function(string $namespaceClasse): void{
        echo $namespaceClasse . "<br>";
        $caminho = '/src';
        $directorio_classe = str_replace("\\", DIRECTORY_SEPARATOR, $namespaceClasse);
        $nomeCompletoDaClasse = getcwd() . $caminho . DIRECTORY_SEPARATOR . "{$directorio_classe}.php";
        echo $nomeCompletoDaClasse;

        @include_once $nomeCompletoDaClasse;
    }
);

O segundo echo relativo ao caminho completo já montado apresenta o seguinte:

C:\Users\andregp\Desktop\Cursos\Alura\PHP\5. PHP - Manipulando colecoes com Arrays/src\Alura\Calculadora.php

Antes de "src" tem a barra ' / ' em vez de ter a barra para o Windows ' \ '.

O estranho é que isto funciona assim, por isso acho que o facto de ter utilizado DIRECTORY_SEPARATOR é irrelevante neste caso, porque o Windows aceita caminhos com a barra ' / '.

Por isso no caso do Windows se implementar da seguinte forma:

spl_autoload_register(
    function(string $namespaceClasse): void{
        echo $namespaceClasse . "<br>";
        $caminho = '/src';
        $directorio_classe = str_replace("\\", DIRECTORY_SEPARATOR, $namespaceClasse);
        $nomeCompletoDaClasse = getcwd() . $caminho . '/' . "{$namespaceClasse}.php";
        echo $nomeCompletoDaClasse;

        @include_once $nomeCompletoDaClasse;
    }
);

Ignorando $directorio_classe e passando direto $namespaceClasse, assim como passando direto ' / ' em vez de DIRECTORY_SEPARATOR, vai funcionar na mesma.

Acho que a implementação mais correcta seria:

spl_autoload_register(
    function(string $namespaceClasse): void{
        echo $namespaceClasse . "<br>";
        $caminho = 'src';
        $directorio_classe = str_replace("\\", DIRECTORY_SEPARATOR, $namespaceClasse);
        $nomeCompletoDaClasse = getcwd() . DIRECTORY_SEPARATOR . $caminho . DIRECTORY_SEPARATOR . "{$directorio_classe}.php";
        echo $nomeCompletoDaClasse;

        @include_once $nomeCompletoDaClasse;
    }
);

E dessa forma:

C:\Users\andregp\Desktop\Cursos\Alura\PHP\5. PHP - Manipulando colecoes com Arrays\src\Alura\Calculadora.php2.5

As barras ficam correctas.

No curso anterior o instructor fez um require em vez de um @include:

if(file_exists($nomeCompletoDaClasse)){
    require_once $nomeCompletoDaClasse;
}else{
    echo "Erro no require";
}

Qual é a diferença entre se usar o @include_once e o require_once?

Obrigado

1 resposta
solução!

Oi Andre, tudo bem? Funcionar, no Windows, é algo, mas essa implementação de troca as barras foca em resolver problemas do tipo: você desenvolver no Windows e colocar em um servidor que usa um sistema operacional diferente. Raramente seu projeto PHP estará em um servidor Windows.

O include_once e require_once diferenciam apenas no tipo do erro que lançam quando não encontra o arquivo. O include se não me engano, lança um warning, o require lança um fatal error.

O @ na frente da função, serve para omitir a mensagem de erro, se houver uma, não acho uma boa ideia usar esse tipo de prática.

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