PHP использует ключевое слово и автозагрузку - PullRequest
0 голосов
/ 26 апреля 2018

Мой вопрос состоит из трех частей:

  1. Включает ли оператор use немедленный запуск автозагрузчика, или он ожидает, пока класс не будет использован? (Отложенная загрузка)

  2. Если автозагрузка не выполняется лениво, может ли это негативно повлиять на производительность?

  3. Какой схеме лучше всего следовать и почему? PhpStorm показывает «Ненужное полное имя ...» как проблему кода, когда оператор use не используется.

Вот пример определения класса для контроллера Laravel с оператором use:

namespace App\Http\Controllers;

use Carbon\Carbon;

class FooController extends Controller
{
    /**
     * This action uses the Carbon class
     */
    public function bar1()
    {
        return view('foo.bar1', ['now' => new Carbon()]);
    }

    /**
     * This action does not use the Carbon class
     */
    public function bar2()
    {
        return view('foo.bar2');
    }
}

Тот же класс без оператора use:

namespace App\Http\Controllers;

class FooController extends Controller
{
    /**
     * This action uses the Carbon class
     */
    public function bar1()
    {
        return view('foo.bar1', ['now' => new \Carbon\Carbon()]);
    }

    /**
     * This action does not use the Carbon class
     */
    public function bar2()
    {
        return view('foo.bar2');
    }
}

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Оператор use можно рассматривать как макрос предварительной обработки C, если вы знакомы с ним: он переписывает текущий файл во время компиляции , чтобы Вы пишете короткое имя для длинного имени класса, функции или константы. Он не запускает автозагрузку, так как ему все равно, существует класс или нет.

Например, если вы пишете use Foo\Bar\Baz as X, то везде, где X упоминается как имя класса, компилятор PHP переписывает это, чтобы упомянуть Foo\Bar\Baz. Только когда код, упоминающий класс (например, new X, X::FOO, X::doSomething()), фактически запущен, он видит, действительно ли существует класс Foo\Bar\Baz, и запускает автозагрузчик по мере необходимости.

Общая форма use Foo\Bar\Baz является просто сокращением для use Foo\Bar\Baz as Baz, присваивая псевдоним Baz имени класса Foo\Bar\Baz.

Как указано в , руководство указывает, что псевдоним обрабатывается только во время компиляции, поэтому динамический поиск не будет его использовать. В приведенном выше примере class_exists('X') вернет false, но вы можете принудительно развернуть имя класса во время выполнения, используя class_exists(X::class) - X::class, которое компилятор расширит до строки '\Foo\Bar\Baz'.

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

0 голосов
/ 26 апреля 2018

1) Класс загружается автоматически при выполнении оператора new Class().

2) см. 1)

3) Какой схеме лучше всего следовать и почему?:

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

Из php документации :

Этот пример пытается загрузить классы MyClass1 и MyClass2 из файлы MyClass1.php и MyClass2.php соответственно.

<?php
spl_autoload_register(function ($class_name) {
    include $class_name . '.php';
});

$obj  = new MyClass1();
$obj2 = new MyClass2(); 
?>

Пространства имен - это всего лишь дополнительная функция для организации классов.

РЕДАКТИРОВАТЬ: Как отметил @IMSoP в комментариях, новый не единственный раз, когда запускается автозагрузчик. Доступ к константе класса , статическому методу или статическому свойству также вызовет его, как и запуск class_exists .

...