2016-05-05 6 views
0

Hier ist der Code zuerst:php variable Umfang 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 in Python würde es funktionieren, weil es Variablen oberen Rahmen sucht, aber sieht aus wie es anders in PHP funktioniert. So, hier ist die Frage: Wie kann ich dieses Verhalten erreichen - so Funktion wird erste Variable Vorkommen verwenden und wird nicht von der höheren Scope-Ebene zu suchen. In diesem Beispiel wollte ich ausgegeben werden.

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

bekam aber nur

The test is nothing 

für 4 mal.

Bedeutet, dass die allererste Variablendeklaration verwendet wurde. Viel zu schätzen mit irgendwelchen Vorschlägen dazu!

Dies ist kein Duplikat, ich verstehe die Konzeption des Umfangs, ich bin gefragt, ob es möglich ist, bestimmtes Verhalten in diesem Ausschnitt zu erreichen.

UPD: Ich kann keine vorgeschlagenen Methoden verwenden, weil wir Pthreads verwenden und jede Funktion wird in der gleichen Zeit ausgeführt werden und globale Variable wird jede Sekunde geändert werden, und das ist nicht was ich will. Stattdessen brauche ich, dass jeder Thread seine eigene "lokale" globale Testvariable verwendet.

+0

Sie ändern nicht wirklich den globalen Testwert in Ihrer 'run' Funktion. Sie ändern den Wert, der in dieser Funktion sichtbar ist – Thamilan

+1

Mögliches Duplikat von [Reference: Was ist der Variablenbereich, auf welche Variablen kann von wo zugegriffen werden und was sind "undefinierte Variable" Fehler?] (Http: // stackoverflow.com/questions/16959576/reference-was-is-variable-scope-welche-variablen-sind-zugänglich-von-wo-und) – dimlucas

+0

@ Das ist, was ich wollte. Also wird jede Funktion ihre nächste $ test Variable als global verwenden. – user3416803

Antwort

1

Sie müssen hier auch global verwenden.

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

aber es gibt ein Problem, wenn der letzten check_test(); Funktionsaufruf dann werden Sie, dass er denselben Wert von $test wie für 3. eins bekommen.

Beispiel:

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

Vorschlag:

Also, wenn Sie wirklich die Ausgabe erhalten möchten, wie Sie zeigen das Sie einen Parameter auf Ihre check_test() Funktion übergeben müssen.

Beispiel:

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

Ja, aber ich möchte keinen Parameter verwenden, weil dadurch sehr viel Code geändert wird. Deshalb möchte ich wissen, wie man beschriebenes Verhalten erreichen kann. – user3416803

+0

gibt es keine andere Möglichkeit, dies zu tun, nur einige Optionen: '1. Übergeben Sie Parameter 2. Verwenden Sie global. 3. Referenz nach Wert, die auch Parameter " –

+1

" benötigen Danke, wahrscheinlich wird Parameter verwenden. – user3416803

1

In Funktion run Sie $lala auf lokale Parameter, nicht für die globale $test = 'nothing' setzen.

würde ich dies gerne:

$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

das ist das gleiche wie ich in meiner Antwort vorschlagen. –

+0

Die Idee ist, verschiedene Variablenwerte zu verwenden, ohne Parameter zu verwenden oder globale Variable zu ändern. Jede Funktion verwendet also die Variable "nearest" mit dem Namen $ test. – user3416803

+0

@FrayneKonok Sorry, ich kann deine Antwort nicht sehen. Und erzählst du mir, dass ich deine Antwort kopiert habe? – Justinas

0

unten Code Versuchen werden Sie Ihre gewünschte Ausgabe hier, ich habe die i-Methode LAUF schließlich ändern und in run-Methode überprüft i, wenn der Parameter ist leer, dann setze "nichts" -Wort in der globalen Variable, wenn es einen Wert im Parameter gibt, dann setze diesen Wert in der globalen Testvariablen. probiere unter dem Code aus, kann es für dich hilfreich sein.

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

Danke für den Vorschlag, aber globale Variable muss das selbe nicht durch Funktionen geändert werden, stattdessen muss jede Funktion die nächste Variable als global verwenden - das ist was ich frage :) – user3416803