|
| Og jeg troede lige, at jeg kendte til alle~ Fra : Tank |
Dato : 22-06-07 02:58 |
|
Hej,
Så er jeg her altså igen, denne gang med et meget underligt problem.
Har simpelthen ingen anelse om, hvorfor det ikke virker. Det hele kan
koges ned til dette stykke kode:
<?php
include_once("config.php");
// virker
echo "Outside: " . $storage_url;
// virker ikke, returnerer intet?
wtf();
function wtf(){
echo "Inside: " . $storage_url;
}
?>
$storage_url er en variabel gemt i min config.php fil som er
inkluderet i filen hvor ovenstående kodestykke også er placeret. Jeg
har derefter prøvet at returnere $storage_url fra andre funktioner,
bl.a. i en helt anden fil, library.php, som også inkluderer
config.php. Dette gav samme resultat!
Så når jeg "kalder" $storage_url udenfor en funktion virker det fint.
Hvis den kaldes indenfor en funktion, returneres intet.
Har efterhånden bøvlet med dette i et par timer (goodbye til
nattesøvnen)...
Tak på forhånd!
Venlig Hilsen
Dan
Disclaimer: Der tages forbehold for stavefejl og vrøvlet formulering
grundet tidspunktet på dagen. Jeg undskylder.
| |
Johan Holst Nielsen (22-06-2007)
| Kommentar Fra : Johan Holst Nielsen |
Dato : 22-06-07 07:58 |
|
Tank wrote:
> Hej,
>
> Så er jeg her altså igen, denne gang med et meget underligt problem.
> Har simpelthen ingen anelse om, hvorfor det ikke virker. Det hele kan
> koges ned til dette stykke kode:
>
> <?php
> include_once("config.php");
>
> // virker
> echo "Outside: " . $storage_url;
>
> // virker ikke, returnerer intet?
> wtf();
> function wtf(){
> echo "Inside: " . $storage_url;
> }
> ?>
>
> $storage_url er en variabel gemt i min config.php fil som er
> inkluderet i filen hvor ovenstående kodestykke også er placeret. Jeg
> har derefter prøvet at returnere $storage_url fra andre funktioner,
> bl.a. i en helt anden fil, library.php, som også inkluderer
> config.php. Dette gav samme resultat!
>
> Så når jeg "kalder" $storage_url udenfor en funktion virker det fint.
> Hvis den kaldes indenfor en funktion, returneres intet.
prøv
function wtf() {
global $storage_url;
echo "Inside: ".$storage_url;
}
så skulle det virke
Læs lidt om det på
www.php.net/language.variables.scope
--
Johan Holst Nielsen
Freelance PHP Developer - http://phpgeek.dk
| |
Michael Rasmussen (22-06-2007)
| Kommentar Fra : Michael Rasmussen |
Dato : 22-06-07 07:59 |
|
On Fri, 22 Jun 2007 01:58:00 -0000
Tank <dan1990@gmail.com> wrote:
>
> // virker ikke, returnerer intet?
> wtf();
> function wtf(){
> echo "Inside: " . $storage_url;
> }
> ?>
>
1) Du kan ikke kalde en funktion, før den er defineret. Kaldet til wtf
skal derfor flyttes.
function wtf(){
echo "Inside: " . $storage_url;
}
wtf();
>
> Så når jeg "kalder" $storage_url udenfor en funktion virker det fint.
> Hvis den kaldes indenfor en funktion, returneres intet.
>
I PHP er scope reglerne anderledes end i de fleste andre sprog, hvilket
betyder, at globalt scope ikke eksisterer indenfor funktioner. Skal du
have adgang til variable udenfor lokalt scope, skal disse enten
medsendes som parameter, eller defineres i lokalt scope.
Så enten:
function wtf($storage_url) {
echo "Inside: " . $storage_url;
}
wtf($storage_url);
eller:
function wtf() {
global $storage_url;
echo "Inside: " . $storage_url;
}
wtf();
--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917
A computer is like air conditioning: it becomes useless when you open
windows.
| |
Birger (22-06-2007)
| Kommentar Fra : Birger |
Dato : 22-06-07 08:27 |
|
"Michael Rasmussen" <mir@miras.org> skrev i en meddelelse
news:20070622085833.3d6c85b3@localhost...
....
> 1) Du kan ikke kalde en funktion, før den er defineret. Kaldet til wtf
> skal derfor flyttes.
>function wtf(){
> echo "Inside: " . $storage_url;
>}
>wtf();
....
>2)
>I PHP er scope reglerne anderledes end i de fleste andre sprog, hvilket
>betyder, at globalt scope ikke eksisterer indenfor funktioner. Skal du
>have adgang til variable udenfor lokalt scope, skal disse enten
>medsendes som parameter, eller defineres i lokalt scope.
1)
Det var ikke så godt.
Jeg kalder tit funktioner før de er defineret - og det virker fint!
2)
Mere forståeligt.
Scope for funktioner, er kun funktionen. Så for at udskrive en variabel,
skal den enten medtages som en global, eller overføres som parameter.
Og forskellen på det er, at du kan ændre dens værdi hvis du bruger "global"
metoden - det kan du ikke hvis den medtages som parameter (med mindre du
bruger referance overførsler), hvor du kun vil kunne ændre den lokale kopi,
i funktionens scope.
Birger
| |
Michael Rasmussen (22-06-2007)
| Kommentar Fra : Michael Rasmussen |
Dato : 22-06-07 09:02 |
|
On Fri, 22 Jun 2007 09:27:12 +0200
"Birger" <sdc@bbsorensen.com> wrote:
> 1)
> Det var ikke så godt.
> Jeg kalder tit funktioner før de er defineret - og det virker fint!
>
Ja, muligvis virker det nu, men der er ingen garanti for, at det vil
virke i fremtiden, da det er i strid med PHP's scope regler! Vil man
have fremtidssikret kode, skal man overholde de officielle regler og
ikke basere sig på uofficielle hack.
--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917
A computer is like air conditioning: it becomes useless when you open
windows.
| |
Bertel Lund Hansen (22-06-2007)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 22-06-07 09:09 |
|
Tank skrev:
> Så når jeg "kalder" $storage_url udenfor en funktion virker det fint.
> Hvis den kaldes indenfor en funktion, returneres intet.
Netop. Sådan skal en funktion være, og sådan er den i PHP. Det
betyder at man ikke uforvarende ødelægger noget i hovedprogrammet
når man roder med en variabel i en funktion. Forklaringer om den
slags bruger det engelske ord "scope" som også bruges på dansk.
Det betyder noget i retning af "virkningsområde".
Den 'rigtige' måde at løse dit problem på består i at overføre
den ønskede variabel som en parameter:
<?php
// Sæt variablen $storage_url:
include_once("config.php");
function wtf ($url){
echo "Inside: " . $url;
}
// -------- Main --------
wtf($storage_url);
?>
Man kan godt vælge den konvention at man kalder funktionens
variabel det samme som den hedder i main, men her har jeg undladt
det for at gøre det tydeligere at det er en ny variabel der
optræder.
NB! Husk at det er en kopi der oprettes i funktionen. Hvis man
ændrer på $url i funktionen, har det *ingen* indflydelse på
$storage_url i main.
Der findes to metoder til at slå den beskyttelse fra som ellers
er indbygget i brugen af en funktion. Man kan erklære en variabel
som GLOBAL inden i en funktion. Så skal man bruge samme
variabelnavn:
<?php
// Sæt variablen $storage_url:
include_once("config.php");
function wtf (){
GLOBAL $storage_url:
echo "Inside: " . $storage_url;
}
// -------- Main --------
wtf($storage_url);
?>
Eller man kan overføre en reference til en variabel. Det gør man
ved at sætte & foran variabelnavnet i parameterlisten (og ikke
andre steder):
<?php
// Sæt variablen $storage_url:
include_once("config.php");
function wtf (&$url){
echo "Inside: " . $url;
}
// -------- Main --------
wtf($storage_url);
?>
$url i funktionen er på den måde samme variabel som $storage_url
i main selv om navnet er anderledes. Det er *kun* i
parameterlisten at & skal optræde.
Ved disse to metoder fjerner man den beskyttelse der ellers er
ved brug af en funktion, og ændringer af variablen i funktionen
slår igennem overalt.
--
Bertel
http://bertel.lundhansen.dk/ http://fiduso.dk/
| |
Henrik Stidsen (22-06-2007)
| Kommentar Fra : Henrik Stidsen |
Dato : 22-06-07 09:35 |
|
Bertel Lund Hansen <unospamo@lundhansen.dk> wrote in
news:12n119vn1g04h.1u1ubgo4z1t2y$.dlg@40tude.net:
> Sådan skal en funktion være, og sådan er den i PHP.
Det er sådan det er i PHP men det er ikke sådan det er i ca. alle andre
programmeringssprog, så at sige det er sådan en funktion skal være er måske
nok lidt af en tilsnigelse... Du er selvfølgelig fri til at have din egen
mening om det :)
| |
Martin (22-06-2007)
| Kommentar Fra : Martin |
Dato : 22-06-07 09:57 |
|
Henrik Stidsen wrote:
> Bertel Lund Hansen <unospamo@lundhansen.dk> wrote in
> news:12n119vn1g04h.1u1ubgo4z1t2y$.dlg@40tude.net:
>
>> Sådan skal en funktion være, og sådan er den i PHP.
>
> Det er sådan det er i PHP men det er ikke sådan det er i ca. alle andre
> programmeringssprog, så at sige det er sådan en funktion skal være er måske
> nok lidt af en tilsnigelse... Du er selvfølgelig fri til at have din egen
> mening om det :)
sådan er det da også i C og C++, som PHP jo har fulgt rimelig tæt
| |
Bertel Lund Hansen (22-06-2007)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 22-06-07 10:00 |
|
Henrik Stidsen skrev:
>> Sådan skal en funktion være, og sådan er den i PHP.
> Det er sådan det er i PHP men det er ikke sådan det er i ca. alle andre
> programmeringssprog
Det er sådan i Comal, C, C++, Java, Logo, PHP og ColdFusion. Hvis
jeg husker ret, er variable i TurboPascal globale, men jeg ved
ikke om det er korrekt eller en Borlandspecialitet.
> så at sige det er sådan en funktion skal være er måske
> nok lidt af en tilsnigelse...
Mon ikke du skulle nøjes med at udtale dig om sprog du kender?
--
Bertel
http://bertel.lundhansen.dk/ http://fiduso.dk/
| |
Philbråd Tikenstraad~ (22-06-2007)
| Kommentar Fra : Philbråd Tikenstraad~ |
Dato : 22-06-07 12:53 |
|
"Bertel Lund Hansen" <unospamo@lundhansen.dk> wrote in message
news:d9jcru696utg.r9ldztxetogt$.dlg@40tude.net...
> Henrik Stidsen skrev:
>
>>> Sådan skal en funktion være, og sådan er den i PHP.
>
>> Det er sådan det er i PHP men det er ikke sådan det er i ca. alle andre
>> programmeringssprog
>
> Det er sådan i Comal, C, C++, Java, Logo, PHP og ColdFusion. Hvis
> jeg husker ret, er variable i TurboPascal globale, men jeg ved
> ikke om det er korrekt eller en Borlandspecialitet.
>
>> så at sige det er sådan en funktion skal være er måske
>> nok lidt af en tilsnigelse...
>
> Mon ikke du skulle nøjes med at udtale dig om sprog du kender?
Bertel, Bertel, Bertel....
Det vil klæde dig at lave lidt research, så du undgår at gøre dig selv til
grin på den her måde. Det er ved at være pinligt.
Det står ret tydeligt i
http://www.php.net/manual/en/language.variables.scope.php. Læg specielt
mærke til sætningen. "You may notice that this is a little bit different
from the C language in that global variables in C are automatically
available to functions unless specifically overridden by a local
definition."
Jeg tror sgu, du skylder folk en kvajebajer her.
Eksempel i C
C:\>type bertel.c
#include <stdio.h>
int i = 7;
void hejBertel() { printf("Inside: %d\r\n"); }
int main() {
hejBertel();
return 0;
}
C:\>gcc -o bertel.exe bertel.c
C:\>bertel.exe
Inside: 7
Eksempel i PHP:
C:\>type bertel.php
<?php
$i = 7;
function hejBertel() { echo $i; }
hejBertel();
?>
C:\>php.exe bertel.php
C:\>
| |
Philbråd Tikenstraad~ (22-06-2007)
| Kommentar Fra : Philbråd Tikenstraad~ |
Dato : 22-06-07 13:25 |
|
"Philbråd Tikenstraadt" <philbraad@hotmail.com> wrote in message
news:f5gco3$cj5$1@news.net.uni-c.dk...
> void hejBertel() { printf("Inside: %d\r\n"); }
void hejBertel() { printf("Inside: %d\r\n", i); }naturligvis.
| |
Michael Rasmussen (22-06-2007)
| Kommentar Fra : Michael Rasmussen |
Dato : 22-06-07 10:02 |
|
On Fri, 22 Jun 2007 10:57:03 +0200
Martin <news@natten-i.dk> wrote:
>
> sådan er det da også i C og C++, som PHP jo har fulgt rimelig tæt
Nej, i C og C++ er lokalt scope en delmængde af globalt scope.
--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917
A computer is like air conditioning: it becomes useless when you open
windows.
| |
Michael Rasmussen (22-06-2007)
| Kommentar Fra : Michael Rasmussen |
Dato : 22-06-07 10:07 |
|
On Fri, 22 Jun 2007 11:00:20 +0200
Bertel Lund Hansen <unospamo@lundhansen.dk> wrote:
>
> Det er sådan i Comal, C, C++, Java, Logo, PHP og ColdFusion. Hvis
> jeg husker ret, er variable i TurboPascal globale, men jeg ved
> ikke om det er korrekt eller en Borlandspecialitet.
>
#include <stdio.h>
#include <stdlib.h>
int i = 7;
void test_scope() {
printf("%d\n", i);
}
int main() {
test_scope();
return EXIT_SUCCESS;
}
?
>
> Mon ikke du skulle nøjes med at udtale dig om sprog du kender?
>
Hvad med dig selv Bertel!?
--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917
A computer is like air conditioning: it becomes useless when you open
windows.
| |
Bertel Lund Hansen (22-06-2007)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 22-06-07 12:10 |
| | |
Michael Rasmussen (22-06-2007)
| Kommentar Fra : Michael Rasmussen |
Dato : 22-06-07 10:24 |
|
On Fri, 22 Jun 2007 11:00:20 +0200
Bertel Lund Hansen <unospamo@lundhansen.dk> wrote:
>
> Det er sådan i Comal, C, C++, Java, Logo, PHP og ColdFusion. Hvis
> jeg husker ret, er variable i TurboPascal globale, men jeg ved
> ikke om det er korrekt eller en Borlandspecialitet.
>
Her har du så lige et C++ og Java program:
#include <iostream>
int i = 7;
void test_scope() {
std::cout << i << std::endl;
}
int main() {
test_scope();
return EXIT_SUCCESS;
}
public class Scope {
static int i = 7;
public static void test_scope() {
System.out.println(i);
}
public static void main(String args[]) {
test_scope();
}
}
--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917
A computer is like air conditioning: it becomes useless when you open
windows.
| |
Tank (22-06-2007)
| Kommentar Fra : Tank |
Dato : 22-06-07 13:13 |
|
On Jun 22, 8:57 am, Johan Holst Nielsen <s...@phpgeek.dk> wrote:
> prøv
> function wtf() {
> global $storage_url;
> echo "Inside: ".$storage_url;
>
> }
>
> så skulle det virke
Og det gør det! Lidt upraktisk, dog, da meningen ved, at bruge en
config.php fil jo var, at alle configurations skulle være tilgængelige
for alle scripts og funktioner. Dette virker dog til, at være den
bedst løsning, så jeg er glad!
Vil gerne takke jer alle for indsatsen, dette er en meget lærerig og
underholdende tråd, tak for alle svarene!
Håber ikke jeg fik ødelagt nogen venskaber ;)
Venlig Hilsen
Dan
| |
Geert Lund (22-06-2007)
| Kommentar Fra : Geert Lund |
Dato : 22-06-07 17:22 |
|
Tank wrote:
> Og det gør det! Lidt upraktisk, dog, da meningen ved, at bruge en
> config.php fil jo var, at alle configurations skulle være tilgængelige
> for alle scripts og funktioner. Dette virker dog til, at være den
> bedst løsning, så jeg er glad!
Det er de egentlig også - du kan faktisk referere alle dine globale
variable direkte i PHP via $GLOBALS [1] - fx:
<?php
$varTest = 'Hejsa';
function viewTest() {
print $GLOBALS['varTest'];
$GLOBALS['varTest'] = $GLOBALS['varTest'] . ' test!';
}
viewTest();
print $GLOBALS['varTest'];
?>
Her kan du se at du ikke behøver at definere dem først via GLOBAL
statementet.
[1]
http://dk2.php.net/manual/en/reserved.variables.php#reserved.variables.globals
--
Med venlig hilsen
Geert Lund,
www.GLD.dk
| |
Tank (22-06-2007)
| Kommentar Fra : Tank |
Dato : 22-06-07 17:52 |
|
On Jun 22, 6:22 pm, Geert Lund <glund-n...@post.tele.dk> wrote:
> Tank wrote:
> > Og det gør det! Lidt upraktisk, dog, da meningen ved, at bruge en
> > config.php fil jo var, at alle configurations skulle være tilgængelige
> > for alle scripts og funktioner. Dette virker dog til, at være den
> > bedst løsning, så jeg er glad!
>
> Det er de egentlig også - du kan faktisk referere alle dine globale
> variable direkte i PHP via $GLOBALS [1] - fx:
>
> <?php
>
> $varTest = 'Hejsa';
>
> function viewTest() {
> print $GLOBALS['varTest'];
> $GLOBALS['varTest'] = $GLOBALS['varTest'] . ' test!';
> }
>
> viewTest();
> print $GLOBALS['varTest'];
>
> ?>
>
> Her kan du se at du ikke behøver at definere dem først via GLOBAL
> statementet.
>
> [1] http://dk2.php.net/manual/en/reserved.variables.php#reserved.variable....
>
> --
> Med venlig hilsen
> Geert Lund, www.GLD.dk
Super! Endnu bedre end, at bruge global keywordet, mange tak.
Dan
| |
Arne Feldborg (23-06-2007)
| Kommentar Fra : Arne Feldborg |
Dato : 23-06-07 00:23 |
|
Tank <dan1990@gmail.com> skrev Fri, 22 Jun 2007 16:51:56 -0000
>> Det er de egentlig også - du kan faktisk referere alle dine globale
>> variable direkte i PHP via $GLOBALS [1] - fx:
[snip...]
>Super! Endnu bedre end, at bruge global keywordet, mange tak.
>
Men det ændrer ikke den kendsgerning, at begge dele er at springe over
hvor gærdet er lavest.
Og før eller siden vil føre til uforudsete problemer.
--
mvh, A:\Feldborg
Slægtsforskning og lokalhistorie i midt- vestjylland
http://hammerum-herred.dk/
| |
Martin (23-06-2007)
| Kommentar Fra : Martin |
Dato : 23-06-07 14:52 |
|
Tank wrote:
> Så når jeg "kalder" $storage_url udenfor en funktion virker det fint.
> Hvis den kaldes indenfor en funktion, returneres intet.
Min løsning på dette problem, så jeg er fri for at globalisere alle
mulige variabler er ganske simpel.
Når jeg laver en config fil, med en masse forskellige variabler som
bruges over hele sitet, så plejer jeg at definer dem istedet for bare at
lave en alm. variabel.
Fx
config.php
--------
<?php
define('HTTP_PATH',' http://www.domæne.dk');
define('SERVER_PATH','/var/www/domæne.dk/www');
define('UPLOAD_DIR','uploads');
?>
Så kan man i alle funktioner, klasser eller lign. bare bruge
function upload($file) {
move_uploaded_file($file['tmp_name'],SERVER_PATH . '/' . UPLOAD_DIR .
'/' . $file['name']);
}
Så nemt er det - ikke noget med at globalisere nogle variabler eller
noget :)
| |
|
|