Используя 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: как поведение согласуется с первым примером?
Наблюдаемое вами поведение не должно вас смущать.
Это то, что должно было случиться.
Именно так работает пространство имен PHP.
Руководство по PHP объясняет:
Пространства имен PHP предоставляют способ группировки связанных классов, интерфейсов, функций и констант.
Не переменные.
Это означает, что $closure
в вашем коде точно такая же переменная во всех пространствах имен, которые вы определили (A, B и C).
Сначала он определяется в пространстве имен A.
Затем значение заменяется в пространстве имен B.
Затем вы вызываете замыкание, которое оно содержит в пространстве имен C.
Второй пример такой же.
Поскольку пространства имен не предназначены для группировки переменных, должно быть очевидно, что \A\$closure()
неверный синтаксис
Других решений пока нет …