”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 自动加载战:PSR-0对PSR-4

自动加载战:PSR-0对PSR-4

发布于2025-03-25
浏览:341

[2

自动加载战:PSR-0对PSR-4

如果您已经超过了PHP培训的初学者阶段,则您听说过PSR-0 - 一种自动加载标准,它定义了自动在代码中自动包含PHP类的方法,而无需使用诸如require和Include。

psr-0

  • PSR-0还支持类名中的下划线作为替代方案,以使从5.2和更早的过渡更加容易。 zend_mail_message也将导致/path/to/project/lib/vendor/zend/mail/message.php.
  • 作曲家
  • 作曲家出现并席卷了PHP软件包管理世界时,情况发生了变化。由于其某些规则,文件夹通常会重复,并且在通过作曲家查看PSR-0类安装时变得太深了。例如,某些文件夹结构最终以这样的方式出现:
小贩/ vendor_name/ package_name/ src/ vendor_name/ package_name/ className.php#vendor_name \ package_name \ className 测试/ vendor_name/ package_name/ classNametest.php#vendor_name \ package_name \ classnametest

这充其量是混乱的,因为:

“ SRC”和“测试”目录必须包括供应商和软件包目录名称。这是PSR-0合规性的工件。

因此,一些高素质的PHP开发人员聚集在一起,为新标准提出建议:PSR-4。

psr-4

小贩/ vendor_name/ package_name/ src/ className.php#vendor_name \ package_name \ className 测试/ classNametest.php#vendor_name \ package_name \ classnametest

升级PSR-0不是一个选项
vendor/
    vendor_name/
        package_name/
            src/
                Vendor_Name/
                    Package_Name/
                        ClassName.php       # Vendor_Name\Package_Name\ClassName
            tests/
                Vendor_Name/
                    Package_Name/
                        ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest

因为PSR-0不允许在类名称

的任何部分之间进行插图路径

这非常重要 - 这意味着实施PSR-4在允许更加清洁的软件包的同时,实施将变得更加复杂。我们称呼为PSR-4面包套件的自动加载,因为它有利于简单之前的包裹清洁度。

选择的方法

建议的目标如下:保留所有软件包必须至少包含两个命名空间级别(供应商和软件包)的PSR-0规则,请确保供应商包装组合可以映射到任何文件夹,并允许在供应商包装组合和完全合格的类名称中的供应商包装组合之间的文件夹中插图。

这意味着我们将能够将我们的类放在软件包代码中的任何位置,对我们作为人类很有意义,并且仍然在PHP中平稳地使用它们,而无需编写替代加载技术或求助于手动加载。

此外,草案明确指出,PSR-4自动加载器绝不应该抛出异常或增加错误,仅仅是因为可以注册多个自动加载器,如果一个人未能加载一堂课,则应给其他人这样做的机会 - 丢下错误并停止流动这种兼容性。如果需要有关故障的其他信息,则应使用PSR-3兼容记录器或其他任意手段。 如示例文件中所示,使用PSR-4自动加载器从以下结构加载类:

/path/to/packages/foo-bar/ src/ baz.php#foo \ bar \ baz qux/ quux.php#foo \ bar \ qux \ quux 测试/ baztest.php#foo \ bar \ baztest qux/ quuxtest.php#foo \ bar \ qux \ quuxtest
vendor/
    vendor_name/
        package_name/
            src/
                Vendor_Name/
                    Package_Name/
                        ClassName.php       # Vendor_Name\Package_Name\ClassName
            tests/
                Vendor_Name/
                    Package_Name/
                        ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest
看起来像这样:

register(); //注册命名空间前缀的基本目录 $ loader-> addNamespace('foo \ bar',''/path/to/packages/foo-bar/src'); $ loader-> addNamespace('foo \ bar',''/path/to/packages/foo-bar/tests');

wall呼叫new \ foo \ bar \ qux \ quux;将尝试从第一个注册目录加载,而新的\ foo \ bar \ qux \ quuxtest;将尝试从第二个加载。

此示例还说明了每个单个名称空间的多个文件夹的使用。

结论

自动加载中没有银色子弹。每种方法都带来了一些优点和缺点 - PSR-4将允许更简单的文件夹结构,但仅通过查看完全合格的名称就可以阻止我们知道班级的确切路径。另一方面,PSR-0在硬盘驱动器上是混乱的,但是支持过去卡住的开发人员(一流的名称用户),并通过查看其名称来帮助我们辨别班级的位置。

您对PSR-4的感觉如何?在下面的评论中让我们知道,或在众多辩论之一中表达您的意见。

无论哪种方式 - 毫无疑问,面向软件包的自动加载将留在这里。如果未正式接受为标准,则由需要它的人实施自定义。我们必须加入讨论并提高该概念以达到正式状态。

经常询问有关PSR-0和PSR-4自动加载的问题

为什么PSR-4已介绍了PSR-0已放在原位时介绍了PSR-&& &&&&&&&&&&&&&&&&&&psr的某些限制的限制为限制的限制为限制范围。 PSR-0在名称空间和目录结构之间的严格相关性导致了深度嵌套的目录,这并不总是实用或有效的。 PSR-4提供了一种更灵活的方法,使开发人员可以将命名空间映射到任何目录,从而减少了对深目录嵌套的需求。

我可以在同一项目中同时使用PSR-0和PSR-4吗?
      /path/to/packages/foo-bar/
          src/
              Baz.php             # Foo\Bar\Baz
              Qux/
                  Quux.php        # Foo\Bar\Qux\Quux
          tests/
              BazTest.php         # Foo\Bar\BazTest
              Qux/
                  QuuxTest.php    # Foo\Bar\Qux\QuuxTest

How does PSR-4 improve upon PSR-0?

 register();

    // register the base directories for the namespace    prefix
    $loader->addNamespace('Foo\Bar', '/path/to/packages/foo-bar/src');
    $loader->addNamespace('Foo\Bar', '/path/to/packages/foo-bar/tests');
已弃用了?

是的,PSR-0已被标记为已弃用。这意味着,尽管它仍然有效,但不建议在新项目中使用。 PSR-4是php中自动加载的推荐标准。

在psr-4中自动加载如何工作?

在psr-4中,自动加载可以通过将一部分名称空间映射到任何目录中来自动加载。然后将其余的名称空间映射到子目录结构。这允许采用自动加载的更灵活,更有效的方法。

使用PSR-4?

如何从psr-0到psr-4迁移到psr-4?

涉及更改名称空间和目录的方式。在PSR-4中,可以将一部分名称空间映射到任何目录,其余的名称空间可以映射到子目录结构。这可能需要重组项目的目录结构。

我可以在较旧的PHP版本中使用psr-4吗?

在PHP中自动加载的未来是什么?

[&& && && &&华未来,PHP中PHP的未来可能会继续不断发展,新的标准和练习是在语言和ecosystems and ecosystems and ecosystems and ecosystems and ecossystems and ecossystems and evolveve and Evenve evolveve。但是,在可预见的将来,PSR-4是PHP中自动加载的建议标准。
最新教程 更多>
  • 解决MySQL错误1153:数据包超出'max_allowed_packet'限制
    解决MySQL错误1153:数据包超出'max_allowed_packet'限制
    mysql错误1153:故障排除比“ max_allowed_pa​​cket” bytes 更大的数据包,用于面对阴谋mysql错误1153,同时导入数据capase doft a Database dust?让我们深入研究罪魁祸首并探索解决方案以纠正此问题。理解错误此错误表明在导入过程中接...
    编程 发布于2025-04-23
  • 如何在GO编译器中自定义编译优化?
    如何在GO编译器中自定义编译优化?
    在GO编译器中自定义编译优化 GO中的默认编译过程遵循特定的优化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    编程 发布于2025-04-23
  • 如何在Chrome中居中选择框文本?
    如何在Chrome中居中选择框文本?
    选择框的文本对齐:局部chrome-inly-ly-ly-lyly solument 您可能希望将文本中心集中在选择框中,以获取优化的原因或提高可访问性。但是,在CSS中的选择元素中手动添加一个文本 - 对属性可能无法正常工作。初始尝试 state)</option> < op...
    编程 发布于2025-04-23
  • 在GO中构造SQL查询时,如何安全地加入文本和值?
    在GO中构造SQL查询时,如何安全地加入文本和值?
    在go中构造文本sql查询时,在go sql queries 中,在使用conting and contement和contement consem per时,尤其是在使用integer per当per当per时,per per per当per. [&​​&&&&&&&&&&&&&&&默元组方法在...
    编程 发布于2025-04-23
  • MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    在两个条件下插入或更新或更新 solution:的答案在于mysql的插入中...在重复键更新语法上。如果不存在匹配行或更新现有行,则此功能强大的功能可以通过插入新行来进行有效的数据操作。如果违反了唯一的密钥约束。实现所需的行为,该表必须具有唯一的键定义(在这种情况下为'名称'...
    编程 发布于2025-04-23
  • FastAPI自定义404页面创建指南
    FastAPI自定义404页面创建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    编程 发布于2025-04-23
  • 如何避免Go语言切片时的内存泄漏?
    如何避免Go语言切片时的内存泄漏?
    ,a [j:] ...虽然通常有效,但如果使用指针,可能会导致内存泄漏。这是因为原始的备份阵列保持完整,这意味着新切片外部指针引用的任何对象仍然可能占据内存。 copy(a [i:] 对于k,n:= len(a)-j i,len(a); k
    编程 发布于2025-04-23
  • C++中如何将独占指针作为函数或构造函数参数传递?
    C++中如何将独占指针作为函数或构造函数参数传递?
    在构造函数和函数中将唯一的指数管理为参数 unique pointers( unique_ptr [2启示。通过值: base(std :: simelor_ptr n) :next(std :: move(n)){} 此方法将唯一指针的所有权转移到函数/对象。指针的内容被移至功能中,在操作...
    编程 发布于2025-04-23
  • C++20 Consteval函数中模板参数能否依赖于函数参数?
    C++20 Consteval函数中模板参数能否依赖于函数参数?
    [ consteval函数和模板参数依赖于函数参数在C 17中,模板参数不能依赖一个函数参数,因为编译器仍然需要对非contexexpr futcoriations contim at contexpr function进行评估。 compile time。 C 20引入恒定函数,必须在编译时进行...
    编程 发布于2025-04-23
  • 如何同步迭代并从PHP中的两个等级阵列打印值?
    如何同步迭代并从PHP中的两个等级阵列打印值?
    同步的迭代和打印值来自相同大小的两个数组使用两个数组相等大小的selectbox时,一个包含country代码的数组,另一个包含乡村代码,另一个包含其相应名称的数组,可能会因不当提供了exply for for for the uncore for the forsion for for ytry...
    编程 发布于2025-04-23
  • Go web应用何时关闭数据库连接?
    Go web应用何时关闭数据库连接?
    在GO Web Applications中管理数据库连接很少,考虑以下简化的web应用程序代码:出现的问题:何时应在DB连接上调用Close()方法?,该特定方案将自动关闭程序时,该程序将在EXITS EXITS EXITS出现时自动关闭。但是,其他考虑因素可能保证手动处理。选项1:隐式关闭终止数...
    编程 发布于2025-04-23
  • 在Python中如何创建动态变量?
    在Python中如何创建动态变量?
    在Python 中,动态创建变量的功能可以是一种强大的工具,尤其是在使用复杂的数据结构或算法时,Dynamic Variable Creation的动态变量创建。 Python提供了几种创造性的方法来实现这一目标。利用dictionaries 一种有效的方法是利用字典。字典允许您动态创建密钥并分...
    编程 发布于2025-04-23
  • 哪种在JavaScript中声明多个变量的方法更可维护?
    哪种在JavaScript中声明多个变量的方法更可维护?
    在JavaScript中声明多个变量:探索两个方法在JavaScript中,开发人员经常遇到需要声明多个变量的需要。对此的两种常见方法是:在单独的行上声明每个变量: 当涉及性能时,这两种方法本质上都是等效的。但是,可维护性可能会有所不同。 第一个方法被认为更易于维护。每个声明都是其自己的语句,使其...
    编程 发布于2025-04-23
  • 切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    Unable to Connect to MySQL Database: Troubleshooting Error MessageWhen attempting to switch from the MySQL driver to the MySQLi driver in CodeIgniter,...
    编程 发布于2025-04-23
  • 查找当前执行JavaScript的脚本元素方法
    查找当前执行JavaScript的脚本元素方法
    如何引用当前执行脚本的脚本元素在某些方案中理解问题在某些方案中,开发人员可能需要将其他脚本动态加载其他脚本。但是,如果Head Element尚未完全渲染,则使用document.getElementsbytagname('head')[0] .appendChild(v)的常规方...
    编程 发布于2025-04-23

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3