当前位置: 首页 > 知识库问答 >
问题:

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

彭坚壁
2023-03-14

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

>

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

由于composer自带了自动加载器,它将加载我希望包含在项目中的所有依赖项,如果我不打算将我的网站变成分布式项目,我甚至需要自己的名称空间吗?为什么我不坚持使用include/requires?

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

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

我需要自动加载吗。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个答案

祁嘉言
2023-03-14

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

<?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兼容的,那么您不会在一个文件中使用多个命名空间。类名(在PSR-4 FIG标准中)定义为

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

\

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

以下面的例子:

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

 类似资料:
  • 我开始学习Composer,并正在开发一个系统,在该系统中,我将文件与核心应用程序文件分开,如下所示: 所以,要在composer中设置此设置。json文件并访问所有类/App much/Core会这样吗? 还是有更正确的方法? 我也读过PSR-0和PSR-4的比较,我仍然有点怀疑应该使用哪一种。在我的情况下,我应该实现什么,PSR-0还是PSR-4?

  • 我有一个在本地运行良好的Laravel项目(Mavericks),但是psr-4下的类没有加载到我们的后台服务器(CentOS)上。每次尝试composer更新或运行artisan命令时,我都会收到一个反射“未找到类”错误。 我的所有特定于应用程序的类都存储在我的Laravel项目的app/heatherland下,例如: 我的composer.json包含以下条目: 在本地,psr-4类被添加到

  • 1. 概述 本 PSR 是关于由文件路径 自动载入 对应类的相关规范, 本规范是可互操作的,可以作为任一自动载入规范的补充,其中包括 PSR-0,此外, 本 PSR 还包括自动载入的类对应的文件存放路径规范。 关于「能愿动词」的使用 为了避免歧义,文档大量使用了「能愿动词」,对应的解释如下: 必须 (MUST):绝对,严格遵循,请照做,无条件遵守; 一定不可 (MUST NOT):禁令,严令禁止;

  • 问题内容: 最近,我阅读了有关名称空间及其有益之处的信息。我目前正在Laravel中创建一个项目,并尝试从类映射自动加载转到命名空间。但是,我似乎无法理解PSR-0和PSR-4之间的实际区别。 我读过的一些资源是… 自动装弹机之战 Laracasts PSR-4自动加载 PSR-0 PSR-4 我的理解: PSR-4不会将下划线转换为目录分隔符 作曲者的某些特定规则导致目录结构变得复杂,这又使PS

  • 最近我读了一些关于名称空间的文章,以及它们是如何有益的。我目前正在Laravel中创建一个项目,并尝试从类映射自动加载转移到名称空间。然而,我似乎无法理解PSR-0和PSR-4之间的实际区别。 我读到的一些资源是。。。 自动装弹机之战 Laracasts PSR-4自动加载 PSR-0 PSR-4 我的理解是: PSR-4不会将下划线转换为目录分隔符 请举例说明差异。

  • 如何自动加载助手函数(在任何类之外)?我可以在应该首先加载的某种引导文件?