Как ключевое слово "использовать" работает в PHP и я могу импортировать классы с ним?

У меня есть файл с классом 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? Могу ли я использовать его для импорта классов?

Ответ 1

use не содержит ничего. Он просто импортирует указанное пространство имен (или класс) в текущую область

Если вы хотите, чтобы классы были автоматически загружены, прочитайте автозагрузка

Ответ 2

Нет, вы не можете импортировать класс с ключевым словом 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 с классом, который будет использоваться в качестве аргумента, и это может помочь вам загрузить класс во время выполнения на лету, как и когда это необходимо,

Обратитесь к этому ответу, чтобы узнать больше о автозагрузчике классов.

Ответ 3

Не задумывайтесь над тем, что такое пространство имен.

Пространство имен - это просто префикс класса (например, каталог в операционной системе) для обеспечения уникальности пути к классу.

Кроме того, просто чтобы прояснить ситуацию, оператор 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

Ответ 4

В любом случае вам придется включать/требовать класс, иначе PHP не будет знать об этом пространстве имен.
Однако вам не обязательно делать это в одном файле. Например, вы можете сделать это в файле начальной загрузки. (или использовать автозагрузчик, но это не тема на самом деле)

Ответ 5

Проблема, скорее всего, вам понадобится использовать автозагрузчик, который возьмет имя класса (в этом случае перерыв на "\" ) и сопоставьте его с структурой каталогов.

Вы можете проверить эту статью на автозагрузке функциональности PHP. В рамках уже существует множество реализаций этого типа функций.

Я уже реализовал это раньше. Здесь ссылка .

Ответ 6

Я согласен с Green, Symfony нуждается в пространстве имен, так почему бы не использовать их?

Вот как запускается примерный класс контроллера:

пространство имен Acme\DemoBundle\Controller;

использовать Symfony\Bundle\FrameworkBundle\Controller\Controller;

класс WelcomeController расширяет контроллер {...}

Ответ 7

Ключевое слово use используется для псевдонимов в PHP и не импортирует классы. Это действительно помогает
1) Когда у вас есть классы с одинаковым именем в разных пространствах имен
2) Избегайте использования действительно длинного имени класса снова и снова.

Ответ 8

Могу ли я использовать его для импорта классов?

Вы не можете этого сделать, кроме примеров выше. Вы также можете использовать ключевое слово 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'

Ответ 9

Пространство имен используется для определения пути к конкретному файлу, содержащему класс, например

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
}

ПРИМЕЧАНИЕ. Не используйте путь к файлу, содержащему класс, который должен быть реализован, расширяет область применения для создания экземпляра объекта, но используйте только пространство имен.