PHP переменный жизненный цикл / область

Я Java-разработчик, и недавно мне было поручено пересмотреть PHP-код. Проходя через исходный код PHP, я заметил, что переменная инициализируется в операторе if, while, switch и do, тогда эта же переменная используется вне этих операторов. Ниже приведен фрагмент кода

Senario 1

if ($status == 200) {
$messageCode = "SC001";
}

// Here, use the $message variable that is declared in an if
$queryDb->selectStatusCode($message);

Senario 2

foreach ($value->children() as $k => $v) {
if ($k == "status") {
$messageCode = $v;
}
}

// Here, use the $messageCode variable that is declared in an foreach
$messageCode ....

В моем понимании переменная, объявленная в операторе управления, доступна только в блоке кода управления.

Мой вопрос
Какова область видимости переменной в функции PHP и как эта переменная доступна вне блока оператора управления?

Как этот код работает и дает ожидаемые результаты?

2

Решение

В PHP операторы управления не имеют отдельной области видимости. Они делят область действия с внешней функцией или глобальной областью действия, если функции нет. (PHP: переменная область).

$foo = 'bar';

function foobar() {
$foo = 'baz';

// will output 'baz'
echo $foo;
}

// will output 'bar'
echo $foo;

Ваши переменные будут иметь последнее значение, назначенное в структуре управления. Рекомендуется инициализировать переменную перед структурой управления, но это не обязательно.

// it is good practice to declare the variable before
// to avoid undefined variables. but it is not required.
$foo = 'bar';
if (true == false) {
$foo = 'baz';
}

// do something with $foo here

Пространства имен не влияют на область видимости переменной. Они влияют только на классы, интерфейсы, функции и константы (PHP: обзор пространств имен). Следующий код выведет ‘baz’:

namespace A {
$foo = 'bar';
}

namespace B {
// namespace does not affect variables
// so previous value is overwritten
$foo = 'baz';
}

namespace {
// prints 'baz'
echo $foo;
}
5

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

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

По вопросам рекламы [email protected]