Solucionado (ver solução)
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!