Неожиданное поведение пространства имен с замыканиями

Используя PHP 7.0, рассмотрите код ниже:

<?php
namespace A {
$closure = function() {
echo __NAMESPACE__;
};
}
namespace B {
$closure = function () {
echo __NAMESPACE__;
};
}
namespace C {
$closure();
}

Для меня ожидаемый результат будет:

PHP Notice:  Undefined variable: closure

Но как-то результат

B

Затем рассмотрите этот код ниже:

<?php
namespace A {
$closure = function() {
echo __NAMESPACE__;
};
}
namespace B {
$closure = function () {
echo __NAMESPACE__;
};
}
namespace C {
\A\$closure();
}

Теперь, зная (но еще не понимая) поведение первого примера, ожидаемый для меня результат будет:

A

Но вместо этого я получаю

PHP Parse error:  syntax error, unexpected '$closure' (T_VARIABLE), expecting identifier (T_STRING)

Такое поведение меня полностью смущает.

Вопрос часть 1: может кто-нибудь объяснить мне, что не так с моим ожиданием в первом примере?
Вопрос часть 2: как поведение согласуется с первым примером?

2

Решение

Наблюдаемое вами поведение не должно вас смущать.
Это то, что должно было случиться.
Именно так работает пространство имен PHP.

Руководство по PHP объясняет:

Пространства имен PHP предоставляют способ группировки связанных классов, интерфейсов, функций и констант.

Не переменные.

Это означает, что $closure в вашем коде точно такая же переменная во всех пространствах имен, которые вы определили (A, B и C).
Сначала он определяется в пространстве имен A.
Затем значение заменяется в пространстве имен B.
Затем вы вызываете замыкание, которое оно содержит в пространстве имен C.

Второй пример такой же.
Поскольку пространства имен не предназначены для группировки переменных, должно быть очевидно, что \A\$closure() неверный синтаксис

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector