Этот вопрос немного странный и очень трудно объяснить, поэтому я постараюсь изо всех сил.
По сути, мне было интересно, как на самом деле использовать классы внутри своих собственных файлов, а затем использовать пространство имен для этого класса в другом месте.
В качестве примера большинство разработчиков 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;
потому что в долгосрочной перспективе это может стать довольно масштабным.
Что я делаю не так и как мне на самом деле подойти к этому?
Вы, вероятно, не четко сформулировали свой вопрос, поэтому я немного догадываюсь о моих встречах с менее опытными разработчиками из прошлого.
Я думаю, что мы можем перестать обсуждать «требование файлов», потому что вы должны использовать автозагрузку, чтобы сделать классы, интерфейсы или черты доступными. И это легко сделать, потому что вы уже используете Composer. Проверьте.
Осталось сказать, что вы боитесь добавлять огромное количество операторов «use» в ваш класс Acme \ Application из-за размера этого списка. На это есть два ответа.
Во-первых, есть немного базовых знаний PHP об операторе «use». Вы можете обратиться к явным классам с ним, как вы это делали в use Acme\Application as App;
, но вы также можете обратиться к префиксам пространства имен, например use Acme\Models;
и использовать это так: new Models\User
, Это сократит список операторов использования (поскольку один оператор будет охватывать более одного используемого класса), а также сделает код более читабельным, поскольку вам нужно добавить больше пространства имен в качестве контекста (new User;
менее описательный, чем new Models\User
). Читаемость — хорошая вещь, потому что вы будете писать код только один раз, но потом будете читать его много раз. И вы не хотите изобретать псевдонимы каждый раз, когда сталкиваетесь с неоднозначными именами классов (что является сильным показателем того, что вы должны добавить этот фрагмент контекста, а с другой стороны, всегда придумывая псевдонимы, вы начнете путать читателя).
Во-вторых, если вам приходится иметь дело с большим количеством классов, вам приходится иметь дело с большим количеством классов. Другого пути нет, кроме как отделить задачу от всех этих классов. Тогда вам все равно придется иметь дело со всеми из них, но не в одном месте. И вы, вероятно, не хотите делать все это сделано в этом launch()
метод каждый раз если вы не знаете, что ваше приложение будет нуждаться в этом прямо сейчас в этом запросе.
Возможно, вы захотите прочитать о двух темах: внедрение зависимостей и отложенная загрузка, потому что я думаю, что ваш вопрос больше направлен на архитектуру приложений.
Поэтому, после более тщательного изучения этого вопроса, я обнаружил, что я пытался достичь Фасады, а не структуры приложения, поскольку я сказал, что это трудно объяснить, поэтому я собираюсь найти решение моей проблемы.
По сути, так как этот подход основан на использовании Laravel, который я часто спрашивал на форуме Laracasts, который дал мне именно то, что я искал, у него также есть ссылка на рабочий репозиторий.
Спасибо за помощь независимо!