У меня есть файл с классом 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 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
не содержит ничего. Он просто импортирует указанное пространство имен (или класс) в текущую область
Если вы хотите, чтобы классы были автоматически загружены – прочитайте об автозагрузке
Нет, вы не можете импортировать класс с ключевым словом use
. Вы должны использовать оператор include
/ require
. Даже если вы используете автозагрузчик PHP, автозагрузчик по-прежнему должен использовать либо include
либо require
внутренне.
Целевое использование ключевого слова:
Рассмотрим случай, когда у вас есть два класса с одинаковым именем; вы обнаружите, что это странно, но когда вы работаете с большой структурой MVC, это происходит. Поэтому, если у вас есть два класса с одинаковым именем, поместите их в разные пространства имен. Теперь рассмотрим, когда ваш автозагрузчик загружает оба класса (по require
), и вы собираетесь использовать объект класса. В этом случае компилятор будет путать, какой объект класса загружается между двумя. Чтобы помочь компилятору принять решение, вы можете использовать оператор use
чтобы он мог принять решение, на которое он будет использоваться.
В настоящее время основные структуры используют использование или require
от composer
и psr
1) композитор
2) автозагрузчик PSR-4
Прохождение через них может помочь вам дальше. Вы также можете использовать псевдоним для определения точного класса. Предположим, у вас есть два класса с тем же именем, например Mailer
с двумя разными пространствами имен:
namespace SMTP; class Mailer{}
а также
namespace Mailgun; class Mailer{}
И если вы хотите одновременно использовать оба класса Mailer, вы можете использовать псевдоним.
use SMTP\Mailer as SMTPMailer; use Mailgun\Mailer as MailgunMailer;
Позже в вашем коде, если вы хотите получить доступ к этим объектам класса, вы можете сделать следующее:
$smtp_mailer = new SMTPMailer; $mailgun_mailer = new MailgunMailer;
Он будет ссылаться на исходный класс.
В любом случае вам придется включать / требовать класс, иначе PHP не будет знать об этом пространстве имен.
Однако вам не обязательно делать это в одном файле. Например, вы можете сделать это в файле начальной загрузки. (или использовать автозагрузчик, но на самом деле это не тема)
Проблема, скорее всего, вам нужно будет использовать автозагрузчик, который возьмет имя класса (в этом случае перерыв на «\») и сопоставьте его с структурой каталогов.
Вы можете проверить эту статью на функции автозагрузки PHP. В рамках уже существует множество реализаций этого типа функциональных возможностей.
Я уже реализовал это раньше. Вот ссылка .
Я согласен с Green, Symfony нуждается в пространстве имен, так почему бы не использовать их?
Вот как начинается класс контроллера:
пространство имен Acme \ DemoBundle \ Controller;
используйте Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller;
class WelcomeController расширяет Controller {…}
Ключевое слово use
для псевдонимов в PHP и не импортирует классы. Это действительно помогает
1) Когда у вас есть классы с одинаковым именем в разных пространствах имен
2) Избегайте использования действительно длинного имени класса снова и снова.
Могу ли я использовать его для импорта классов?
Вы не можете сделать это так же, как и вышеприведенные примеры. Вы также можете использовать ключевое слово use
внутри классов для импорта признаков , например:
trait Stuff { private $baz = 'baz'; public function bar() { return $this->baz; } } class Cls { use Stuff; // import traits like this } $foo = new Cls; echo $foo->bar(); // spits out 'baz'
Не переусердствуйте, что такое пространство имен .
Пространство имен – это просто префикс класса (например, каталог в операционной системе), чтобы обеспечить уникальность пути класса .
Кроме того, чтобы все было ясно, оператор use ничего не делает, просто накладывая пространство имен, чтобы вы могли использовать ярлыки или включать классы с тем же именем, но другое пространство имен в том же файле.
Например:
// You can do this at the top of your Class use Symfony\Component\Debug\Debug; if ($_SERVER['APP_DEBUG']) { // So you can utilize the Debug class it in an elegant way Debug::enable(); // Instead of this ugly one // \Symfony\Component\Debug\Debug::enable(); }
Если вы хотите знать, как работает PHP-пространство имен и автозагрузка (как старый, так и новый способ с Composer), вы можете прочитать сообщение в блоге, которое я только что написал по этой теме: https://enterprise-level-php.com/ 2017/12 / 25 /-магия-за-самозарядные-PHP-файлы, используя-composer.html