[PHP] Variabelen naar parent scope

Pagina: 1
Acties:

Onderwerpen


Verwijderd

Topicstarter
Voor mijn PHP scriptjes gebruik ik eigen gemaakte functies die database result tabellen of arrays omzetten in losse variabelen. Voorbeeldje:

$result=pg_query("SELECT voornaam,achternaam FROM personen WHERE id='$id'");
get_result_vars($result);

En dan zijn $voornaam en $achternaam variabelen (in de global scope).

Werkt handstikke handig maar nu mijn scripts groter en groter worden kan ik niet meer altijd in de gobal scope werken en wil ik alles in functies en classes wegstoppen.

Is er een handige manier om een aantal variabelen die in een functie gedefineeerd worden naar de parent scope van die functie te brengen?

Een array als return value meegeven kan natuurlijk, maar dan zitten de variabelen nog in een array als ze in de parent scope komen en dat is niet de bedoeling.

Ter verduidelijking:

func_parent() {
func_child() {
[hier bevinden zich dus tig variablen, verschilt hoeveel en hoe ze heten]
}
[hier heb ik die variablen onder hun eigen naam nodig, zonder dat ze global worden gemaakt]
}

(Uiteraard heb ik de PHP manual over "Variable scope" aandachtig bestudeerd maar kan ik alleen vinden over hoe je variabelen global maakt.)

[ Voor 17% gewijzigd door Verwijderd op 25-09-2004 22:29 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Array teruggeven:
PHP:
1
2
3
4
5
function f {
  return array('foo', 'bar');
}

list($var1, $var2) = f();

Dat werkt geloof ik gewoon. Je kan ook wel global variabelen gebruiken, maar dat is eigenlijk best wel behoorlijk ranzig (als je het te pas en te onpas gebruikt :P).

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Maar dan moet je in de parent scope dus weten hoeveel en welke variablen je uit de functie wil hebben. Ik zoek naar iets waardoor een functie steeds andere variabelen in z'n parent scope kan laten dumpen zonder dat je terug in die parent scope die varabelen nog eens moet gaan defineren met naam.

Ik kan natuurlijk met heel veel includes gaan werken en zo het gebruik van functies overbodig maken, maar dat is pas echt ranzig. :)

[ Voor 7% gewijzigd door Verwijderd op 26-09-2004 01:17 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

PHP:
1
2
3
4
5
function f() {
  return "var1;var2;var3";
}

$arrResults = explode(';', f());


Zoiets kan natuurlijk ook. Maareh, je zal altijd weten hoeveel en welke variabelen je terugkrijgt uit een functie. Als je dat niet zou weten, dan gebruikte je die functie niet...

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
NMe84 schreef op 26 september 2004 @ 02:41:
PHP:
1
2
3
4
5
function f() {
  return "var1;var2;var3";
}

$arrResults = explode(';', f());
Wat een ranzige aanpak... Je kan ook een array met variabele grootte teruggeven hoor.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
function f()
{
    return array('var1' => 'val1', 'var2' => 'val2', ...);
}

function g()
{
   $vars = f();
   foreach($vars as $var => $val)
   {
       echo $var, "=", $val;
   }
}

Acties:
  • 0 Henk 'm!

Verwijderd

de makkelijkste oplossing lijkt mij dat je een class gebruikt waarin je beide functies hebt zitten
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
class test1
{
  function child()
  {
     $this->blabla="test";
  }

   function parent()
   {
      $this->child();
      echo $this->blabla;
   }
}


hiermee kan je iedere variable zetten die dan toch niet helemaal globaal is.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Thanks, de onderstaande code is denk ik het makkelijkst.
Beetje jammer dat er geen "parent" keyword bestaat zoals "global".
Idealitair zou ik line 9 in een functie willen hebben maar dat kan niet want dan worden de variablen in diens scope (of de global gemaakt). Nouja, zo is het kort genoeg voor de overzichtelijkheid en deze ene line moet dan maar met copy/paste.
Classes zijn natuurlijk netter maar dan moet ik eerst nog heel veel omzetten en voor wat ik nu maak is het storend om voor iedere variable "$classname->" te moeten zetten.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?
function parent()
    {
    function child()
        {
        return array('fieldname1'=>'value1','fieldname2'=>'value2');
        }
    $arr=child();
    foreach($arr as $fieldname=>$value) $$fieldname=$value; 
    echo "$fieldname1<br>$fieldname2<br>";
    }
parent();
?>
Pagina: 1