Почему PHP не выдает никаких предупреждений/ошибок/уведомлений при использовании переменных в синтаксисе Heredoc?

Я использую PHP 7.2.2

Ниже приведено заявление из PHP Manual:

Heredocs нельзя использовать для инициализации свойств класса. Начиная с PHP 5.3, это ограничение действительно только для heredocs, содержащих переменные.

Согласно моей интерпретации, значение этого утверждения теперь (в PHP 7.2.2) Heredocs можно использовать для инициализации свойств класса, но переменные (не свойства класса) нельзя использовать внутри Heredoc.

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

Если моя интерпретация верна, то как работает следующий пример кода?

<?php
class foo
{
    var $foo;
    var $bar;

    function __construct()
    {
        $this->foo = 'Foo';
        $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
}

$foo = new foo();
$name = 'MyName';

echo <<<EOT
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should print a capital 'A': \x41
EOT;
?>

Выход :

My name is "MyName". I am printing some Foo.
Now, I am printing some Bar2.
This should print a capital 'A': A

Мой вопрос заключается в том, как переменная $name доступна внутри heredoc, поскольку в руководстве говорится, что использование переменной в heredoc недопустимо?

Почему PHP не генерирует никаких ошибок/уведомлений/предупреждений?


person PHPLover    schedule 13.03.2018    source источник
comment
Все, что вам нужно сделать, это прочитать инструкцию дальше. Но нет! Вы сгенерировали вопрос!   -  person u_mulder    schedule 13.03.2018


Ответы (1)


В вашем примере НЕ показан Heredoc, используемый для инициализации свойств класса.

Из руководства Heredoc. , инициализация свойства класса с помощью Heredoc работает, начиная с версии 5.3:

class foo {
    public $bar = <<<EOT
bar
EOT;
}

Инициализация свойства класса с переменными не:

class foo {
    public $bar = <<<EOT
{$_SERVER['PHP_SELF']}
bar
EOT;
}

Неустранимая ошибка: константное выражение содержит недопустимые операции

То же самое с использованием любого метода, который не оценивает постоянное выражение:

class foo {
    public $bar = $_SERVER['PHP_SELF'];
}

Неустранимая ошибка: константное выражение содержит недопустимые операции

Что согласуется с руководством по Свойства:

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

person AbraCadaver    schedule 13.03.2018
comment
Спасибо за Ваш ответ. Если это так, то я думаю, что соответствующее утверждение в руководстве должно быть Heredocs не может использоваться для инициализации свойств класса. Начиная с PHP 5.3, это ограничение действует только для heredocs, содержащих переменные, назначенные свойствам класса. Это наверняка устранит много путаницы. - person PHPLover; 14.03.2018
comment
Я могу присвоить уже инициализированную переменную свойству класса. В это время работает отлично. Я думаю, что текст руководства должен быть таким. Heredocs нельзя использовать для инициализации свойств класса. Начиная с PHP 5.3, это ограничение действительно только для heredocs, содержащих инициализацию свойств класса с неопределенными/неинициированными переменными. Что Вы думаете об этом? - person PHPLover; 25.06.2018