如何使用单一实例来注册的自动加载路径。(How to register path in autolo

2019-10-20 22:23发布

很抱歉的模糊标题,但我试图找到一些更好的替代品不必调用一个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();

但是,我不知道是否建议在-至少但从OOP很好的做法点此方法。

Answer 1:

也许这是你在找什么。 对于包含你的类运行的每个目录::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);

这实际上是相同与作曲家虽然,只是不太适应或者高性能。



Answer 2:

为此,您可以用作曲: 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

在项目中包含的引导文件和源目录中的所有类都将自动被加载。



Answer 3:

你看着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';
});

然后将所有的类在“类”文件夹,当你与他们初始化new的关键字,他们将自动包括在内。 工程静态类也。

例如:

$myClassOb1 = new MyClass();
// will include this file: classes/MyClass.class.php

要么

$email = Utils::formatEmail($emailInput);
// will include this file: classes/Utils.class.php


文章来源: How to register path in autoload using a single instance.
标签: php oop autoload