it-swarm.com.ru

Как работает ключевое слово "использовать" в 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? Могу ли я использовать его для импорта классов?

111
Green

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

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

68
zerkms

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

Цель ключевого слова _/use:

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

В настоящее время основные платформы используют include или 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;

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

Некоторые могут запутаться в том, что если имена классов не совпадают, тогда ключевое слово use не используется. Ну, вы можете использовать функцию __autoload($class), которая будет вызываться автоматически при выполнении оператора use с классом, который будет использоваться в качестве аргумента, и это может помочь вам загрузить класс во время выполнения на лету, как и когда это необходимо. 

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

149
Rajan Rawal

Не забывайте, что такое Namespace.

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

Кроме того, просто чтобы прояснить ситуацию, оператор use ничего не делает, только накладывая псевдонимы на ваши пространства имен, поэтому вы можете использовать ярлыки или включать Classes с тем же именем, но с другим пространством имен в тот же файл.

Например:

// 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

12
BlocksByLukas

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

8
Samy Dindane

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

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

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

4
Tyler Carter

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

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

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

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

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

3
Eric Draven

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

3
Abdul Mannan

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

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

Использование ключевого слова «use» для сокращения литералов пространства имен. Вы можете использовать как с псевдонимами, так и без него. Без псевдонимов вы должны использовать последнюю часть полного пространства имен.

<?php
    use foo\bar\lastPart;
    $obj=new lastPart\AnyClass(); //If there's not the line above, a fatal error will be encountered.
?>
1
Müseyib Ələkbər

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

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
}

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

0
Oyelakin Dotun Peter