2016-05-05 3 views
0

Вот код первой:PHP переменная сфера quetion

<?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

Фактически вы не изменяете глобальное тестовое значение в своей функции 'run'. Вы меняете значение, которое видимо внутри этой функции. – Thamilan

+1

Возможный дубликат [Ссылка: что такое переменная область, какие переменные доступны из того, где и какие ошибки «неопределенной переменной»?] (Http: // stackoverflow.com/questions/16959576/reference-what-is-variable-scope-which-variables-are-access-from-where-and) – dimlucas

+0

@ Это то, что я хотел. Поэтому каждая функция будет использовать ее ближайшую переменную $ test как глобальную. – user3416803

ответ

1

Здесь также необходимо использовать 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 
+0

Да, но я не хочу использовать параметр, потому что он в конечном итоге меняет много кода. Поэтому я хочу знать, как можно описать поведение. – user3416803

+0

нет другого способа сделать это, только некоторые опции: '1. передать параметр 2. используя глобальный. 3. ссылку по значению, которая также нуждается в параметре –

+1

Спасибо, возможно, будут использовать параметры. – user3416803

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(); 

Working example

+0

это то же самое, что я предлагаю в своем ответе. –

+0

Идея состоит в том, чтобы использовать разные значения переменных без использования параметров или изменения глобальной переменной. Поэтому каждая функция будет использовать «ближайшую» переменную с именем $ test. – user3416803

+0

@FrayneKonok Извините, я не вижу вашего ответа. И вы говорите мне, что я скопировал ваш ответ? – Justinas

0

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

<?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

Спасибо за предложение, но глобальная переменная должна оставить то же самое не будет изменена функциями, вместо этого каждая функция должна использовать ближайшую переменную как глобальную - вот что я спрашиваю :) – user3416803