Ответ 1
use
не содержит ничего. Он просто импортирует указанное пространство имен (или класс) в текущую область
Если вы хотите, чтобы классы были автоматически загружены, прочитайте автозагрузка
У меня есть файл с классом 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
? Могу ли я использовать его для импорта классов?
use
не содержит ничего. Он просто импортирует указанное пространство имен (или класс) в текущую область
Если вы хотите, чтобы классы были автоматически загружены, прочитайте автозагрузка
Нет, вы не можете импортировать класс с ключевым словом use
. Вы должны использовать оператор include
/require
. Даже если вы используете автозагрузчик PHP, автозагрузчик все равно должен будет использовать или include
или require
внутри.
Цель использования ключевого слова:
Рассмотрим случай, когда у вас есть два класса с одинаковым именем; Вы найдете это странным, но когда вы работаете с большой структурой MVC, это случается. Поэтому, если у вас есть два класса с одинаковыми именами, поместите их в разные пространства имен. Теперь рассмотрим, когда ваш автозагрузчик загружает оба класса (делает по require
), и вы собираетесь использовать объект класса. В этом случае компилятор запутается, какой объект класса загружать среди двух. Чтобы помочь компилятору принять решение, вы можете использовать оператор use
чтобы он мог принять решение о том, какой из них будет использоваться.
В настоящее время основные рамки этого использовать, include
или require
через composer
и psr
1) композитор
2) ПСР-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;
Это будет ссылаться на оригинальный класс.
Некоторые могут запутаться, что тогда не будет похожих имен классов, тогда не будет использоваться ключевое слово use
. Что ж, вы можете использовать __autoload($class)
которая будет вызываться автоматически при выполнении инструкции use
с классом, который будет использоваться в качестве аргумента, и это может помочь вам загрузить класс во время выполнения на лету, как и когда это необходимо,
Обратитесь к этому ответу, чтобы узнать больше о автозагрузчике классов.
Не задумывайтесь над тем, что такое пространство имен.
Пространство имен - это просто префикс класса (например, каталог в операционной системе) для обеспечения уникальности пути к классу.
Кроме того, просто чтобы прояснить ситуацию, оператор 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
В любом случае вам придется включать/требовать класс, иначе PHP не будет знать об этом пространстве имен.
Однако вам не обязательно делать это в одном файле. Например, вы можете сделать это в файле начальной загрузки. (или использовать автозагрузчик, но это не тема на самом деле)
Проблема, скорее всего, вам понадобится использовать автозагрузчик, который возьмет имя класса (в этом случае перерыв на "\" ) и сопоставьте его с структурой каталогов.
Вы можете проверить эту статью на автозагрузке функциональности PHP. В рамках уже существует множество реализаций этого типа функций.
Я уже реализовал это раньше. Здесь ссылка .
Я согласен с Green, Symfony нуждается в пространстве имен, так почему бы не использовать их?
Вот как запускается примерный класс контроллера:
пространство имен Acme\DemoBundle\Controller;
использовать Symfony\Bundle\FrameworkBundle\Controller\Controller;
класс WelcomeController расширяет контроллер {...}
Ключевое слово use
используется для псевдонимов в PHP и не импортирует классы. Это действительно помогает
1) Когда у вас есть классы с одинаковым именем в разных пространствах имен
2) Избегайте использования действительно длинного имени класса снова и снова.
Могу ли я использовать его для импорта классов?
Вы не можете этого сделать, кроме примеров выше. Вы также можете использовать ключевое слово use
внутри классов для импорта traits, например:
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'
Пространство имен используется для определения пути к конкретному файлу, содержащему класс, например
namespace album/className;
class className{
//enter class properties and methods here
}
Затем вы можете включить этот конкретный класс в другой php файл, используя ключевое слово "use", например:
use album/className;
class album extends classname {
//enter class properties and methods
}
ПРИМЕЧАНИЕ. Не используйте путь к файлу, содержащему класс, который должен быть реализован, расширяет область применения для создания экземпляра объекта, но используйте только пространство имен.