很抱歉的模糊标题,但我试图找到一些更好的替代品不必调用一个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很好的做法点此方法。
也许这是你在找什么。 对于包含你的类运行的每个目录::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);
这实际上是相同与作曲家虽然,只是不太适应或者高性能。
为此,您可以用作曲: 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';
});
然后将所有的类在“类”文件夹,当你与他们初始化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.