Неожиданное поведение пространства имен с замыканиями - PullRequest
0 голосов
/ 10 ноября 2018

Используя 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: как поведение согласуется с первым примером?

1 Ответ

0 голосов
/ 10 ноября 2018

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

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

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

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

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

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

...