J'obtiens cette erreur lorsque j'essaie d'utiliser le chargement automatique et les espaces de noms:
Erreur fatale: Classe 'Class1' introuvable dans /usr/local/www/apache22/data/public/php5.3/test.php à la ligne 10
Quelqu'un peut-il me dire ce que je fais mal?
Voici mon code:
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
. Ce n'est pas pourquoi cette solution fonctionne. Vous pouvez tout aussi facilement faire:use Person\Barnes\David\Class1;
(ce qui équivaut àuse Person\Barnes\David\Class1 as Class1;
).use Person\Barnes\David\Class1;
pour faire$class = new Class1();
. Avecuse Person\Barnes\David;
vous devez faire$class = new David\Class1();
. Leuse
mot-clé en lui-même est l'équivalent deuse Person\Barnes\David\Class1 as Class1;
ouuse Person\Barnes\David as David;
, respectivement pour chaque exemple.Comme mentionné Pascal MARTIN, vous devez remplacer le '\' par DIRECTORY_SEPARATOR par exemple:
Je vous suggère également de réorganiser la structure du répertoire, pour rendre le code plus lisible. Cela pourrait être une alternative:
Structure du répertoire:
Fichier:
/ProjectRoot/lib/Person/Barnes/David/Class1.php
Fichier:
/ProjectRoot/test.php
la source
Votre
__autoload
fonction recevra le nom de classe complet, y compris le nom de l'espace de noms.Cela signifie que, dans votre cas, la
__autoload
fonction recevra «Person\Barnes\David\Class1
», et pas seulement «Class1
».Donc, vous devez modifier votre code de chargement automatique, pour gérer ce genre de nom "plus compliqué"; une solution souvent utilisée est d'organiser vos fichiers en utilisant un niveau de répertoire par "niveau" d'espaces de noms, et, lors du chargement automatique, de remplacer «
\
» dans le nom de l'espace de noms parDIRECTORY_SEPARATOR
.la source
__autoload
fonction recevra le nom de classe complet, y compris le nom de l'espace de noms" - ceci n'est vrai que si vous avez explicitementuse
d la classe que vous essayez de référencer, pas si vous avez simplementuse
d l'espace de noms auquel elle appartient. L'erreur de l'OP était qu'il avaituse
créé l'espace de noms contenant une classe et s'attendait alors à ce que sa fonction de chargement automatique passe comme par magie le chemin de classe complet. Cette réponse ne répond pas vraiment à l'erreur du PO.Je fais quelque chose comme ceci: voir cet exemple GitHub
la source
J'ai trouvé ce bijou de Flysystem
la source
Je vois que les fonctions de chargement automatique ne reçoivent que le nom de classe "complet" - avec tous les espaces de noms le précédant - dans les deux cas suivants:
Je vois que les fonctions de chargement automatique NE reçoivent PAS le nom de classe complet dans le cas suivant:
MISE À JOUR: [c] est une erreur et ce n'est pas la façon dont les espaces de noms fonctionnent de toute façon. Je peux signaler qu'au lieu de [c], les deux cas suivants fonctionnent également bien:
J'espère que cela t'aides.
la source
use
mot-clé ne fonctionne pas correctement dans l'interface de ligne de commande interactive PHP (php --interactive
);J'utilise ce simple hack en une seule ligne:
la source
eu le même problème et vient de trouver ceci:
Lorsque vous créez une structure de sous-dossiers correspondant aux espaces de noms des classes contenant, vous n'aurez même jamais à définir un chargeur automatique.
Ça a marché comme sur des roulettes
Plus d'infos ici: http://www.php.net/manual/en/function.spl-autoload-register.php#92514
EDIT: cela pose problème sous Linux à cause de la barre oblique inverse ... Voir ici pour une solution de travail par immeëmosol
Le chargement automatique des espaces de noms fonctionne sous Windows, mais pas sous Linux
la source
L'utilisation a un piège, bien que ce soit de loin la méthode la plus rapide, elle s'attend également à ce que tous vos noms de fichiers soient en minuscules.
Par exemple:
Un fichier contenant la classe SomeSuperClass devrait être nommé somesuperclass.php, c'est un piège lors de l'utilisation d'un système de fichiers sensible à la casse comme Linux, si votre fichier est nommé SomeSuperClass.php mais pas un problème sous Windows.
L'utilisation de __autoload dans votre code peut toujours fonctionner avec les versions actuelles de PHP, mais attendez-vous à ce que cette fonctionnalité devienne obsolète et finalement supprimée à l'avenir.
Alors, quelles sont les options restantes:
Cette version fonctionnera avec PHP 5.3 et supérieur et autorise les noms de fichiers SomeSuperClass.php et somesuperclass.php. Si vous utilisez 5.3.2 et versions ultérieures, cet autochargeur fonctionnera encore plus rapidement.
la source
str_replace ([ '_','\\'] '/', $className );
J'ai récemment trouvé la réponse de tanerkuc très utile! Je voulais juste ajouter qu'utiliser
strrpos()
+substr()
est légèrement plus rapide queexplode()
+end()
:la source
Je vais jeter mes deux cents pour les débutants relatifs ou ce qui ne veut pas d'une configuration simple spl_autoload_register () sans toute la théorie: créez simplement un fichier php pour chaque classe, nommez ce fichier php comme votre nom de classe et conservez vos fichiers de classe dans le même répertoire que votre fichier php en question, alors cela fonctionnera:
Googler les pièces à l'intérieur de cette fonction devrait expliquer comment cela fonctionne. PS: J'utilise Linux, et cela fonctionne sous Linux. Les utilisateurs de Windows devraient d'abord le tester.
la source
https://thomashunter.name/blog/simple-php-namespace-friendly-autoloader-class/
Vous voudrez mettre vos fichiers de classe dans un dossier nommé
Classes
, qui se trouve dans le même répertoire que le point d'entrée de votre application PHP. Si les classes utilisent des espaces de noms, les espaces de noms seront convertis dans la structure de répertoires.Contrairement à beaucoup d'autres chargeurs automatiques, les traits de soulignement ne seront pas convertis en structures de répertoires (il est difficile de faire des pseudo espaces de noms PHP <5.3 avec PHP> = 5.3 espaces de noms réels).
Vous voudrez placer le code suivant dans votre script PHP principal (point d'entrée):
Voici un exemple de disposition de répertoire:
la source
la source