【问题标题】:Autoloading and PSR-0/PSR-4自动加载和 PSR-0/PSR-4
【发布时间】:2015-01-08 18:17:56
【问题描述】:

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

  • 我现在是否应该将我的所有类文件放在供应商文件夹内的 src 文件夹中
  • 然后我要编辑作曲家自动加载文件吗?
  • 还是我仍然保留原来的结构,只使用我自己的自动加载器?

    -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

【问题讨论】:

    标签: php composer-php


    【解决方案1】:

    在您的主文件的开头(可能是/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 标准中)定义为

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

    \&lt;NamespaceName&gt;(\&lt;SubNamespaceNames&gt;)*\&lt;ClassName&gt;

    “命名空间前缀”之后的连续子命名空间名称[注意:\ 是“根”)对应于“基本目录”中的一个子目录,其中命名空间分隔符代表目录分隔符。

    下面的例子:

    +------------------------------+------------------+------------------------+---------------------------------------+
    | 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 |
    +------------------------------+------------------+------------------------+---------------------------------------+
    

    【讨论】:

      猜你喜欢
      • 2014-07-25
      • 2014-02-14
      • 2014-03-24
      • 2013-11-09
      • 2014-08-02
      • 2017-06-24
      • 2014-10-19
      • 2014-09-12
      • 2019-12-22
      相关资源
      最近更新 更多