2014-12-08 2 views
1

Этот вопрос немного странный и очень трудно объяснить, поэтому я постараюсь изо всех сил.PHP исключает использование пространства имен из файла

В принципе, мне было интересно, как на самом деле использовать классы внутри своих собственных файлов, а затем использовать пространство имен для этого класса в другом месте.

В качестве примера, который может знать большинство разработчиков PHP, например, Laravel с маршрутами, у вас есть файл route.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 в моем routes.php или и т.д., чтобы избежать список вещей, которые я хочу использовать такие как:

use Acme\Database\Handler;

use Acme\Router;

, потому что в конечном счете, это может стать довольно массивны.

Что я делаю неправильно и как я должен на самом деле подойти к этому?

+0

Если вы хотите, чтобы избежать использования требуется, вы, конечно, должны искать SPL автозагрузчики. Здесь есть хороший стандарт: https://gist.github.com/jwage/221634. Большинство библиотек должны соответствовать этому шаблону (или что-то подобное и поставляться со своим автозагрузчиком). Он не решает проблему с пространством имен, но помогает в этом. –

+0

В настоящее время я загружаю автозагрузку с использованием композитора и psr-4. Это не моя проблема, я боюсь, она использует классы, которые имеют пространство имен в других файлах, не имея длинного списка 'use' в верхней части. –

+0

В этом случае вы, вероятно, захотите отказаться от ссылки на 'require' из вашего вопроса - это, безусловно, смутило меня! –

ответ

0

Итак, после более подробных исследований я выяснил, чего я пытаюсь достичь, поскольку Фасад не является структурой приложения, поскольку я сказал, что это трудно объяснить, поэтому я собираюсь бросить решение своей проблемы там.

В основном, поскольку этот подход исходит от использования Laravel, который я задал на форуме Laracasts, который дал мне именно то, что я искал, у него есть ссылка на рабочий репозиторий.

Спасибо за помощь независимо!

Solution including repository

1

Возможно, вы явно не определили свой вопрос, поэтому я немного угадываю из своих встреч с менее опытными разработчиками из прошлого.

Я думаю, что мы можем перестать обсуждать «требующие файлов», потому что вы должны использовать автозагрузку, чтобы сделать классы, интерфейсы или свойства доступными. И это легко сделать, потому что вы уже используете Composer. Проверьте.

Оставшаяся часть заключается в том, что вы боитесь добавить огромное количество «использования» операторов в ваш класс Acme \ Application из-за размера этого списка. На это два ответа.

Во-первых, есть немного базовых знаний PHP о инструкции «use». Вы можете адресовать явные классы с ним, как вы делали в use Acme\Application as App;, но вы также можете использовать префиксы пространства имен, например use Acme\Models;, и использовать его следующим образом: new Models\User. Это сократит список операторов использования (поскольку один оператор будет охватывать более одного используемого класса), а также сделать код более читаемым, потому что вам нужно добавить больше пространства имен в качестве контекста (new User; менее наглядно, чем new Models\User). Читаемость - это хорошо, потому что вы будете писать код только один раз, но после этого прочитайте его много раз.И вы не хотите изобретать псевдонимы каждый раз, когда сталкиваетесь с неоднозначными именами классов (что является сильным индикатором того, что вы должны добавить этот фрагмент контекста, а с другой стороны, всегда изобретать псевдонимы, скорее всего, начнет путать читателя).

Во-вторых, если вам нужно иметь дело с большим количеством занятий, вам нужно иметь дело с множеством классов. Другого пути нет, кроме как отделить задачу, связанную со всеми этими классами. Тогда вам все равно придется иметь дело со всеми из них, но не в том же месте. И вы, вероятно, не хотите делать все Это делается в этом launch() методе каждый раз, когда, если вы не знаете, что ваше приложение будет нуждаться в нем прямо сейчас в этом запросе.

Возможно, вы захотите ознакомиться с двумя темами: инъекция зависимостей и ленивая загрузка, потому что я думаю, что ваш вопрос больше ориентирован на архитектуру приложения.

Смежные вопросы