108 votes

Comment utiliser les espaces de noms PHP avec autoload?

Je reçois cette erreur lorsque j'essaie d'utiliser le chargement automatique et les espaces de noms:

Erreur fatale: la classe 'Class1' est 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:

Classe1.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();

?>
 

123voto

enbuyukfener Points 1219

Class1 n'est pas dans la portée globale.

Voir ci-dessous pour un exemple de travail:

 <?php

function __autoload($class)
{
    $parts = explode('\\', $class);
    require end($parts) . '.php';
}

use Person\Barnes\David as MyPerson;

$class = new MyPerson\Class1();
 

Modifier (2009-12-14):

Juste pour clarifier, mon utilisation de "use ... as" était de simplifier l'exemple.

L'alternative était la suivante:

 use Person\Barnes\David;

$class = new Person\Barnes\David\Class1();
 

30voto

Kostanos Points 1126

Comme mentionné Pascal MARTIN, vous devez remplacer le '\' avec DIRECTORY_SEPARATOR par exemple:

$filename = BASE_PATH . DIRECTORY_SEPARATOR . str_replace('\\', DIRECTORY_SEPARATOR, $class) . '.php';
include($filename);

Aussi je vous suggère de réorganiser le dirrectory structure, pour rendre le code plus lisible. Ce pourrait être une alternative:

Structure de répertoire:

ProjectRoot
 |- lib

Fichier: /ProjectRoot/lib/Person/Barnes/David/Class1.php

<?php
namespace Person\Barnes\David
class Class1
{
    public function __construct()
    {
        echo __CLASS__;
    }
}
?>
  • Faire le sous-répertoire pour chaque espace de noms vous sont définis.

Fichier: /ProjectRoot/test.php

define('BASE_PATH', realpath(dirname(__FILE__)));
function my_autoloader($class)
{
    $filename = BASE_PATH . '/lib/' . str_replace('\\', '/', $class) . '.php';
    include($filename);
}
spl_autoload_register('my_autoloader');

use Person\Barnes\David as MyPerson;
$class = new MyPerson\Class1();
  • J'ai utilisé php 5 recommandations pour autochargeur déclaration. Si vous êtes toujours avec PHP 4, la remplacer par l'ancienne syntaxe: fonction __autoload($classe)

19voto

Pascal MARTIN Points 195780

Votre __autoload fonction recevra le plein de nom de classe, y compris le nom d'espace de noms.

Cela signifie que, dans votre cas, l' __autoload fonction recevra"Person\Barnes\David\Class1', et pas seulement"Class1'.

Donc, vous devez modifier votre chargement automatique de code, pour faire face à ce genre de "plus compliqué" nom ; une solution souvent utilisée est d'organiser vos fichiers à l'aide d'un niveau de répertoire par "niveau" des espaces de noms, et, lorsque le chargement automatique, remplacer"\"dans le nom d'espace de noms par DIRECTORY_SEPARATOR.

4voto

daniel rhodes Points 93

Je vois que le chargement automatique ne fonctionne que de recevoir le "plein" classname - avec tous les espaces de noms précédent, il - dans les deux cas suivants:

[a] $a = new\Pleine\Namespace\CoolClass();

[b] Le\Pleine\espace de SomeNamespace; (en haut de votre fichier source), suivie par $a = new SomeNamespace\CoolClass();

Je vois que le chargement automatique de fonctions NE reçoit PAS la totalité du nom de la classe dans le cas suivant:

[c] Le\Pleine\Namespace; (en haut de votre fichier source), suivie par $a = new CoolClass();

Mise à JOUR: [c] est une erreur et n'est pas comment les espaces de travail de toute façon. Je peux vous annoncer que, au lieu de [c], les deux cas suivants fonctionnent aussi très bien:

[d] Le\Pleine\Namespace; (en haut de votre fichier source), suivie par $a = new Namespace\CoolClass();

[e] Le\Pleine\Namespace\CoolClass; (en haut de votre fichier source), suivie par $a = new CoolClass();

Espérons que cette aide.

1voto

JohnWolf Points 153

eu le même problème et je viens de trouver ce :

Lorsque vous créez un sous-dossier de la structure correspondant à des espaces de noms de l'contenant des classes, vous n'avez même pas de définir un autochargeur.

    spl_autoload_extensions(".php"); // comma-separated list
    spl_autoload_register();

Il a travaillé comme un charme

Plus d'infos ici : http://www.php.net/manual/en/function.spl-autoload-register.php#92514

EDIT: cela provoque des problème sur Linux à cause de l'anti-slash... Voir ici pour la solution de travail par immeëmosol

Espace de noms de chargement automatique fonctionne sous windows, mais pas sur Linux

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X