De nombreux développeurs qui écrivent des applications orientées objet créent un fichier source PHP par définition de classe. L'un des plus grands ennuis est avoir à écrire une longue liste de comprend nécessaire au début de chaque script (un pour chaque classe).PHP Autoload classes sans importer les espaces de noms au-dessus de chaque script
En PHP 5, ce n'est plus nécessaire. La fonction spl_autoload_register() enregistre n'importe quel nombre d'autochargeurs, ce qui permet de charger automatiquement les classes et les interfaces si elles ne sont pas actuellement définies . Source: http://php.net/manual/en/language.oop5.autoload.php
Eh bien, je trouve que cette déclaration n'est pas vrai, parce que je finis toujours par écrire longue liste de
comprend
les importations dans chaque fichier simplement parce que je suis en utilisant différents sous-dossiers dans mon inclut dossier et namespaces selon la convention de codage PSR-0 de PHP-FIG.
includes/core/database/
includes/core/html/
includes/domain/
etc.
spl_autoload_register()
Impossible de charger automatiquement DB, HTML classes logiques de domaine, car il ne connaît pas la structure du dossier dans lequel le fichier est donc je suis en utilisant les espaces de noms à lui, mais il faut tout autant l'espace comme ayant les importations au-dessus de tous les scénario.
use MyProject\Core\Database;
use MyProject\Core\Html;
use MyProject\domain;
J'utilise différentes classes par script afin que je ne peux pas simplement faire un gros fichier et include_once()
, en plus de l'importation de namespaces ne fonctionne pas avec include_once()
.
J'instancier classe comme ceci
try {
$DBQuery = new Database\DBQuery();
$HtmlGenerator = new Html\HtmlGenerator();
$domain = new domain\UserRegister();
} catch (Error $e) {
echo $e->getMessage();
}
Ma fonction Autoload
spl_autoload_register(function ($fullyQualifiedClassName) {
//change backslash in namespace name to DIRECTORY_SEPARATOR for file system
if (stristr($fullyQualifiedClassName, "\\")) {
$fullyQualifiedClassName = str_ireplace("\\", DIRECTORY_SEPARATOR, $fullyQualifiedClassName);
}
//function dirname() used because THIS file in sub folder /includes and we need to go to parent folder
$class_path = $lib_patch . DIRECTORY_SEPARATOR . "{$fullyQualifiedClassName}.php";
if (!is_file($class_path)) {
throw new Error("Unable to load class with path: $class_path");
}
require_once $class_path;
});
Toute façon je peux éviter d'importer plusieurs espaces de noms à ce que je suis ouvert à arrêter en utilisant namespaces complètement, mais je voudrais conserve ma structure de sous-dossier. Est-ce que la fonction de chargement automatique permet de savoir dans quel dossier se trouvent mes fichiers sans faire de code qui fera une boucle dans chaque sous-dossier à la recherche d'un fichier, par exemple. DBQuery.php
car cela aura un impact sur les performances.
Bien que vous ne répondiez pas immédiatement à votre question, jetez un coup d'œil à l'utilisation de composer pour la résolution d'importation de votre projet. L'autre façon est de faire une recherche de fichier récursif pour appeler spl_autoload_register. – thepratt