php переменная область видимости

Вот код сначала:

<?php

$test = 'nothing';

function check_test(){
global $test;

echo 'The test is '.$test.'\n';

}function run($lala){
$test = $lala;
check_test();
}check_test();

run('Test 2');
run('Test 3');check_test();

AFAIK в Python это будет работать, потому что он ищет переменные в верхней области видимости, но похоже, что он работает по-разному в php. Итак, вот вопрос: как мне добиться такого поведения — чтобы функция использовала вхождение первой переменной и не начинала смотреть с более высокого уровня контекста. В этом примере я хотел получить вывод.

The test is nothing
The test is Test 2
The test is Test 3
The test is nothing

Но получил только

The test is nothing

в 4 раза.

Означает, что было использовано самое первое объявление переменной. Большое спасибо за любые предложения к этому!

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

UPD: я не могу использовать предложенные методы, потому что мы используем pthreads, и каждая функция будет выполняться в одно и то же время, а глобальная переменная будет меняться каждую секунду, а это не то, что я хочу. Вместо этого мне нужно, чтобы каждый поток использовал свою собственную «локальную» глобальную тестовую переменную.

0

Решение

Вам нужно использовать global здесь также.

function run($lala){
global $test = $lala;
check_test();
}

но есть проблема, когда последний check_test(); вызов функции, то вы получите то же значение $test что касается 3-го.

Пример:

The test is nothing
The test is Test 2
The test is Test 3
The test is Test 3

Предложение:

Так что если вы действительно хотите получить вывод, как вы показываете, вам нужно передать параметр в check_test() функция.

Пример:

function check_test($arg= null) {
global $test;

$arg= ($arg== null) ? $arg: $test;

echo "The test is ".$arg."<br/>";
}

function run($par){
check_test($par);
}

The test is nothing
The test is Test 2
The test is Test 3
The test is nothing
1

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

В функции run вы устанавливаете $lala к локальному параметру, а не для глобального $test = 'nothing',

Я хотел бы, чтобы это:

$test = 'nothing';

function check_test($param = null) {
global $test;

// if no parameter passed, than use global variable.
$param = is_null($param) ? $param : $test;

echo "The test is {$param}\r\n";
}

function run($param){
check_test($param);
}

check_test();
check_test('Test 2');
check_test('Test 3');
check_test();

Рабочий пример

1

Попробуйте нижеприведенный код, вы получите желаемый результат здесь, я изменил наконец я вызвал метод run и в методе run я проверил, если параметр пуст, затем установил слово «none» в глобальной переменной, если есть какое-либо значение в параметре, затем установите это значение в глобальной тестовой переменной. попробуйте код ниже, это может быть полезно для вас.

<?php
$test = 'nothing';

function check_test(){
global $test;

echo 'The test is '.$test.'<br/>';

}function run($lala){

$GLOBALS['test'] = !empty($lala) ? $lala : 'nothing';
check_test();
}check_test();

run('Test 2');
run('Test 3');
run('');
?>
0
По вопросам рекламы [email protected]