这个问题有点奇怪,很难解释,所以我会尽我所能。
基本上,我一直想知道如何在自己的文件中实际使用类,然后在其他地方使用该类的命名空间。
作为一个例子,大多数PHP开发人员可能知道,就像Laravel对路由一样,你有仅用于路由的routes.php文件,顶部没有定义名称空间,例如:use Acme\Router
- 但是,类仍然工作,不吐任何错误。这是如何完成的?
示例
我的索引在composer autoloader中加载,它也会加载我的应用程序类
<?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();
启动是针对应用程序在启动后应该执行的操作,这里我正在考虑加载路线等等(我不确定这是否是处理此问题的正确方法,但这是我最好的拍摄。)< / p>
课程是这样的:
<?php
namespace Acme;
class Application
{
public function __construct()
{
}
public function launch()
{
// Require routes etc.
}
}
我最初的想法是要求文件,但我认为这对方法中的require
文件来说是不好的做法。即便如此,这也将成为它应该需要的大量事项。
然而,无论我尝试过什么都没有成功,我想要做的是避免在我的routes.php等中使用use
以避免我想要使用的事项列表,例如:
use Acme\Database\Handler;
use Acme\Router;
因为从长远来看,这可能变得非常庞大。
我做错了什么,我该怎么做呢?
答案 0 :(得分:1)
你可能没有清楚地陈述你的问题,所以我从与过去缺乏经验的开发人员的遭遇中做了一些猜测。
我认为我们可以停止讨论“需要文件”,因为您应该使用自动加载来提供类,接口或特征。因为你已经在使用Composer,所以很容易这样做。检查。
剩下的一点是,由于该列表的大小,您害怕向Acme \ Application类添加大量“use”语句。有两个答案。
首先,有一些关于“use”语句的基本PHP知识。您可以使用use Acme\Application as App;
中的方式处理显式类,但您也可以使用use Acme\Models;
来处理名称空间前缀,并使用它:new Models\User
。这将缩短use语句列表(因为一个语句将覆盖多个已使用的类),并且还使代码更具可读性,因为您必须添加更多名称空间作为上下文(new User;
描述性低于{{ 1}})。可读性是一件好事,因为你只会编写一次代码,但之后会多次阅读。并且每次遇到不明确的类名时都不想创建别名(这是一个强烈的指示,你应该添加这个上下文,另一方面,总是发明别名可能会开始混淆读者)。
其次,如果你必须处理很多课程,你必须处理很多课程。没有别的办法可以分开处理所有这些类的任务。然后你仍然需要处理所有这些,但不是在同一个地方。你可能不想做一切这个<{1}}方法每次,除非你知道你的应用程序现在需要它在这个请求中。
您可能想要阅读两个主题:依赖注入和延迟加载,因为我认为您的问题更多地针对应用程序架构。
答案 1 :(得分:0)
因此,经过对此的更多研究,我发现我想要实现的是Facades而不是应用程序结构,因为我说很难解释所以我会把解决方案解决到我的问题。
基本上,由于这种方法来自于使用Laravel,我在Laracasts论坛中提出了很多问题,它给了我正在寻找的内容,它也有一个指向工作存储库的链接。
感谢您的帮助,无论如何!