这个问题有点奇怪,真的很难解释,所以我会尽力而为。
基本上,我一直想知道如何在他们自己的文件中实际使用类,然后在其他地方使用该类的命名空间。
作为大多数PHP开发人员可能知道的一个例子,就像Laravel对路由所做的那样,你有路由.php文件仅用于路由,顶部没有定义命名空间,例如:use AcmeRouter
- 但是,该类仍然有效并且不会吐出任何错误。这是如何实现的?
例
我的索引在作曲家自动加载器中加载,该加载器也加载我的应用程序类
<?php
// Used namespace here to actually make it function
use AcmeApplication 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 AcmeDatabaseHandler;
use AcmeRouter;
因为从长远来看,这可能会变得非常庞大。
我做错了什么,我应该如何实际处理?
你可能没有清楚地说明你的问题,所以我从过去与经验不足的开发人员的遭遇中做了一些猜测。
我认为我们可以停止讨论"需要文件",因为您应该使用自动加载来使类、接口或特征可用。这很容易做到,因为您已经在使用作曲家。检查。
剩下的一点是,由于列表的大小,您害怕向 Acme\Application 类添加大量"use"语句。对此有两个答案。
首先,有一些关于"use"语句的基本PHP知识。你可以用它寻址显式类,就像你在use AcmeApplication as App;
中所做的那样,但你也可以像use AcmeModels;
一样寻址命名空间前缀,并像这样使用它:new ModelsUser
.这既会缩短 use 语句的列表(因为一个语句将涵盖多个已使用的类(,也会使代码更具可读性,因为您必须添加更多的命名空间作为上下文(new User;
的描述性不如 new ModelsUser
(。可读性是一件好事,因为您只会编写一次代码,但此后会阅读很多次。而且你不想每次遇到模棱两可的类名时都发明别名(这是一个强有力的指标,表明你应该添加该上下文,另一方面,总是发明别名可能会开始让读者感到困惑(。
其次,如果你必须处理很多类,你必须处理很多类。除了分离处理所有这些类的任务之外,没有其他方法。然后你仍然必须处理所有这些,但不是在同一个地方。而且您可能不希望每次都执行此launch()
方法中完成的所有操作,除非您知道您的应用程序现在在此请求中需要它。
您可能想阅读两个主题:依赖注入和延迟加载,因为我认为您的问题更针对应用程序架构。
经过对此的更多研究,我发现我试图实现的是外观而不是应用程序结构,因为我说这很难解释,所以我将把我的问题的解决方案扔在那里。
基本上,由于这种方法来自我在 Laracasts 论坛中询问的大量使用 Laravel,它给了我我想要的东西,它还有一个指向工作存储库的链接。
无论如何,感谢您的帮助!
包括存储库的解决方案