【问题标题】:PSR-4 directory structure and namespacing for a set of functions?一组函数的 PSR-4 目录结构和命名空间?
【发布时间】:2015-12-03 06:49:36
【问题描述】:

我有一组我觉得有用的 PHP 函数。我想为它们创建一个符合 PSR-4 的存储库,但我发现的指南(123)似乎只讨论了用于自动加载的类。

例如,我的文件如下,每个文件一个函数:

my_cool_function1.php
my_cool_function2.php
... etc.

如何从它们创建符合 PSR-4 的库?

【问题讨论】:

    标签: php psr-4


    【解决方案1】:

    您找不到任何关于 PSR-4 自动加载非类文件的文档的原因是,正如 specification 所述 - 它是为自动加载类而设计的。

    直接取自官方规格:

    此 PSR 描述了从文件路径自动加载 的规范。它是完全可互操作的,并且可以与任何其他自动加载规范(包括 PSR-0)一起使用。此 PSR 还描述了将根据规范自动加载的文件的放置位置。

    更具体地说;

    术语“”是指接口特征和其他类似的 结构。

    具有函数的文件并不是真正相似的结构。

    要自动加载这些文件,您需要使用 files 自动加载:

    "autoload": {
        "files": [
            "src/my_cool_function1.php",
            "src/my_cool_function2.php"
        ],
        "psr-4": {
            "SomeNamespace\\": "src/YourNamespace/"
        }
    }
    

    您会注意到,psr-4 规范(通常)映射到命名空间。

    【讨论】:

    • 所以,我将这样构造目录:my_lib/function1.php,然后像这样命名它:<?php namespace my_lib; function function1() {}
    • 命名空间应该遵循 PSR4 标准,通常类似于 VendorName\PackageName。仅包含函数的文件(即不是类或类似的结构化文件)不会被命名空间。检查示例github.com/php-fig/fig-standards/blob/master/accepted/…
    【解决方案2】:

    别忘了你可以在类中使用静态函数以便 PSR-4 加载它们

    class MyClass {
        public static my_cool_function1() {}
    }
    

    然后您可以使用冒号运算符将它们作为普通函数调用:

    MyClass::my_cool_function1() {}
    

    【讨论】:

    • 仅仅因为更容易自动加载而创建一个只有静态函数作为成员的类真的合理吗?
    • 创建一个只有函数作为内容的文件真的合理吗?
    • 没有什么能阻止您在单个文件和/或命名空间中包含多个函数。事实上,如果他们决定用 PHP 编写普通的旧函数,很多人最终都会这样做。由于缺少与函数自动加载器相对应的东西,您必须确保自己加载函数,并且通常每个新文件都可能是管理的痛苦或风险。为什么不担心类是文件中的唯一对象?因为您永远不必担心它。
    • 所以你说得有道理。我更感叹的是,当您想编写一个独立函数并使其易于在代码中的任何地方使用时,您需要将它放在一个不使用的类中,在这种情况下,它只不过是一个命名空间确实。
    • 很多时候,这些函数也只是添加到第一次碰巧需要它们的类中,即使函数的逻辑可以在任何地方使用,这会降低你开始时的可读性在其他地方使用该函数,并且可能很难重构。
    猜你喜欢
    • 2023-04-02
    • 2013-06-29
    • 2014-11-12
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 2017-01-18
    • 2015-12-01
    • 1970-01-01
    相关资源
    最近更新 更多