Извините за неопределенный заголовок, но я пытаюсь найти несколько альтернатив тому, чтобы вы вызывали класс Autoloader
и метод register
несколько раз, чтобы сопоставить пути классов, как показано ниже.
$ClassLoader = new Autoloader\Loader(__DIR__.'/path/to/someclass'); $ClassLoader->register(); $ClassLoader = new Autoloader\Loader(_DIR__.'/path/to/anotherclass'); $ClassLoader->register(); $ClassLoader = new Autoloader\Loader(__DIR__.'/path/to/anotherclass'); $ClassLoader->register(); $ClassLoader = new Autoloader\Loader(__DIR__.'/path/to/anotherclass'); $ClassLoader->register(); $ClassLoader = new Autoloader\Loader(__DIR__.'/path/to/anotherclass'); $ClassLoader->register();
Это продолжается и продолжается примерно для 50 строк, и я хотел бы знать, как я могу обрабатывать классы автозагрузки с помощью простого решения нескольких строк. Я могу, очевидно, ввести массив, в конструктор:
$ClassLoader = new Autoloader\Loader( ['paths'=>[ '/path/to/class/', '/path/to/anotherclass', '/path/to/anotherclass' ]); $ClassLoader->register();
Но я не уверен, рекомендуется ли этот метод, по крайней мере, с точки зрения хорошей практики ООП.
Возможно, это то, что вы ищете. Для каждого каталога, содержащего ваши классы, запускайте ::add
.
namespace ClassLoader; class Loader { protected $directories = array(); public function __construct() { spl_autoload_register([$this, 'load']); } public function add($dir) { $this->directories[] = rtrim($dir, '/\\'); } private function load($class) { $classPath = sprintf('%s.php', str_replace('\\', '/', $class)); foreach($this->directories as $dir) { $includePath = sprintf('%s/%s', $dir, $classPath); if(file_exists($includePath)) { require_once $includePath; break; } } } } $loader = new Loader(); $loader->add(__DIR__.'/src'); $loader->add(__DIR__.'/vendor'); use Symfony\Component\Finder\Finder; $finder = new Finder(); // Included /var/www/test/vendor/Symfony/Component/Finder/Finder.php // I put the Symfony components in that directory manually for this example. print_r($finder);
Это фактически то же самое, что и с композитором, хотя и менее адаптивным или исполнительным.
Для этого вы можете использовать Composer: https://getcomposer.org/download/
Вы получите файл с именем composer.phar
. Поместите это в свой каталог проекта, затем перейдите в этот каталог в командной строке.
Запустите php composer.phar init
.
Это задаст вам несколько вопросов, которые вы можете игнорировать, в конце концов вы получите новый файл с именем composer.json
Он должен выглядеть примерно так:
{ "autoload": { "psr-0": { "": "src/" } }, "require": {} }
Добавьте поле autoload
и замените src/
на каталог, содержащий ваши классы. Убедитесь, что каталог существует.
Затем запустите php composer.phar install
.
Это создаст каталог под названием vendor
. Внутри этого каталога находится файл autoload.php
.
Включите этот файл в загрузочный файл вашего проекта, и все классы в исходном каталоге будут загружены автоматически.
Вы заглянули в функцию spl_autoload_register ?
Применение
// pre php 5.3 function my_autoloader($class) { include 'classes/' . $class . '.class.php'; } spl_autoload_register('my_autoloader'); // Or, using an anonymous function as of PHP 5.3.0 spl_autoload_register(function ($class) { include 'classes/' . $class . '.class.php'; });
затем поместите все свои классы в папку «classes», и когда вы инициализируете их new
ключевым словом, они будут автоматически включены. Работает также со статическими классами.
например:
$myClassOb1 = new MyClass(); // will include this file: classes/MyClass.class.php
или
$email = Utils::formatEmail($emailInput); // will include this file: classes/Utils.class.php