2014-12-08 24 views
1

這個問題有點奇怪,很難解釋,所以我會盡我所能。PHP從文件中排除命名空間的使用情況

基本上,我一直想知道如何在自己的文件中實際使用類,然後在別處使用該類的名稱空間。

作爲一個大多數PHP開發人員可能知道的例子,就像Laravel對路由所做的一樣,您有routes.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文件是一個壞習慣。即便如此,這也將成爲它應該要求的巨大清單。

但是無論我曾嘗試沒有成功,我所試圖做的是避免在我的routes.php文件use或等,以避免事情的清單我想用如:

use Acme\Database\Handler;

use Acme\Router;

,因爲從長遠來看,這可以成爲非常巨大的。

我在做什麼錯,我該如何處理這個問題?

+0

如果你想避免使用需要,你當然應該查找SPL自動加載。這裏有一個很好的標準:https://gist.github.com/jwage/221634。大多數圖書館應符合這種模式(或類似的東西,並附帶自己的自動加載器)。它不能解決你的命名空間問題,但確實有助於解決這個需求。 – 2014-12-08 09:35:35

+0

我目前使用作曲家和psr-4自動加載。這恐怕不是我的問題,它使用的是在其他文件中有名稱空間的類,而沒有在頂部使用''use'的長列表。 – 2014-12-08 09:38:19

+0

在這種情況下,您可能希望從您的問題中刪除對「require」的引用 - 它肯定會讓我困惑! – 2014-12-08 09:39:13

回答

0

因此,經過對此的更多研究後,我發現我試圖實現的是Facade而不是應用程序結構,因爲我說這很難解釋,所以我將把解決方案拋給我的問題。

基本上,由於這種方法來自Laravel很多,我在Laracasts論壇上詢問了我正在尋找的內容,它也有一個鏈接到工作存儲庫。

感謝您的幫助不管!

Solution including repository

1

你可能沒有清楚地說出你的問題,所以我從與過去經驗不足的開發者的交往中進行了一些猜測。

我想我們可以停止討論「需要文件」,因爲您應該使用自動加載來創建類,接口或特性。而且這很容易,因爲你已經在使用Composer。檢查。

剩餘的一點是,由於該列表的大小,您害怕添加大量「使用」語句到您的Acme \ Application類。有兩個答案。

首先,關於「use」語句有一些基本的PHP知識。您可以使用它來解決顯式類,就像您在use Acme\Application as App;中所做的那樣,但您也可以解決名稱空間前綴,如use Acme\Models;,並使用如下形式:new Models\User。這將縮短使用語句的列表(因爲一個語句將覆蓋多於一個使用的類),並且使代碼更具可讀性,因爲您必須添加更多名稱空間作爲上下文(new User;不如new Models\User描述性更好)。可讀性是一件好事,因爲您只會編寫一次代碼,但在此後多次閱讀。而且,每次遇到模糊的類名稱時,您都不想發明別名(這是一個強烈的指示器,應該添加該上下文,另一方面,始終發明別名可能會開始混淆讀者)。

其次,如果你必須處理很多類,你必須處理很多類。除此之外,沒有其他辦法可以分開處理所有這些類的任務。然後你仍然必須處理所有這些問題,但不在同一個地方。你可能不想做的一切這是在這launch()方法完成,除非你知道你的應用程序將需要它現在在這個請求。

您可能想了解兩個主題:依賴注入和延遲加載,因爲我認爲您的問題更多地針對應用程序體系結構。