Impossible de trouver la classe avec l'espace de noms PHP
J'ai posté quelques questions auparavant en ce qui concerne l'utilisation des espaces de noms en PHP et à partir de ce que j'ai, cet exemple de code que j'ai ci-dessous doit être au travail.
Cependant j'obtiens des erreurs lorsque j'essaye d'utiliser l'espace de Noms en PHP comme ceci. Ici est la première d'erreur lors de l'exécution du code ci-dessous comme c'est...
Fatal error: Class 'Controller' not found in E:\Controllers\testing.php on line 6
E:\Controller\testing.php Fichier
<?php
use \Controller;
include('testcontroller.php');
$controller = new Controller;
$controller->show();
?>
E:\Controller\testcontroller.php Fichier
<?php
use \Library\Registry;
namespace Controller
{
class Controller
{
public $registry;
function __construct()
{
include('E:\Library\Registry.class.php');
$this->registry = new Registry;
}
function show()
{
echo $this->registry;
echo '<br>Registry was ran inside testcontroller.php<br>';
}
}
}
?>
E:\Library\Registry.class.php Fichier
<?php
namespace Library\Registry
{
class Registry
{
function __construct()
{
return 'Registry.class.php Constructor was ran';
}
}
}
?>
Comme vous pouvez le voir j'ai essayé de le rendre aussi simple que possible, juste pour obtenir de l'espace de Noms de la partie de travail. J'ai essayé différentes variations et n'arrive pas à le comprendre.
source d'informationauteur JasonDavis | 2011-12-22
Vous devez vous connecter pour publier un commentaire.
Même lors de l'utilisation de
use
déclaration, vous devez spécifier l'espace de noms de la classe en essayant de les instancier. Il y a beaucoup d'exemples ici: http://www.php.net/manual/en/language.namespaces.importing.phpPour mieux la comprendre, je vais vous décrire comment il fonctionne. Dans votre cas, lorsque vous ne
use \Controller
l'ensemble de laController
espace de noms devient disponible pour vous, mais pas les classes qui sont dans cet espace de noms. Ainsi, par exemple:Un autre exemple:
testcontoller.php:
testing.php:
Si vous souhaitez importer exactement la
Controller
classevous devez faireuse Controller\Controller
- puis cette classe sera accessible dans votre champ d'application actuel.Il n'est pas une bonne idée de nom de l'espace de noms, à l'instar de la classe, car il est source de confusion (et je pense que c'est ce qui se passe ici). Il y a moment où vous définir l'alias via
use Controller
ce referenes à une classe\Controller
ou l'espace de noms\Controller
mais votre classe, parce que c'est dans l'espace de noms, est nommé\Controller\Controller
Unou
ou
L'idée est que le moment où vous essayez d'accéder à une classe avec son nom relatif, il essaie de carte de la "première partie" à l'encontre de n'importe quel alias définis à l'aide de
use
(rappelez-voususe MyClass
est le même queuse MyClass as MyClass
. La chose aprèsas
est l'alias).Comme vous pouvez le voir PHP trouve
SomeComponent
que la première partie et les cartes contre leSomeComponent
-alias la ligne ci-dessus.Vous pouvez en lire plus à ce sujet dans le manuel sur les espaces de noms.
Un Son appelé "Full-qualifiés classname", si vous nommez une classe avec son nom complet.
Quand vous mettez une classe
Controller
dans l'espace de nomsController
alors vous avez à la référence de cette façon:\Controller
serait une classe dans le global (par défaut) de l'espace de noms, c'est à dire que si vous avez utilisé aucun espace de noms.Étrangement, j'ai trouvé que dans mon exemple de code à partir de la Question ci-dessus, si je change tous les
Namespace's
qui sont définies à quelque chose commeMyLibrary
de sorte qu'il serait comme ce code ci-dessous...E:\Library\Registry.class.php Fichier
Puis lorsque j'utilise
use MyLibrary\Registry;
dans un autre fichier, je suis en mesure d'accéder à la façon dont j'avais prévu...La raison que c'est très étrange pour moi, c'est ce qui rend désormais un nom de classe semble être une
Namespace
. Je voudrais donc pas besoin de définir un espace de Noms 'MyLibrary\Library" pour accéder à laRegistry
au lieu de cela, je le ferais comme je l'ai montré dans cette réponse, pour être en mesure d'accéder en appelant le nom de la classe.J'espère que cela a du sens et de l'aide à quelqu'un d'autre. Je ne vais pas accepter cette réponse que je suis en espérant que quelqu'un avec plus de savoir-faire vont venir et post une meilleure Réponse avec explication
essayer
et