Marcos,
Tudo bem contigo?
Vamos lá, primeiro de tudo, eu estou aprendendo também, então estou respondendo em cima da pesquisa e testes que consegui realizar. Tive de gastar um tempo.
Se você conseguiu uma outra resposta sobre este tópico, por favor não deixe de compartilhar!
Sobre o vídeo do instrutor, de fato, eu não havia habilitado o AutoLoader quando fiz os exercicios, concluí usando apenas o "require_once".
Depois reproduzindo o código conforme o instrutor fez eu também recebi os mesmos warnings.
Agora, depois que ele carrega o use, eu não consegui explicação de por que no caso dele este warning não aparece. Pode ter a ver com o ambiente dele ou versão do PHP. Não estou certo.
Lembrando que um Warning é um aviso não é necessáriamente um erro. Um Warning ou Alerta do compilador indica situações que podem causar problemas ou podem ter efeitos indesejáveis dos quais o programador não esta ciente.
Respondendo objetivamente:
Neste caso especifico não é necessário o "use".
Porque o arquivo esta na raiz do projeto, e o Autoloader considera a raiz o namespace padrão e vai carregar isto automáticamente.
Para você ver isto funcionando, coloque estes echo´s no código no teu Autoloader:
function load ($namespace){
$namespace = str_replace("\\", "/", $namespace);
$caminhoAbsoluto = __DIR__ . "/". $namespace . ".php";
echo PHP_EOL;
echo "Caminho Absoluto: " . $caminhoAbsoluto . PHP_EOL;
echo PHP_EOL;
return include_once $caminhoAbsoluto;
}
Em que momento que o Autoloader é chamado?
Não é no "use", mas quando você fizer a primeira chamada do método construtor da classe ContaCorrente:
$contajoao = new ContaCorrente("joao","0783", "21867-3","500");
Isto fica bem claro na documentação do PHP, o "use" não faz o import (include) do arquivo, ele apenas mapeia o caminho onde o AutoLoader deve procurar pela classe.
Por padrão o Autoloader vai procurar no namespace atual, que é a pasta raiz. Vai procurar pelo arquivo da classe ContaCorrente.php, independente de você mapear o namespace com o "use".
Isto fica claro no código acima no Caminho Absoluto, com a linha do "use" comentada ou removida.
E dai que esta o Warning:
"PHP Warning: The use statement with non-compound name 'ContaCorrente' has no effect"
Este "use ContaCorrente" não tem efeito (has no effect), nenhum no teu código.
Até por que esta classe ContaCorrente não esta dentro de um namespace, e informando o nome desta maneira, ele não tem um caminho composto, ele já esta direto na raiz, e não é necessário.
O "use" vai servir apenas como um mapeamento de onde o compilador deve procurar por classes usadas no teu código.
Uma sugestão é você criar uma pasta /classes e dentro dela salvar o ContaCorrente.php.
Dai no inicio do ContaCorrente.php, informa:
namespace classes;
E de volta no index.php informa:
use classes\ContaCorrente;
Neste caso, quando você chamar a função construtora da classe ContaCorrente o Autoloader vai procurar a classe no namespace atual que é a raiz.
Não vai achar, dai vai procurar na pasta classes que voc~e mapeou com o "use" vai achar e executar.
E consequentemente neste caso executa sem warning, por que o "use" foi necessário para que o AutoLoader carregasse o arquivo ContaCorrente.php no namespace classes.
Sugiro conforme tiver tempo, examinar as seguintes fontes que me ajudaram (espero eu) ter entendido um pouco melhor:
1) Treinamento Alura:
PHP: INTRODUÇÃO À ORIENTAÇÃO A OBJETOS - PARTE 2
Aula 1 - NAMESPACES
2) Artigo:
Entendendo namespaces no PHP
http://www.diogomatheus.com.br/blog/php/entendendo-namespaces-no-php/
3) Documentação do PHP
PS: Este sinceramente eu não li tudo...kkkk
https://www.php.net/manual/pt_BR/language.namespaces.php
Um abraço e vamos seguindo nos estudos!