2014-09-21 1 views
0

J'essaie de comprendre comment définir un chargeur automatique de travail pour une application triviale avec des espaces de noms.Autoloader PHP avec espaces de noms

Je crée la structure suivante:

public 
    index.php 
src 
    Models 
     WordGenerator.php 

De toute évidence, plus tard il se développera. Le fichier WordGenerator.php suit:

<?php 
namespace Models; 

class WordGenerator { 
    public $filename; 

    public function __construct($filename) { 
     $this->_filename = $filename; 
    } 
} 

Maintenant, j'essaie de créer une instance de cet objet dans index.php:

<?php 
use \Models; 

$wg = new WordGenerator("words.english"); 

Évidemment, j'obtiens l'erreur fatale parce que je ne définissaient pas autoloader. Cependant, selon la documentation tout ce que je peux passer est $classname. Comment est-ce que je devrais définir la fonction d'autoloader pour prendre l'espace de noms déclaré par l'instruction use alors ??

[edit] Je me suis trompé il y a un instant. Alors, voici mon code pour index.php:

spl_autoload_register(function ($className) { 
    $className = ltrim($className, '\\'); 
    $prepend = "..\\src\\"; 
    $fileName = "{$prepend}"; 
    $namespace = ''; 
    if ($lastNsPos = strrpos($className, '\\')) { 
     $namespace = substr($className, 0, $lastNsPos); 
     $className = substr($className, $lastNsPos + 1); 
     $fileName = $prepend.str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR; 
    } 
    $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; 

    require $fileName; 
}); 
//require '../src/Models/WordGenerator.php'; 

use Models; 

$wg = new WordGenerator("words.english"); 
echo $wg->getRandomWord(); 

Maintenant, cela ne fonctionne pas et je reçois:

Warning: The use statement with non-compound name 'Models' has no effect in C:\xampp\htdocs\Hangman\public\index.php on line 22 

Warning: require(..\src\WordGenerator.php): failed to open stream: No such file or directory in C:\xampp\htdocs\Hangman\public\index.php on line 16 

Fatal error: require(): Failed opening required '..\src\WordGenerator.php' (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs\Hangman\public\index.php on line 16 

Cependant quand je change new WordGenerator-new \Models\WordGenerator cela fonctionne. Maintenant, la question est: comment puis-je passer les espaces de noms déclarés par l'instruction use à la fonction autoloader pour le faire fonctionner correctement?

Répondre

2

Votre instruction use est incorrecte. Vous voulez use Models\WordGenerator;

L'opérateur use ne déclare rien d'autre qu'un alias. Considérons la forme développée:

use Models\WordGenerator as WordGenerator; 

Qui est équivalent.


Vous pouvez alias un espace de noms plutôt que d'une classe, mais il ne fonctionne pas de la manière que vous essayez. Par exemple:

use Models as Foo; 
$wg = new Foo\WordGenerator("words.english"); 

Travaillerait. Cependant:

use Models; 

équivaut à:

use Models as Models; 

Ce qui fait effectivement rien.


Pour plus d'informations, voir Using namespaces: Aliasing/Importing dans le manuel PHP.

+0

Impossible d'utiliser l'espace de noms entier comme dans C++? – Moby04

0

Veuillez regarder documentation. L'autochargeur doit être défini par vous au début de votre script. Au lien fourni il y a exemple de chargeur automatique et plus complexe solution

+0

Voir mes modifications ci-dessus – Moby04