Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z zasięgiem zmiennych?
Forum PHP.pl > Forum > PHP
Ludvik
Witam.

Piszę w tej chwili pewien prosty systemik i jakoś nie mogę sobie proadzić z jednym błędem.

Przy parsacji pliku xml są wywoływane trzy funkcje: jedna od otwierającego taga, druga od zamykającego i trzecia od danych, które są pomiędzy tagami.

Pierwsza funkcja ma tylko sygnalizować jaki był ostatni tag, żeby było wiadomo do czego przypisać dane.

[php:1:48e64b6d6c]
<?php
function userStartHandler($parser, $name, $attrs)
{ global $last_tag;
switch($name)
{ case 'LOGIN':
$last_tag = 'login';
break;
case 'PASSWORD':
$last_tag = 'password';
break;
case 'NAME':
$last_tag = 'name';
break;
case 'SURNAME':
$last_tag = 'surname';
break;
default:
$last_tag = 'inny';
break;
}
}
?>
[/php:1:48e64b6d6c]

Ona działa dobrze, sprawdziłem to.
Druga funkcja jest pusta, więc przejdę do trzeciej, która wydaje się być niepoprawna.

[php:1:48e64b6d6c]<?php
function userDataHandler($parser, $data)
{ global $last_tag, $current_user;
switch($last_tag)
{ case 'login' :
$current_user['login'] = $data;
echo "$current_user[login]";
break;
case 'password' :
$current_user['password'] = $data;
echo "$current_user[password]";
break;
case 'name' :
$current_user['name'] = $data;
echo "$current_user[name]";
break;
case 'surname' :
$current_user['surname'] = $data;
echo "$current_user[surname]";
break;
case 'inny' :
break;
}
}
?>[/php:1:48e64b6d6c]

Wszystkie isntrukcje echo zadziałają w tym switchu, ale po zakończeniu tej funkcji, globalna zmienna jest pusta, a wcześniej miała wartość. Co się dzieje? Troszke mi się z tym śpieszy, więc prosiłbym o wyrozumiałóść i jak najszybsze odpowiedzi.

Z góry dzięki.
BzikOS
1. W takim wypadku można w ogóle nie używać switcha:
[php:1:bc58e69438]<?php
$current_user[$last_tag] = $data;
?>[/php:1:bc58e69438]

i sprawa załatwiona.

2. Czy sprawdzasz tą zmienną w innej funkcji, jezeli tak czy w niej także ją globalizujesz?

3. Użyj tablicy superglobalnej $GLOBALS.

4. Może sprawdzasz wartość tej zmiennej przed wywołaniem funkcji? :?
Ludvik
Sprawa wygląda tak:

Jest plik user.php w ktorym jest ta tablica i jej inicjalizacja.

Potem jest plik login.php w ktorym jest odwolanie do tego pliku. W tym samym pliku jest funkcja login(), w ktorej jest parsacja dokumentu poprzed funkcje parse. W samej funkcji login jest referencja do zmiennej globalnej. W funkcji parse nie ma, ale ona w sumie dużo nie ma powiazan z funkcją, w której jest błąd. Próbowałem używać zmiennej globals, ale występował inny błąd. Jak odwołam się poprzed $GLOBALS[current_user][login] to występował błąd, że zmienna nie istnieje. Zaraz jeszcze coś będę próbował, ale w tej chwili za dużo nie mogę zrobić bo nie mam czasu. Jeszcze coś napiszę za godzinkę.
Ludvik
Troszkę to przeanalizowałem i sprawa wygląda dość dziwnie.

Przy użyciu tablicy sprawa wygląda tak:

Są domyślne wartości dla wszystkich zmiennych, które przed parsacją działają. Potem w trakcie parsowania uzupełniane są dane zgodnie z instrukcjami. Przy przypisywaniu zmiennych wydaje mi się, że do zmiennej globalnej przypisywana jest referencja do zmiennej lokalnej. W zasięgu funkcji wszystko ok jest, ale po zakończeniu wykonywania tego bloku wartość znika. Zmienna jest usuwana, a referencja pozostaje, co skutkuje referencją do pustego obszaru pamięci.

Używam tutaj zwykłego przypisania, używając tablicy globals:

$GLOBALS['zmienna'] = $data;

Może to jest zamierzone, tylko sam nie wiem o istnieniu takiego mechanizmu? Z C++ jestem troszkę innaczej nauczony, a w php miałem małą przerwę.

Z góry dzięki...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.