Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zmienne superglobalne
Forum PHP.pl > Forum > PHP
Bastion
czy ktos wie dlaczego dziala tak :

  1. <?php
  2.  $tablica = array(0,1,2,3,4);
  3.  $el = 'tablica';
  4.  print_r(${$el});
  5.  
  6. ?>


a nie dziala tak :

  1. <?php
  2. $el = '_SERVER';
  3. print_r(${$el});
  4. ?>
nospor
ale co ci nie dziala?
  1. <?php
  2.  
  3. $el = '_SERVER';
  4. print_r(${$el});
  5.  
  6. ?>
Bo mi dziala.

Moze nie masz tablicy $_SERVER ? snitch.gif
Bastion
faktycznie smile.gif ale tfu mialo byc tak :

  1. <?php
  2. function foo()
  3. {
  4. $el = '_SERVER';
  5. print_r(${$el});
  6. }
  7.  
  8. foo();
  9. ?>

nie zadziala

ale to tak :
  1. <?php
  2. function foo()
  3. {
  4. print_r($_SERVER);
  5. }
  6.  
  7. foo();
  8. ?>


tzn dopiero dziala po zastosowaniu czegos takiego

  1. <?php
  2. function foo()
  3. {
  4. $el = '_SERVER';
  5. global ${$el};
  6. print_r(${$el});
  7. }
  8.  
  9. foo();
  10. ?>


ale czy powinno tak sie dziac ze bez globala nie lapie?
mike
Może to ma związek z tym:

Zmienne zmienne
Cytat
Proszę pamiętać, że zmienne zmienne nie mogą być używane z nowymi superglobalami php. Oznacza to, że nie będą działać wyrażenia typu ${$_GET}. Jeśli szukasz sposobu na obsługę osiągalności superglobali i starych tablic $HTTP_*_VARS, spróbuj użyć referencji.

Niby piszą o troszkę innej rzeczy ale nadal w ogrębie tablic superglobalnych. Może po prostu tak się nie da :/
Choć trochę w to wątpię.
Bastion
no to kasza smile.gif a mike powiedz mi sa jakies przeciwskazania jesli uzyje tego globala ?
mike
Cytat(Bastion @ 2006-03-10 09:10:18)
no to kasza smile.gif a mike powiedz mi sa jakies przeciwskazania jesli uzyje tego globala ?

Po konstrukcji widzę że nie za bardzo masz możliwość przekazania superglobali w argumentach funkcji przez referencję, więc ten global może być tutaj jedynym wyjściem.

Choć ja jestem zawsze przeciwny stosowaniu globali, one nie są zgodne z ideą OOP.

Jeśli faktycznie jest kasza, to nie masz chyba wybru. Ale nie jestem tego pewnien, sprawdź to, ja tylko zwróciłem uwage, że może to php daje ciała. Pewności nie mam.
nospor
Ale ja zadam glupie pytanie:
Ale po co ci wogole robic to przez zmienną zmienną? Przecież $_SERVER jest jeden. On sie nie zmienia. Zawsze wywolasz $_SERVER, a nie $_SERVER1
Bastion
nospor: masz racje, ale pisze taki hm "firewall" zmiennych przekazywanych przez _GET, _POST etc,

mniejwiecej tak ,
  1. <?php
  2. $firewall -> register('_GET', 'parametr', 'chars_only');
  3. $firewall -> firewall();
  4.  
  5. ?>

lub np, zastosowanie filtra
  1. <?php
  2. $firewall -> register('_GET', 'parametr|strtolower', 'chars_only');
  3. ?>


i teraz jesli jest "parametr" przez php.php?parametr=8jk838 , czyli cos innego niz zdefiniowana regula, to firewall robi "cos tam"
smile.gif
mike
A nie możesz tak:
  1. <?php
  2.  
  3. function register( &$arrSuperglobal, $strVar, $strFilter )
  4. {
  5. print_r( $arrSuperglobal );
  6. }
  7.  
  8. register( $_GET, 'id', 'digit' );
  9. register( $_POST, 'value', 'chars' );
  10.  
  11. ?>
:?:
Bastion
no wlasnie o to chodzi ze nie za bardzo , bo register() tworzy tablice regul, dopiero uzycie firewall() sprawdza po kolei reguly , jesli cos sie nie zgadza poprawia, reportuje, wysyla maila adminowi czy co tam sie ustawic

chcialem uniknac sprawdzania w stylu

  1. <?php
  2. switch ($method)
  3. {
  4.  case '_GET' :
  5. if (!is_integer($_GET['zmienna'] && $rule=='integer') { ...... }
  6. break;
  7. }
  8. ?>


i zorbic cos takiegio
  1. <?php
  2. $meth = ${$method};
  3. switch ($rule)
  4. {
  5.  case 'integer':
  6. if (!is_integer($meth['zmienna']) { ...... }
  7. break;
  8. }
  9.  
  10. ?>


hm hm hm smile.gif chyba musze dokladniej to przeglokowac
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.