[PHP] global var undefined?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function LoadAccesses( )
{
  global $SecurityTable;

// ... laden van die tabel ...
}

function HasAccess( $AccessLevel )
{
  global $SecurityTable;

  if (  !is_array($SecurityTable) || (sizeof($SecurityTable) == 0)  )
    LoadAccesses();

  ...
}


Dus ik heb daar reeds via debug doorgestapt... Wat die doet is checken of array is -> is het niet dus gaat ie naar loadaccess (securitytab == NULL), in loadaccess wordt die ingeladen & op het eind daar zit die vol...
dan gaat ie verder, maar in 'HasAccess' is deze securitytab terug NULL!

Waarom dat? Ik heb ze toch beiden global gemaakt?

Acties:
  • 0 Henk 'm!

  • Config
  • Registratie: Januari 2000
  • Laatst online: 06-01 00:49
Verwijderd schreef op 22 April 2003 @ 13:54:
Waarom dat? Ik heb ze toch beiden global gemaakt?
Ja precies, als je het 1 keer doet moet het werken.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoe bedoel je 1x?
als ik in de 1e functie die global weglaat, dan blijft securitytable in die functie enkel geldig, als ik het in de 2e weglaat is het enkel in de 2e geldig... Dat is nu niet exact wat ik wil.

[ Voor 1% gewijzigd door Verwijderd op 22-04-2003 13:58 . Reden: typo ]


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

global :X

maargoed, volgens mij moet die var al bestaan voordat je die functie aanroept.
Beter is om die var mee te sturen als argument ;)

Acties:
  • 0 Henk 'm!

Verwijderd

$GLOBALS["SecurityTable"];

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
het probleem met meesturen is (ik heb dat al gedaan), maar ik wou die tabel slechts 1x inladen, maar ook niet elke keer inladen (enkel wanneer ik het effectief moet gaan checken dus).

Wat ik wel juist gezien heb dat een $tmp_Level ook global is gemaakt in 2 functies, en dat dit perfect weergeeft... Op het begin NULL, dan TryCookieLogin (waar deze gezet word) ... En dan in de functie zelf is het de juiste waarde (!= NULL)

Maar waarom wil hij geen array globaliseren? Maar wel een simpele variabele

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
de oplossing van TheMAzTER werkt... Maar zou iemand mij misschien kunnen uitleggen waarom? Anders blijf ik dom ^_^

Wat ik nu doe is op het einde van LoadAccess(): $GLOBALS["SecurityTable"] = $SecurityTable;

en dan gewoon die tabel gebruiken in HasAccess()

Acties:
  • 0 Henk 'm!

Verwijderd

Ik hoop dat uw tabel ook efectief globaal staat dan heh. Want bij de destructie van de eerste functie zou uw tabel wel eens mee opgeruimd kunnen worden anders.
Best is iets in volgende aard te gaan doen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
$myTable=0;

function first(){
   global $myTable;
   // en doe nu iets met die tabel
}

function two(){
   global $myTable;
   // nu heb je de juiste te pakken
}


DOE DIT NIET...

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
// $myTable=0; table bestaat nu niet !!!

function first(){
   global $myTable;
   // en doe nu iets met die tabel
   // tabel is wel global maar de data zit IN de functie
}

function two(){
   global $myTable;
   // nu heb je niets te pakken want vorige functie is niet opgeroepen.
}


ANDERE OPLOSSING:

werk met referenties of statics:

PHP:
1
2
3
4
5
6
7
8
9
function first(){
   static $myTable;
   // en doe nu iets met die tabel
}

function two(){
   global $myTable;
   // nu heb je de juiste te pakken, vreemd maar het is zo :-/
}


OF

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
$myTable=first();

function first(){
   static $myTable;
   // en doe nu iets met die tabel
   return &$myTable;  //reference terugkeren
}

two(&myTable);

function two($myTable2){
   // nu heb je de juiste te pakken
}


PHP heeft een onzinnig gedrag op het werken met veriablen en zijn in weze niet conform de standaard :-/ zoals je ze bv in C/C++ terug vind.

Je moet steeds goed nadenken over twee zaken:
1) waar zit mijn data (in welke block)?
2) wat is de zichtbaarheid?

Het grootste gevaar is dat je naar data gaat verwijzen die niet meer bestaat OF verweizen naar data die onzichtbaar is doordat het buiten de scope zit.
Wat betreft die scope is PHP zeer rottig hoor.

vb:

PHP:
1
2
3
4
5
function een(){
   function localhelpfunction(){
   //blablabla
}
}


dan IS localhelpfunction GLOBAL !!! hoe zot het ook mag zijn :(
in C++ zou dat geen waar zijn :-) C++ is the best :-)

[ Voor 20% gewijzigd door chem op 22-04-2003 14:28 . Reden: php tags ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ah, wss is het zoals je zegt dat mijn data in de functie LoadAccesses() blijft hangen, en dus niet beschikbaar is in de functie HasAccess

Vind ik wel vrij raar :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
wat ik dus geprobeerd had:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$myTable = 0; // (gewoon aan de kant, dus volledig globaal)

function first(){
  global $myTable;
  // en doe nu iets met die tabel
}

function two(){
  global $myTable;

  // $myTable; == NULL
  first();
  // $myTable; == NULL <------!!!!!!!!!!!

}


Hoe kan dat?

** edit **
voor de duidelijkheid: ik roep two() rechtstreeks aan, one() word enkel aangeroepen vanuit two()

[ Voor 27% gewijzigd door Verwijderd op 22-04-2003 14:33 ]

Pagina: 1