/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
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 skrev:

>> Mon ikke du skulle nøjes med at udtale dig om sprog du kender?

> Hvad med dig selv Bertel!?

Det vil jeg tænke over ...

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

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 :)

Søg
Reklame
Statistik
Spørgsmål : 177496
Tips : 31968
Nyheder : 719565
Indlæg : 6408491
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste