[PHP] variabele gebruiken in require-page

Pagina: 1
Acties:
  • 154 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik begrijp een onderdeel van de variable-scope van PHP niet.
niet werkende code
Ik heb een index.php in de root staan:
PHP:
1
2
3
4
5
   $show = new someclass();

   $foo = "bar";

   $show->content();


In class.php heb staat hetvolgende
PHP:
1
2
3
4
5
class someclass {
   function content() {
      require_once("somefile.php");
   }
}


In somefile.php staat
PHP:
1
   echo $foo;


en dat werkt dus niet :)
werkende code
als ik index.php aanpas naar:
PHP:
1
2
3
4
5
   $show = new someclass();

   $foo = "bar";

   require_once($show->content());


en class.php naar
PHP:
1
2
3
4
5
class someclass {
   function content() {
      return("somefile.php");
   }
}


werkt alles wel
vragen
zoals je al kan raden, heb ik twee vragen:
1. waarom werkt die eerste code niet. Het probleem moet ergens in de variablescope zitten, maar ik vind niet waar en waarom.

2. ik zou liefst het eerste voorbeeld gebruiken. Wat moet ik doen om $foo zichtbaar te maken in somefile.php (global maken werkt niet)

Acties:
  • 0 Henk 'm!

  • --MeAngry--
  • Registratie: September 2002
  • Laatst online: 19-09 16:35

--MeAngry--

aka Qonstrukt

Defineer "werkt niet", wat is de precieze foutmelding? :)
Kijk ook even in de handleiding van php.net hoe je eventuele foutmeldingen zichtbaar maakt. (display_errors)

Tesla Model Y RWD (2024)


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
code:
1
2
3
4
5
error_reporting  =  E_ALL & E_STRICT

display_errors = on

display_startup_errors = on


Notice: Undefined variable: foo in somefile.php on line 4

[ Voor 27% gewijzigd door Verwijderd op 13-08-2007 18:46 ]


Acties:
  • 0 Henk 'm!

  • _Gekkie_
  • Registratie: Oktober 2000
  • Laatst online: 24-06 20:21

_Gekkie_

And the cow said: Helloooooow?

het ligt inderdaad duidelijk aan je scope: of je gebruikt de variabele binnen de functie 'content()' of je gebruikt de variabele nadat je de functie uitgevoerd hebt (en dus somefile hebt ge-include...

Als je m global maakt in function content() werkt het wel gewoon?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php 
class someclass { 
   function content() {
        global $foo;
        require_once("somefile.php"); 
   } 
} 


$show = new someclass(); 

$foo = "bar"; 

$show->content(); 
?>

werkt prima?

Gekkie is a proud member of TheBenny!


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 22:47
Dit is precies hoe het hoort te werken. Zie de manual:

http://nl3.php.net/manual/en/function.include.php
When a file is included, the code it contains inherits the variable scope of the line on which the include occurs. Any variables available at that line in the calling file will be available within the called file, from that point forward. However, all functions and classes defined in the included file have the global scope.
Daarom werkt het ook als je $foo als global binnen content() aanroept wel.

Wat ik niet begrijp is waarom je per se requires in een classmember wil zetten. Maak gewoon een headerfile achtig bestand met je includes, dan heb je al je includes centraal gedefinieerd en kun je ze altijd simpel aanroepen - desnoods in een classmember.

[ Voor 19% gewijzigd door FragFrog op 13-08-2007 18:54 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Omdat ik $foo declareer in index, maar somefile aanroep via class, bestaat $foo dus niet. Wanneer ik somefile oproep uit index, is $foo wel beschikbaar... got it!

Ik vind de oplossing niet zo proper (ik weet het, het ligt aan php zelf), maar kan nu wel verder :)

Hartelijk bedankt voor de steeds snelle en uitgebreide hulp...

Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Laatst online: 20:37
Verwijderd schreef op maandag 13 augustus 2007 @ 18:55:
ik weet het, het ligt aan php zelf
Ik snap niet precies waarom het aan PHP ligt, de constructie die je uit voert lijkt me sowieso nogal lelijk.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De constructie hierboven was natuurlijk maar een voorbeeld.

Ik heb een klasse die enkele basisfuncties van een website automatiseet: navigatie-opbouwen, breadcrumbs, juiste file includen. = $foo

Ik wil gewoon dat de functies van deze klasse ook beschikbaar zijn in de php-files die ik include. ($foo->breadcrumbs() in somefile.php).

Waarom dit een lelijke constructie is, zie ik niet in...

Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Laatst online: 20:37
Verwijderd schreef op maandag 13 augustus 2007 @ 19:12:
De constructie hierboven was natuurlijk maar een voorbeeld.

Ik heb een klasse die enkele basisfuncties van een website automatiseet: navigatie-opbouwen, breadcrumbs, juiste file includen. = $foo

Ik wil gewoon dat de functies van deze klasse ook beschikbaar zijn in de php-files die ik include. ($foo->breadcrumbs() in somefile.php).
Misschien is een singleton iets voor je?
Waarom dit een lelijke constructie is, zie ik niet in...
Ik vind dit volgende nogal lelijk:
PHP:
1
2
3
4
5
class someclass {
   function content() {
      require_once("somefile.php");
   }
}

Waarom ga je in een methode van een klasse een ander bestand importeren? Waarom zou je het niet gewoon in die klasse zetten, of als het echt een los onderdeel is er een losse klasse van maken?

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 22:47
Op zich is er nog wel iets voor te zeggen lijkt me (alleen noodzakelijke bestanden includen, geen idee of dit je nog wat performance geeft, betwijfel het maargoed), maar waarom zou je globals moeten gebruiken vraag ik me eerder af. En, moet je wel globals gebruiken, waarom definieer je die dan niet in de functies die in het geinclude bestand staan?

Enige wat ik kan bedenken is als een bestand code bevat die uitgevoerd moet worden, maar daar kun je veel beter een functie / class van maken en die (member)functie aanroepen in je class (nadat je eventueel het bestand geinclude hebt in diezelfde class, maar zoals gezegd, ik prefereer zelf een andere methode).

Sowieso is het in mijn opinie erg lelijk om 'losse' code in een geinclude bestand te zetten afgezien van een enkele uitzondering - zelf gebruik ik altijd een constructie van een mod_rewrite naar m'n index die vervolgens een headerbestand aanroept die weer alle noodzakelijke libraries etc include. Die lijst includes is de enige code die buiten de index.php om in de global scope aangeroepen wordt. Resultaat is dat ik altijd precies weet waar en waarom code uitgevoerd wordt (toegegeven, het enige wat m'n index doorgaans doet is mijn pagehandler aanmaken, maar dat lijntje is nog wel te volgen :+) . Als je global code in andere bestanden gaat zetten ben ik bang dat je heel snel het overzicht kwijt raakt, voor je het weet gaat een bestand een class aanroepen die weer een ander bestand include wat weer automatisch een ander bestand include die weer die class aanroept waarna je of moet gaan werken met singletons overal of je hele rare foutmeldingen krijgt :)

[ Voor 13% gewijzigd door FragFrog op 13-08-2007 19:40 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het is inderdaad lelijk om losse code in een bestand te gebruiken.
Normaalgezien volstaat het om in mijn template-file $foo->navigatie en $foo->breadcrumbs te gebruiken.
Ik stelde de vraag omdat ik eventueel $foo->sitemap nodig had. Misschien steek ik sitemap beter in een aparte klasse en roep ik die op met $bar->sitemap.

Los daarvan vind ik het wel een behoorlijk lompe implementatie van php zelf. Bij coldfusion can je tenminste een variabele semi-global maken door er request.variabele van te maken...

En ik heb meer inzicht gekregen in de variabele-scope van php.

thx

Acties:
  • 0 Henk 'm!

  • SWINX
  • Registratie: Juni 2001
  • Laatst online: 23-07 18:19
(jarig!)
Als je echt de constructie uit je niet werkende voorbeeld had willen gebruiken, dan had je $show->foo = "bar"; kunnen doen in je index.php en echo $this->foo; in somefile.php

Mannen komen van Mars Tweakers, vrouwen van Venus Bokt


Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Laatst online: 20:37
Verwijderd schreef op dinsdag 14 augustus 2007 @ 10:52:
Het is inderdaad lelijk om losse code in een bestand te gebruiken.
Normaalgezien volstaat het om in mijn template-file $foo->navigatie en $foo->breadcrumbs te gebruiken.
Ik stelde de vraag omdat ik eventueel $foo->sitemap nodig had. Misschien steek ik sitemap beter in een aparte klasse en roep ik die op met $bar->sitemap.

Los daarvan vind ik het wel een behoorlijk lompe implementatie van php zelf. Bij coldfusion can je tenminste een variabele semi-global maken door er request.variabele van te maken...

En ik heb meer inzicht gekregen in de variabele-scope van php.

thx
Als je zo graag globale variabelen wil gebruiken, gebruik dan $GLOBALS :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@robbert: ik wilde net geen globals gebruiken :)

@SWINX. bedankt :)

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 22:47
Verwijderd schreef op dinsdag 14 augustus 2007 @ 10:52:
Los daarvan vind ik het wel een behoorlijk lompe implementatie van php zelf. Bij coldfusion can je tenminste een variabele semi-global maken door er request.variabele van te maken...
Lomp? Juist niet, PHP zorgt er op deze manier voor dat je lokale scopes niet cluttered worden met globals, tenzij je dat aangeeft.

Doe je in een functie global $varname dan heb je die netjes global beschikbaar, volgens mij niet anders dan wat coldfusion kennelijk doet (zelf geen ervaring mee). Staat ook wel vrij net uitgelegd in de handleiding.

[ Site ] [ twitch ] [ jijbuis ]

Pagina: 1