Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
10
respostas

classe não encontrada usando namespace

Olá, estou enfrentando uma dificuldade em meu código onde eu declaro o namespace e quando eu utilizo o use ele não encontra a classe, se necessitar de outra parte do código eu disponibilizo

Teste.php

<?php

require_once 'autoload.php';

use Prj\Teste\Modelo\Cliente;
use Prj\Teste\Modelo\Funcionario;
use Prj\Teste\Modelo\Cpf;



$cliente = new Cliente('Diego Redi', new Cpf('123.456.789-10'), '147258369');
$funcionario = new Funcionario('Diego Redi', new Cpf('987.654.321-01'), 'Desenvolvedor');

var_dump($cliente);

var_dump($funcionario);

Cliente.php

<?php

namespace Prj\Teste\Modelo;

class Cliente extends Pessoa
{
    private $numeroConta;

    public function __construct(string $nome, CPF $cpf, string $numeroConta)
    {
        parent::__construct($nome, $cpf);
        $this->numeroConta = $numeroConta;
    }

    public function getNumeroConta(): string
    {
        return $this->numeroConta;
    }

    public function setNome(string $nome): void
    {
        $this->validaNome($nome);
        $this->nome = $nome;
    }

}

autoload.php

<?php

spl_autoload_register(function (string $nomeCompletoDaClasse)
{
    $caminhoArquivo = str_replace('prj\\teste', 'src', $nomeCompletoDaClasse);
    $caminhoArquivo = str_replace('\\', DIRECTORY_SEPARATOR, $caminhoArquivo);
    $caminhoArquivo .= ".php";

    if(file_exists($caminhoArquivo)){
        require_once $caminhoArquivo;
    }
});
10 respostas

Opa diego, boa tarde !

Acredito que seja aqui :

'prj\\teste'

Tente :

'Prj\\Teste'

Opa Paulo, obrigado por responder

Mas eu corrigi esse detalhe no autoload.php e ainda não resolveu o problema

Diego, bom dia !

Consegue postar o codigo no git, para podermos dar uma olhada ?

Opa, é claro Paulo. Aqui está o link para o projeto no GitHub

Projeto

Diego,

Executei seu código exatamente como está e rodou normalmente !

Qual erro está acontecendo quando você executa?

topico_143893> php src/teste.php                                        object(Prj\Teste\Modelo\Cliente)#2 (3) {
  ["numeroConta":"Prj\Teste\Modelo\Cliente":private]=>
  string(9) "147258369"
  ["nome":protected]=>
  string(10) "Diego Redi"
  ["cpf":protected]=>
  object(Prj\Teste\Modelo\Cpf)#3 (1) {
    ["numero":"Prj\Teste\Modelo\Cpf":private]=>
    string(14) "123.456.789-10"
  }
}
object(Prj\Teste\Modelo\Funcionario)#4 (3) {
  ["cargo":"Prj\Teste\Modelo\Funcionario":private]=>
  string(13) "Desenvolvedor"
  ["nome":protected]=>
  string(10) "Diego Redi"
  ["cpf":protected]=>
  object(Prj\Teste\Modelo\Cpf)#5 (1) {
    ["numero":"Prj\Teste\Modelo\Cpf":private]=>
    string(14) "987.654.321-01"
  }
}

Podes perceber que o namespace é o mesmo : Prj\Teste

Ele me apresenta esse erro Paulo.

Fatal error: Uncaught Error: Class "Prj\Teste\Modelo\Cliente" not found in C:\Users\User\Desktop\php\src\teste.php:11
Stack trace:
#0 {main}
  thrown in C:\Users\User\Desktop\php\src\teste.php on line 11

Diego!

Você está executando o código na "pasta" errada.

Por partes :

Ele diz : Class "Prj\Teste\Modelo\Cliente" not found in C:\Users\User\Desktop\php\src\teste.php

Classe cliente não encontrada em ....teste.php

Stack trace:
#0 {main}
  thrown in C:\Users\User\Desktop\php\src\teste.php on line 11

Este é o passo onde a exceção está sendo lançada.

Desta forma você está dentro do arquivo teste.php tentando executar o autoload que está fora do arquivo a partir do arquivo final.

No caso da sua estrutura de pasta :

C:\Users\User\Desktop\php\src\teste.php

Você tem que executar o código a partir de php, dois diretórios acima.

cd \Users\User\Desktop\php 

Ou apartir do diretório teste.php :

cd ../../

Adicionalmente, caso o php esteja instalado nesta pasta php recomendo retirar colocando o php nas variáveis de ambiente do windows, conforme demonstrado nas aulas. Caso seja apenas um diretório "php" para os trabalhos em php recomendo retirar da área de trabalho.

A área de trabalho abre em memoria no momento da inicialização, ou seja quanto mais coisas na área de trabalho mais lento o PC. Além de ser o mais difícil de recuperar em caso de perdas no disco.

Comenta aí se resolveu. :P

Olá Paulo, eu tentei fazer oque você me explicou e mesmo assim não deu certo... Eu acredito que o erro está na nomeação do namespace que eu fiz. porém não sei oque é

solução!

Diego, não acredito ser o namespace. Eu não alterei nada no código e rodou normalmente.

Na hora de executar o código você tem de estar na pasta PHP e executar o comando,abaixo?

php src/teste.php

Se não me engano o mestre executou o arquivo teste.php no php storm diretamente pelo interpretador do php storm.

Mas pela command line é diferente.

Se não conseguir posta no GIST um print da sua tela ao executar o comando, para eu conseguir ver.

Como última forma pode, tentar gravar a tela postar em um repositório (google drive,one drive,etc) e encaminhar o link.

Eu estava rodando pelo command line mesmo Paulo, mas rodando na pasta anterior igual você mandou ai o programa rodou mesmo. Muito Obrigado pela ajuda