J'essaie de structurer un projet de sorte que certains code généré sont dans un sous-dossier Par exemple, j'ai cette structure qui me donne l'erreur est-il possible d'avoir la même espace de noms Pour 2 fichiers différents de différents dossiers comme celui-ci? p> généré / code>, mais il a la même espace de noms que les fichiers du répertoire parent.
Php Fatal Error: Erreur non capturée: Classe 'myProject \ foo' non trouvé code>. P>
lib / foo.php code> p>
lib / généré / bar.php code> p>
"autoload": {
"psr-4": {
"MyProject\\" : "lib/"
}
},
3 Réponses :
Vous essayez d'utiliser l'espace de nom sans utiliser utiliser em> strong> Essayez de suivre le code ci-dessous qui vous aidera. Comme vous essayez d'accéder à une autre classe, vous devrez accéder via des espaces de noms, sinon vous ne le ferez pas. Suivez ci-dessous le code. <?php
namespace MyProject;
class Foo {
...
}
<?php
namespace MyProject;
use MyProject\Foo;
class Bar {
public function __construct() {
$foo = new Foo();
}
}
Nouveau FOO code> dans un espace de noms MyProject code> fait déjà référence à
MyProject \ foo code> sans un
redondant utiliser code>. Le message d'erreur le dit même.
Il ne peut fonctionner que si vous incluez le FOO.PHP à l'appelant la fonction. P>
Comme vous l'avez mentionné, vous chargez automatiquement l'espace de noms entier avec le compositeur. Les espaces de noms sont comme une structure de répertoire virtuelle. Dans votre cas, chaque classe a le même espace de noms, donc il tente de regarder tous les fichiers dans le même répertoire à cause de laquelle dans votre cas FOO.PHP ne se chargée pas via Compositeur. P>
Ainsi, c'est mieux à différents répertoire d'espace de noms sage ou les inclure avec chemin. P>
On dirait que vous utilisez le compositeur pour l'autoloading. Vous pouvez configurer le compositeur pour rechercher plusieurs répertoires pour un espace de noms donné.
Voici quelques échantillons de configuration (en supposant que la charge automatique PSR-4) p> si vous pouvez fournir le AutoLoad code> section de votre projet COMPOSER, je peux fournir des détails plus précis. p> p>
J'ai ajouté ma section AutoLoad. J'étais sous l'impression tout sous lib / code> serait recherché car tous mes autres dossiers (que je n'ai pas énuméré dans mon exemple) sont correctement trouvés car ils ont une sous-pathes d'espace de noms différent.
Les sous-répertoires doivent correspondre à l'espace de noms. Pour votre dossier généré, l'espace de noms devra être "MyProject \ généré"
L'ajout de la cartographie pour "myProject \\" à la fois "lib /" et "lib / généré" comme décrit ci-dessus devrait fonctionner. Chaque répertoire n'est pas un chemin de recherche, mais plutôt une cartographie exacte.
Je ne voulais pas spécifiquement que mon espace de noms ait myProject \ généré code> dedans. Ajout d'un tableau des deux valeurs fonctionne!
Oui, c'est tout à fait possible. Il vous suffit de vous assurer que
foo.php code> est
inclure code> d à un moment donné, soit explicitement, soit par autoloading.
Mon compositeur.json Fichier automatique achoué l'intégralité de l'espace de noms code> MyProject.
Chargez-vous également le chargeur automatique ...? Cela n'arrivera pas si vous invoquez directement le fichier généré et qu'il n'inclut pas le chargeur automatique, par exemple ...
Je ne charge pas l'autochargeur dans ma bibliothèque, mais dans un projet, je prends cette bibliothèque avec oui je fais. La réinitialisation de mes fichiers / dossiers sous
lib / code> fonctionne comme prévu.