Recebo este erro quando tento usar autoload e namespaces:
Erro fatal: Classe 'Class1' não encontrada em /usr/local/www/apache22/data/public/php5.3/test.php na linha 10
Alguém pode me dizer o que estou fazendo de errado?
Aqui está o meu código:
Class1.php:
<?php
namespace Person\Barnes\David
{
class Class1
{
public function __construct()
{
echo __CLASS__;
}
}
}
?>
test.php:
<?php
function __autoload($class)
{
require $class . '.php';
}
use Person\Barnes\David;
$class = new Class1();
?>
AS
. Não é por isso que essa solução funciona. Você poderia facilmente fazer:use Person\Barnes\David\Class1;
(que é equivalente ause Person\Barnes\David\Class1 as Class1;
).use Person\Barnes\David\Class1;
para fazer$class = new Class1();
. Comuse Person\Barnes\David;
você deve fazer$class = new David\Class1();
. Ause
palavra-chave por si só é equivalente ause Person\Barnes\David\Class1 as Class1;
ouuse Person\Barnes\David as David;
, respectivamente, para cada exemplo.Conforme mencionado Pascal MARTIN, você deve substituir o '\' por DIRECTORY_SEPARATOR por exemplo:
Também sugiro que você reorganize a estrutura do diretório, para tornar o código mais legível. Esta pode ser uma alternativa:
Estrutura do diretório:
Arquivo:
/ProjectRoot/lib/Person/Barnes/David/Class1.php
Arquivo:
/ProjectRoot/test.php
fonte
Sua
__autoload
função receberá o nome completo da classe, incluindo o nome do namespace.Isso significa que, no seu caso, a
__autoload
função receberá 'Person\Barnes\David\Class1
', e não apenas 'Class1
'.Portanto, você tem que modificar seu código de carregamento automático para lidar com esse tipo de nome "mais complicado"; uma solução frequentemente usada é organizar seus arquivos usando um nível de diretório por "nível" de namespaces e, ao carregar automaticamente, substituir '
\
' no nome do namespace porDIRECTORY_SEPARATOR
.fonte
__autoload
função receberá o nome completo da classe, incluindo o nome do namespace" - isso só é verdade se você tiver explicitamenteuse
d a classe que está tentando fazer referência, não se você simplesmenteuse
d o namespace ao qual ela pertence. O erro do OP foi teruse
removido o namespace que contém uma classe e, então, esperar que sua função de carregamento automático passasse magicamente pelo caminho de classe completo de alguma forma. Essa resposta realmente não resolve o erro do OP.Eu faço algo assim: Veja este exemplo do GitHub
fonte
Eu encontrei esta joia do Flysystem
fonte
Vejo que as funções de carregamento automático recebem apenas o nome de classe "completo" - com todos os namespaces que o precedem - nos dois casos a seguir:
Vejo que as funções de carregamento automático NÃO recebem o nome de classe completo no seguinte caso:
ATUALIZAÇÃO: [c] é um erro e não é assim que os namespaces funcionam. Posso relatar que, em vez de [c], os dois casos a seguir também funcionam bem:
Espero que isto ajude.
fonte
use
palavra - chave não funciona corretamente na interface de linha de comando interativa do PHP (php --interactive
);Eu uso este hack simples em uma linha:
fonte
teve o mesmo problema e acabei de descobrir:
Quando você cria uma estrutura de subpasta correspondendo aos namespaces das classes que as contêm, você nunca terá que definir um autoloader.
Funcionou como um encanto
Mais informações aqui: http://www.php.net/manual/en/function.spl-autoload-register.php#92514
EDIT: isso causa problema no Linux por causa da barra invertida ... Veja aqui a solução de trabalho por immeëmosol
O namespace Autoload funciona no Windows, mas não no Linux
fonte
Usar tem um problema, embora seja de longe o método mais rápido, ele também espera que todos os seus nomes de arquivo estejam em minúsculas.
Por exemplo:
Um arquivo contendo a classe SomeSuperClass precisaria ser nomeado somesuperclass.php, isso é um problema quando se usa um sistema de arquivos com distinção entre maiúsculas e minúsculas como o Linux, se seu arquivo se chama SomeSuperClass.php mas não é um problema no Windows.
Usar __autoload em seu código ainda pode funcionar com as versões atuais do PHP, mas espera que esse recurso se torne obsoleto e, finalmente, seja removido no futuro.
Então, quais são as opções restantes:
Esta versão funcionará com PHP 5.3 e superior e permite nomes de arquivo SomeSuperClass.php e somesuperclass.php. Se você estiver usando 5.3.2 e superior, este autoloader funcionará ainda mais rápido.
fonte
str_replace ([ '_','\\'] '/', $className );
é duas vezes mais rápido do que dois str_replaceRecentemente, achei a resposta de tanerkuc muito útil! Só queria acrescentar que usar
strrpos()
+substr()
é um pouco mais rápido do queexplode()
+end()
:fonte
Vou apostar meus dois centavos para iniciantes ou qualquer outra coisa querendo uma configuração simples de spl_autoload_register () sem toda a teoria: Basta criar um arquivo php para cada classe, nomear esse arquivo php igual ao nome da sua classe e manter os arquivos da sua classe no mesmo diretório do arquivo php em questão, isso funcionará:
Pesquisar as peças dentro desta função deve responder como ela funciona. PS: Eu uso Linux, e isso funciona no Linux. O pessoal do Windows deve testá-lo primeiro.
fonte
https://thomashunter.name/blog/simple-php-namespace-friendly-autoloader-class/
Você vai querer colocar seus arquivos de classe em uma pasta chamada
Classes
, que está no mesmo diretório que o ponto de entrada em seu aplicativo PHP. Se as classes usarem namespaces, os namespaces serão convertidos na estrutura de diretório.Ao contrário de muitos outros carregadores automáticos, os sublinhados não serão convertidos em estruturas de diretório (é complicado fazer PHP <5.3 pseudo namespaces junto com PHP> = 5.3 namespaces reais).
Você vai querer colocar o seguinte código em seu script PHP principal (ponto de entrada):
Aqui está um exemplo de layout de diretório:
fonte
fonte