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?
Impossible d'utiliser l'espace de noms entier comme dans C++? – Moby04