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

时间:2014-12-08 09:28:42

标签: php namespaces url-routing composer-php autoload

这个问题有点奇怪,很难解释,所以我会尽我所能。

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

作为一个例子,大多数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;

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

我做错了什么,我该怎么做呢?

2 个答案:

答案 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论坛中提出了很多问题,它给了我正在寻找的内容,它也有一个指向工作存储库的链接。

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

Solution including repository