【问题标题】:Autoload PSR-4 Specific Class自动加载 PSR-4 特定类
【发布时间】:2020-01-01 02:35:57
【问题描述】:

我通过 PSR-4 进行了自动加载设置,效果非常好。但是,我希望能够在此之上添加一个特定的类,我可以从应用程序的任何地方访问它。

这是我目前拥有的:

    "autoload": {
       "psr-4": {
          "App\\": "app"
         }
     }

但是我想添加一个名为“Redis”的类,它位于 app/Lib/Redis.php 中,这样我就可以从任何控制器调用 Redis::method();无需添加“使用 App\Lib\Redis;”到每个文件的顶部。

这可能吗?

【问题讨论】:

  • 即使这是可能的,它首先会破坏为类命名空间的整个目的。学会爱上use 语句,并依赖接口,而不是实现。
  • 而您只想使用自动加载提供的功能来执行此操作?我的意思是,您是否还想在当前代码中添加一些代码(如新类)以实现您想要的?如果是,您应该知道这是可能的。阅读有关外观设计模式的信息,它为您提供了想法(甚至是解决方案)。对于一个真实世界的例子,看看 Laravel 源代码,看看它们是如何实现门面的,特别是它们是如何在没有任何命名空间的情况下访问它们的别名。
  • 这个article 有点老了,但似乎很详细地解释了 Laravel 机制。

标签: php slim psr-4


【解决方案1】:

这不能直接完成。

你可以创建一个全局函数 redis() 并注册而不是使用 composer:

"autoload": {
    "psr-4": {
        "App\\": "app"
    },
    "files"" {
        "app/functions.php",
    }
}

如果此 redis() 函数返回您的 Redis 类的实例,那么我认为您可以这样做:

redis()->method();

您是否应该这样做是另一回事 - 单元测试变得非常有问题。就个人而言,我会有一个 use 语句,并将 Redis 对象的实例注入到需要它的类的构造函数中。

【讨论】:

    猜你喜欢
    • 2015-01-08
    • 2015-07-31
    • 2023-01-31
    • 2014-07-25
    • 2018-06-01
    • 2014-10-19
    • 2016-12-05
    • 2017-02-01
    • 2017-09-15
    相关资源
    最近更新 更多