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