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



у меня есть файл с классом Resp. Путь таков:



C:xampphtdocsOneClassesResp.php


и index.php файл в эту директорию:



C:xampphtdocsTwoHttpindex.php


в этой index.php файл я хочу создать экземпляр класса Resp.



$a = new Resp();


я знаю, что могу использовать require или include ключевые слова для включения файла с классом:



require("OneClassesResp.php");       // I've set the include_path correctly already ";C:xampphtdocs". It works.
$a = new Resp();


но я хочу импортировать классы без использования require или include. Я пытаюсь понять, как use ключевое слово работает. Я пробовал эти шаги, но ничего не работает:



use OneClassesResp;
use xampphtdocsOneClassesResp;
use htdocsOneClassesResp;
use OneClasses;
use htdocsOneClasses; /* nothing works */

$a = new Resp();


он говорит:



Fatal error: Class 'OneClassesResp' not found in C:xampphtdocsTwoHttpindex.php


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

1784   8  

8 ответов:

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

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

нет, вы не можете импортировать класс с use ключевое слово. Вы должны использовать include/require заявление. Даже если вы используете PHP auto loader, все равно autoloader придется использовать либо include или require внутренне.

цель использовать ключевые слова:

рассмотрим случай, когда у вас есть два класса с одинаковым именем; вы найдете это странным, но когда вы работаете с большой структурой MVC, это происходит. Так что если у вас есть два класса с одно и то же имя, поместите их в разные пространства имен. Теперь рассмотрим, когда ваш автоматический загрузчик загружает оба класса (делает по require), и вы собираетесь использовать объект класса. В этом случае компилятор запутается, какой объект класса загружать среди двух. Чтобы помочь компилятору принять решение, вы можете использовать use заявление, чтобы он мог принять решение, какой из них будет использоваться.

в настоящее время основные механизмы использую include или require через composer и psr

1) композитор

2) PSR-4 автозагрузчик

просмотр их может помочь вам в дальнейшем. Вы также можете использовать псевдоним для обращения к точному классу. Предположим, у вас есть два класса с одинаковым именем, скажем Mailer С двумя различными пространствами имен:

namespace SMTP;
class Mailer{}

и

namespace Mailgun;
class Mailer{}

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

use SMTP\Mailer as SMTPMailer;
use Mailgun\Mailer as MailgunMailer;

далее в коде, если вы хотите получить доступ к этим объектам класса, то вы можете сделать следующее:

$smtp_mailer = new SMTPMailer;
$mailgun_mailer = new MailgunMailer;

он будет ссылаться на исходный класс.

некоторые могут запутаться, что тогда нет подобных имен классов, то нет никакого использования use ключевое слово. Ну, вы можете использовать __autoload($class) функция, которая будет вызываться автоматически, когда 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/the-magic-behind-autoloading-php-files-using-composer.html

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

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

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

Я на самом деле реализован раньше. Вот это ссылке.

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

вот как начинается пример класса контроллера:

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

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

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

на 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'

Comments

    Ничего не найдено.