У меня есть файл с классом Resp
. Путь это:
C:\xampp\htdocs\One\Classes\Resp.php
И у меня есть index.php
файл в этом каталоге:
C:\xampp\htdocs\Two\Http\index.php
В этом index.php
файле я хочу создать экземпляр класса Resp
.
$a = new Resp();
Я знаю, я могу использовать require
или include
ключевые слова, чтобы включить файл с классом:
require("One\Classes\Resp.php"); // I've set the include_path correctly already ";C:\xampp\htdocs". It works.
$a = new Resp();
Но я хочу импортировать классы без использования require
или include
. Я пытаюсь понять, как use
работает ключевое слово. Я попробовал эти шаги, но ничего не работает:
use One\Classes\Resp;
use xampp\htdocs\One\Classes\Resp;
use htdocs\One\Classes\Resp;
use One\Classes;
use htdocs\One\Classes; /* nothing works */
$a = new Resp();
Это говорит:
Fatal error: Class 'One\Classes\Resp' not found in C:\xampp\htdocs\Two\Http\index.php
Как работает ключевое слово use
? Могу ли я использовать его для импорта классов?
namespace
s. На самом деле Symfony не существует, если вы не используете пространства именОтветы:
use
ничего не включает Он просто импортирует указанное пространство имен (или класс) в текущую областьЕсли вы хотите, чтобы классы загружались автоматически - читайте об автозагрузке
источник
Нет, вы не можете импортировать класс с
use
ключевым словом. Вы должны использоватьinclude
/require
заявление. Даже если вы используете автозагрузчик PHP, автозагрузчик все равно придется использовать либо внутри,include
либоrequire
внутри.Цель использования ключевого слова:
Рассмотрим случай, когда у вас есть два класса с одинаковым именем; Вы найдете это странным, но когда вы работаете с большой структурой MVC, это случается. Поэтому, если у вас есть два класса с одинаковыми именами, поместите их в разные пространства имен. Теперь рассмотрим, когда ваш автозагрузчик загружает оба класса (делает by
require
), и вы собираетесь использовать объект класса. В этом случае компилятор запутается, какой объект класса загружать среди двух. Чтобы помочь компилятору принять решение, вы можете использовать этотuse
оператор, чтобы он мог принять решение о том, какой из них будет использоваться.В настоящее время основные структуры используют
include
илиrequire
черезcomposer
иpsr
1) композитор
2) ПСР-4 автозагрузчик
Проходя через них, может помочь вам в дальнейшем. Вы также можете использовать псевдоним для адресации точного класса. Предположим, у вас есть два класса с одинаковым именем, скажем,
Mailer
с двумя разными пространствами имен:и
И если вы хотите использовать оба класса Mailer одновременно, вы можете использовать псевдоним.
Позже в вашем коде, если вы хотите получить доступ к этим объектам класса, вы можете сделать следующее:
Это будет ссылаться на оригинальный класс.
Некоторые могут запутаться, что тогда нет похожих имен классов, тогда
use
ключевое слово не используется . Ну, вы можете использовать__autoload($class)
функцию, которая будет вызываться автоматически, когдаuse
оператор выполняется с классом, который будет использоваться в качестве аргумента, и это может помочь вам загрузить класс во время выполнения на лету, как и когда это необходимо.Обратитесь к этому ответу, чтобы узнать больше о автозагрузчике классов.
источник
use
оператор way покажет, что компилятор загрузит это для меня сейчас. Дорогая!Не задумывайтесь над тем, что такое пространство имен .
Пространство имен - это просто префикс класса (например, каталог в операционной системе) для обеспечения уникальности пути к классу .
Также, чтобы прояснить ситуацию, оператор use ничего не делает, только накладывая псевдонимы на свои пространства имен, поэтому вы можете использовать ярлыки или включать классы с тем же именем, но с другим пространством имен в один и тот же файл.
Например:
Если вы хотите узнать, как работают пространства имен PHP и автозагрузка (как по старому, так и по-новому с Composer), вы можете прочитать сообщение в блоге, которое я только что написал по этой теме: https://enterprise-level-php.com/ 2017/12 / 25 /-магия-за-самозарядных-PHP-файлов, используя-composer.html
источник
В любом случае вам придется включить / потребовать этот класс, иначе PHP не будет знать о пространстве имен.
Вам не обязательно делать это в одном файле. Вы можете сделать это в файле начальной загрузки, например. (или использовать автозагрузчик, но это не тема на самом деле)
источник
Скорее всего, проблема заключается в том, что вам нужно будет использовать автозагрузчик, который возьмет имя класса (в данном случае разбитое на '\') и отобразит его в структуре каталогов.
Вы можете проверить эту статью о функциональности автозагрузки PHP. В фреймворках уже есть много реализаций этого типа функциональности.
Я на самом деле реализовал один раньше. Вот ссылка .
источник
Я согласен с Green, Symfony нужно пространство имен, так почему бы не использовать их?
Вот как начинается пример класса контроллера:
источник
Вы не можете сделать это так, кроме приведенных выше примеров. Вы также можете использовать ключевое слово
use
внутри классов для импорта черт , например:источник
use
Ключевое слово для наложения на PHP и не импортировать классы. Это действительно помогает1) Когда у вас есть классы с одинаковыми именами в разных пространствах имен
2) Избегайте использования действительно длинных имен классов снова и снова.
источник
Пространство имен используется для определения пути к конкретному файлу, содержащему класс, например
Затем вы можете включить этот конкретный класс в другой php-файл, используя ключевое слово «use», например:
ПРИМЕЧАНИЕ. Не используйте путь к файлу, содержащему класс, который должен быть реализован, расширяет область применения для создания экземпляра объекта, но используйте только пространство имен.
источник
Использование ключевого слова «use» для сокращения литералов пространства имен. Вы можете использовать как с псевдонимами, так и без него. Без псевдонимов вы должны использовать последнюю часть полного пространства имен.
источник