PHP исключает использование пространства имен из файла

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

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

В качестве примера большинство разработчиков PHP могут знать, что, как Laravel делает с маршрутами, у вас есть файл rout.php, который предназначен только для маршрутов, в верхней части не определено пространство имен, например: use Acme\Router — Тем не менее, класс все еще работает и не плюет ни на какие ошибки. Как это достигается?

пример

Мой индекс загружается в автозагрузчик composer, который также загружает мой класс приложения

<?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 в моем rout.php или т. д., чтобы избежать списка вещей, которые я хочу использовать, таких как:

use Acme\Database\Handler;

use Acme\Router;

потому что в долгосрочной перспективе это может стать довольно масштабным.

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

1

Решение

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

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

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

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

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

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

1

Другие решения

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

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

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

Решение, включая хранилище

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector