自动加载和PSR-0 / PSR-4

时间:2014-11-12 01:34:00

标签: php composer-php

我和许多其他人一样,在使用自动加载的时候和如何使用自动加载时遇到了麻烦。我想我理解作曲家和PSR-0 / PSR-4的概念以及这需要的目录结构。但是,如果我使用自己的MVC框架构建自己的项目

  • 我现在应该将所有类文件放在供应商文件夹
  • 内的src文件夹中
  • 我是否编辑了composer autoload文件?
  • 或者我是否仍保留原始结构,只使用自己的自动加载器?

    -project
        -app
            -core /Main.php
            -controllers /Controller.php
            -models /User.php
        /index.php
    

由于composer带有自己的自动加载器,它将加载我可能希望包含在我的项目中的所有依赖项,如果我不打算将我的网站变成分布式项目,我是否还需要自己的命名空间?为什么我不坚持包含/要求?

最后,如果我使用像这样的闭包来采用命名空间

 function __autoload($class){
    require $class .'.php';
 });

我是否需要在我加载类的所有页面中都需要autoload.php文件,就像我使用过去的旧include / require一样。以上文件是否正确?我认为命名空间是

<?php
namespace app\core;  //for Main.php
namespace app\controllers; //for Controller.php

use app\controllers\Controller; //if I call the class

1 个答案:

答案 0 :(得分:3)

在主文件的开头(可能是/var/www/dist/index.php),您只需添加Composer或您使用的任何自动加载器。

<?php
if ( file_exists( __DIR__.'/path/to/vendor/autoload.php' ) )
    require __DIR__.'/path/to/vendor/autoload.php';

然后,您可以通过使用use语句

为文件中使用的类添加快捷方式
use MyNamespace\Controller\Index,
    MyNamespace\Service\FooService;

use Zend\Foo\Bar;
use Symfony\Baz\Biz;
use Etc\Etc\Etc;

// Refers to \Zend\Foo\Bar
$bar = new Bar;

或在实例化类

时使用完整路径
$bar = new \Zend\Foo\Bar;

要添加自己的命名空间,只需将其添加到composer.json文件

即可
"autoload" : {
    "psr-4" : {
        "MyNamespace\\" : "src/"
    }
}

并打开命令行界面/终端/控制台并将命名空间添加到自动装带器

# local install of Composer in your project
php composer.php dump-autoload
# or global install and `composer` is in your $PATH
composer dump-autoload

有一条规则:

  

每个文件一个类

如果您的项目确实是(PSR-0 已弃用或)PSR-4 compatible,那么您不会在一个文件中使用多个namespace。类名称(在PSR-4 FIG标准中)定义为

  

完全限定的类名具有以下形式:

     

\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>

     

“名称空间前缀”后面的连续子命名空间名称[注意:\是“根”)对应于“基目录”中的子目录,其中名称空间分隔符表示目录分隔符。 / p>

使用以下示例:

+------------------------------+------------------+------------------------+---------------------------------------+
| Fully Qualified Class Name   | Namespace Prefix | Base Directory         | Resulting File Path                   |
+------------------------------+------------------+------------------------+---------------------------------------+
| \Acme\Log\Writer\File_Writer | Acme\Log\Writer  | ./acme-log-writer/lib/ | ./acme-log-writer/lib/File_Writer.php |
+------------------------------+------------------+------------------------+---------------------------------------+