Как зарегистрировать путь в автозагрузке с помощью одного экземпляра.

Извините за неопределенный заголовок, но я пытаюсь найти несколько альтернатив тому, чтобы вы вызывали класс 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(); 

Но я не уверен, рекомендуется ли этот метод, по крайней мере, с точки зрения хорошей практики ООП.

Related of "Как зарегистрировать путь в автозагрузке с помощью одного экземпляра."

Возможно, это то, что вы ищете. Для каждого каталога, содержащего ваши классы, запускайте ::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