Пространство имен не работает при использовании в качестве переменной? - PullRequest
0 голосов
/ 29 января 2019
<?php

namespace Vendor\Package;

$test1 = new Foo\Bar(); // works as usual

$test2 = 'Foo\Bar';
$test2 = new $test2(); // does not work

$test3 = 'Vendor\Package\Foo\Bar';
$test3 = new $test3(); // but this works

Я хотел использовать $test2, но он не работает, хотя выглядит так, как будто должен, так как он работает почти так же, как $test3.

Это ожидаемое иликакой синтаксис мне нужно использовать, чтобы test2 работал?

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Так что я посмотрю, смогу ли я объяснить это просто.В вашем первом случае «$ test1 = new Foo \ Bar ();» путь к модели отображается во время компиляции / загрузки.В случае, когда "$ test2 = 'Foo \ Bar'; $ test2 = new $ test2 ();", вы пытаетесь вызвать эту модель во время выполнения ... К сожалению, во время выполнения соединение уже выполнено,и не пересматривается.Это означает, что "$ test2 = '\ Vendor \ Package \ Foo \ Bar'" должен работать, но сокращенная версия имени не может работать, так как шаг связывания не пересматривается во время выполнения.

0 голосов
/ 29 января 2019

Вы можете добавить префикс к своему стригу: __NAMESPACE__

Vendor\Package\Foo\Bar::__construct
Vendor\Package\Foo\Bar::__construct
Vendor\Package\Foo\Bar::__construct

Repl.it: https://repl.it/repls/BuzzingFairSuperuser

namespace Vendor\Package\Foo;
class Bar
{
    function __construct()
    {
        echo __METHOD__,"\n";
    }
}

namespace Vendor\Package;

$test1 = new Foo\Bar(); // works

$test2 = __NAMESPACE__.'\Foo\Bar';
$test2 = new $test2(); // works

$test3 = 'Vendor\Package\Foo\Bar';
$test3 = new $test3(); // works
0 голосов
/ 29 января 2019

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

Необходимо использовать полное имя (имя класса с префиксом пространства имен).Обратите внимание, что, поскольку нет разницы между полным и полным именем внутри динамического имени класса, имени функции или имени константы, начальная обратная косая черта не требуется.

Foo\Bar не полностьюквалифицировано, это относительно Vendor\Package, которое вы выбрали с помощью предыдущего оператора namespace.

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