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

erro ao encontrar o diretório

Estou exatamente com o mesmo erro d Grasiela citou acima:

C:\xampp\htdocs\alura\PHOO2/classes/funcionarios/Diretor.php
Fatal error: Uncaught Error: Class 'classes\funcionarios\Diretor' not found in C:\xampp\htdocs\alura\PHOO2\index.php:15 Stack trace: #0 {main} thrown in C:\xampp\htdocs\alura\PHOO2\index.php on line 15

Fiz o que pediram na resposta coloquei um echo na linha:

echo $caminhoAbsoluto = __DIR__ .'/'. $namespace.".php";

e a resposta foi:

C:\xampp\htdocs\alura\PHOO2/classes/funcionarios/Diretor.php

Tudo ao meu ver está ok do que se trata o erro?

10 respostas

A parte de classes/funcionarios/Diretor está do jeito esperado. Então esse código funcionou corretamente:

$namespace = str_replace('\\', '/', $namespace);

Também aparece corretamente a / e o .php que você definiu no $caminhoAbsoluto.

A única coisa que eu posso imaginar que esteja saindo fora do normal é o caminho C:\xampp\htdocs\alura\PHOO2 porque essas barras estão ao contrário sem seguir o padrão. Comigo, no ubuntu, a resposta de __DIR__ é essa:

/home/fraps/Área de Trabalho/PHP/pooParte2

Talvez no windows seja diferente do mac e do ubuntu. Eu testaria trocando por isso:

$namespace = str_replace('\\', DIRECTORY_SEPARATOR, $namespace);
$caminhoAbsoluto = __DIR__ . DIRECTORY_SEPARATOR. $namespace . ".php";

Em vez de definir a / como separação de diretório ele vai usar a separação compatível com o seu sistema operacional, nesse caso a do windows. Espero que seja só problema de compatibilidade entre o código feito em sistemas diferentes porque dessa forma o DIRECTORY_SEPARATOR resolve.

Uma vez que fiz a alteração mudei até de pasta, deu o seguinte erro:

<?php
function load($namespace){
$namespace = str_replace("\\",DIRECTORY_SEPARATOR,$namespace);
echo $caminhoAbsoluto = __DIR__ .DIRECTORY_SEPARATOR.$namespace. ".php";
return $caminhoAbsoluto;

}
spl_autoload_register(__NAMESPACE__."\load");

C:\Users\Anderson\Desktop\teste\classes\funcionarios\Diretor.php
Fatal error: Uncaught Error: Class 'classes\funcionarios\Diretor' not found in C:\Users\Anderson\Desktop\teste\index.php:5 Stack trace: #0 {main} thrown in C:\Users\Anderson\Desktop\teste\index.php on line 5

Você colocou o use no index?

use classes\funcionarios\Diretor;
use classes\funcionarios\Designer;

A parte do autoload parece estar certa. Manda o código do index que é onde o erro tá acontecendo.

not found in C:\Users\Anderson\Desktop\teste\index.php:5

Olhando isso parece que está faltando o use

Por um instante fiquei em dúvida, porém para minha tristeza ao conferir vi que sim estou usando o use. Segue index e Classes:

#index.php
<?php
 require_once "autoload.php";

 use classes\funcionarios\Diretor;
 $diretor = new Diretor();

 var_dump($diretor);
#Classes

<?php

namespace classes\funcionarios\Diretor;
class Diretor
{


}

O problema nessa situação é do namespace que você usou na classe diretor. Nesse caso, você só coloca as pastas no namespace e somente no use você utiliza o caminho completo. Vou exemplificar pra ficar mais fácil pra entender:

#Classe Diretor
<?php

namespace classes\funcionarios;

class Diretor
{
#index
<?php

require_once 'autoload.php';

use classes\funcionarios\Diretor;

Se você reparar, ele coloca no namespace as pastas em que a classe está dentro - nesse caso, Diretor tá dentro de \funcionarios que está dentro de \classes formando o caminho classes\funcionarios. Já no use ele coloca o namespace e o nome da classe, então fica classes\funcionarios\Diretor;

Não sei mais o que fazer fiz esse ajuste e dá o mesmo erro, agora algo curioso aconteceu, no NetBens resolvi entrar no arquivo autoload.php para apagar o DIRECTORY_SEPARETOR, daí da uma travadinha e depois me retorna uma caixa com a seguinte mensagem:

Locking C:/xampp/htdocs/alura/PHOO2/autoload.php.

Você consegue subir no github ou em algum outro lugar o arquivo zipado pra eu dar uma olhada? Se não tiver como, manda de novo como você fez a alteração e o erro que está dando no console. E pelo que vi em outros tópicos o pessoal utiliza o DIRECTORY_SEPARATOR mesmo então não recomendo remover. Seria bom escrever aqui o index, o autoload, a classe diretor e também o erro que aparece no console.

Estou enviando via mediafire ainda estou aprendendo a mexer com git aqui na Alura, então estou enviando minha pasta de arquivos.

http://www.mediafire.com/file/nj5tqgod1s38tc0/PHOO2.zip/file

Faltou o require dentro do autoload

<?php

function load($namespace){
    $namespace = str_replace("\\",DIRECTORY_SEPARATOR,$namespace);
    $caminhoAbsoluto = __DIR__ .DIRECTORY_SEPARATOR.$namespace. ".php";
    return require_once $caminhoAbsoluto;

}

spl_autoload_register(__NAMESPACE__."\load");

Também é bom arrumar a classe Design que está com namespace errado

<?php

// namespace classes\funcionarios\Design; (original)
namespace classes\funcionarios; //altere para esse


class Design {
    //put your code here
}
solução!

Perfeito muito obrigado, esse problema me fez aprender várias coisas que eu não sabia, agradeço mesmo a atenção, agora eu posso avançar, Vlw!