PHP 从文件中排除命名空间的使用


PHP exclude namespace usage from file

这个问题有点奇怪,真的很难解释,所以我会尽力而为。

基本上,我一直想知道如何在他们自己的文件中实际使用类,然后在其他地方使用该类的命名空间。

作为大多数PHP开发人员可能知道的一个例子,就像Laravel对路由所做的那样,你有路由.php文件仅用于路由,顶部没有定义命名空间,例如:use Acme'Router - 但是,该类仍然有效并且不会吐出任何错误。这是如何实现的?

我的

索引在作曲家自动加载器中加载,该加载器也加载我的应用程序类

<?php
// Used namespace here to actually make it function
use Acme'Application as App;
require_once __DIR__ . '/vendor/autoload.php';
$app = new App;
$app->launch();
启动是

针对应用程序启动后应该做的事情,在这里我正在考虑加载路由等(我不确定这是否是处理此问题的正确方法,但这是我最好的机会。

类是这样的:

<?php
namespace Acme;
class Application
{
    public function __construct()
    {
    }
    public function launch()
    {
        // Require routes etc.  
    }
}

我最初的想法是需要文件,但我认为在方法中require文件是一种不好的做法。即便如此,这也将成为它应该需要的大量清单。

然而,无论我尝试过什么都没有成功,我试图做的是避免在我的路线中出现use.php或者等,以避免我想使用的东西列表,例如:

use Acme'Database'Handler;

use Acme'Router;

因为从长远来看,这可能会变得非常庞大。

做错了什么,我应该如何实际处理?

你可能没有清楚地说明你的问题,所以我从过去与经验不足的开发人员的遭遇中做了一些猜测。

我认为我们可以停止讨论"需要文件",因为您应该使用自动加载来使类、接口或特征可用。这很容易做到,因为您已经在使用作曲家。检查。

剩下的一点是,由于列表的大小,您害怕向 Acme''Application 类添加大量"use"语句。对此有两个答案。

首先,有一些关于"use"语句的基本PHP知识。你可以用它寻址显式类,就像你在use Acme'Application as App;中所做的那样,但你也可以像use Acme'Models;一样寻址命名空间前缀,并像这样使用它:new Models'User .这既会缩短 use 语句的列表(因为一个语句将涵盖多个已使用的类(,也会使代码更具可读性,因为您必须添加更多的命名空间作为上下文(new User;的描述性不如 new Models'User (。可读性是一件好事,因为您只会编写一次代码,但此后会阅读很多次。而且你不想每次遇到模棱两可的类名时都发明别名(这是一个强有力的指标,表明你应该添加该上下文,另一方面,总是发明别名可能会开始让读者感到困惑(。

其次,如果你必须处理很多类,你必须处理很多类。除了分离处理所有这些类的任务之外,没有其他方法。然后你仍然必须处理所有这些,但不是在同一个地方。而且您可能不希望每次都执行此launch()方法中完成的所有操作,除非您知道您的应用程序现在在此请求中需要它。

您可能想阅读两个主题:依赖注入和延迟加载,因为我认为您的问题更针对应用程序架构。

因此,

经过对此的更多研究,我发现我试图实现的是外观而不是应用程序结构,因为我说这很难解释,所以我将把我的问题的解决方案扔在那里。

基本上,由于这种方法来自我在 Laracasts 论坛中询问的大量使用 Laravel,它给了我我想要的东西,它还有一个指向工作存储库的链接。

无论如何,感谢您的帮助!

包括存储库的解决方案