Вот код сначала:
<?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, и каждая функция будет выполняться в одно и то же время, а глобальная переменная будет меняться каждую секунду, а это не то, что я хочу. Вместо этого мне нужно, чтобы каждый поток использовал свою собственную «локальную» глобальную тестовую переменную.
Вам нужно использовать 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
В функции 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();
Попробуйте нижеприведенный код, вы получите желаемый результат здесь, я изменил наконец я вызвал метод 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('');
?>