/ 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
funktioner og scope
Fra : scootergrisen


Dato : 18-11-10 10:44

Jeg er ved at lave nogle php eksempler på min hjemmeside sådan at folk
kan se hvordan man skriver php kode.

De funktion jeg viser på hjemmesiden er rigtige funktionen men jeg har
det problem at jeg kan ikke kalde en funktion det samme navn hvis jeg
allerede har en funktionen ved det navn.

Så jeg tænkte er det et scope der gør at jeg kan kan kalde funktionerne
inden for et bestemt område lige hvad jeg vil uden at det har betydning
for resten af koden.

Fordi hvis jeg har 2 funktioner med samme navn så stopper php med at
udføre kode.

Håber i forstår hvad jeg mener.

Det er ligesom at variabler inden i en funktion godt kan have samme navn
som en variabel udenfor den funktion uden det betyder noget. Leder efter
en måde at gøre det samme for funktioner.

<?php
$a = 1; /* global scope */

function test()
{
echo $a; /* reference to local scope variable */
}

test();
?>

koden laver ikke noget output fordi de 2 variabler er i forskelligt scope.

 
 
Birger Sørensen (18-11-2010)
Kommentar
Fra : Birger Sørensen


Dato : 18-11-10 11:38

scootergrisen kom med følgende:
> Jeg er ved at lave nogle php eksempler på min hjemmeside sådan at folk kan se
> hvordan man skriver php kode.
>
> De funktion jeg viser på hjemmesiden er rigtige funktionen men jeg har det
> problem at jeg kan ikke kalde en funktion det samme navn hvis jeg allerede
> har en funktionen ved det navn.
>
> Så jeg tænkte er det et scope der gør at jeg kan kan kalde funktionerne inden
> for et bestemt område lige hvad jeg vil uden at det har betydning for resten
> af koden.
>
> Fordi hvis jeg har 2 funktioner med samme navn så stopper php med at udføre
> kode.
>
> Håber i forstår hvad jeg mener.
>
> Det er ligesom at variabler inden i en funktion godt kan have samme navn som
> en variabel udenfor den funktion uden det betyder noget. Leder efter en måde
> at gøre det samme for funktioner.
>
> <?php
> $a = 1; /* global scope */
>
> function test()
> {
> echo $a; /* reference to local scope variable */
> }
>
> test();
> ?>
>
> koden laver ikke noget output fordi de 2 variabler er i forskelligt scope.

funktioner er globale på samme måde som variable.
Den eneste måde du kan have to funktioner med samme navn, er at have
den ene af dem indenfor en anden funktion.

I øvrigt en ganske skidt ide - hvis du har to funktioner med samme
navn, hvilken af dem skal så bruges hvornår?
Hvilket også er dit problem med at udføre det - compileren går i stå,
fordi den ikke kan håndtere to funktioner der hedde det samme.

Jeg tror heller ikke jeg forstår problemet.
Der er forskel på at skrive kode der skal udføres og kode der skal
vises. Det sidste er HTML, og der er ingen problemer med at skrive
navnet på en funktion til HTML...

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



scootergrisen (18-11-2010)
Kommentar
Fra : scootergrisen


Dato : 18-11-10 13:21

Som jeg skrev så er det en rigtig funktion jeg laver hvor både
kildekoden vises og funktioen virker.
Så man kan se hvordan den virker "live" på hjemmesiden. Altså outputter
kommer fra selve den kilde koden brugere ser og er ikke bare noget tekst
jeg har skrevet.

Jeg kunne selvfølgelig bare starte alle funktions navne med PHP_ for
eksempel så udregn() kom til at hedde PHP_udregn() det ville løse
problemet men det vil jeg gerne undgå hvis jeg kan.
Jeg har dog set den metode brugt i bøger.

Jeg har lige prøvet at læse om namespace på
http://www.php.net/manual/en/language.namespaces.php og det virker lige
præcis til at være det som jeg søger man jeg kan ikke få det til at du.

Jeg har lavet en ny fil "eval.php" med denne kode.



<?php

namespace phpeksempler;

function kodeeval(&$phpkode){

eval("?>".$phpkode."<?php ");

}

?>



Så i stedet for at kalde funktionen med kodeeval() som jeg gjorde før så
skal jeg skrive phpeksempler\kodeeval();

Og det virker også.

Men den kode som er i $phpkode for eksempel:



<?php

function byttegn(){

// noget kode

}

?>


Ja den bliver jo udført af eval() og det betyder så åbenbart at den
indlæses ind det normale namespace sammen med alle mine andre funktioner
hvor der er en byttegn() funktioner i forvejen også får jeg en fejl besked.

Jeg skulle gerne have udført eval() i phpeksempler namespacet.

Kan det mon lade sig gøre ?

Martin Larsen (18-11-2010)
Kommentar
Fra : Martin Larsen


Dato : 18-11-10 13:30

scootergrisen wrote:

> Jeg har lige prøvet at læse om namespace på
> http://www.php.net/manual/en/language.namespaces.php og det virker lige
> præcis til at være det som jeg søger man jeg kan ikke få det til at du.

Du kan også arbejde med en slags namespace ved at bruge klasser med
statiske funktioner.

Dette er fx et uddrag af en af mine klasser:

class obfuscate {

   public static function encrypt($str) {
      return base64_encode(gzcompress(self::str_rot($str,17), 9));
   }
   
   public static function decrypt($string) {
    return self::str_rot(gzuncompress(base64_decode($string)), 9);
   }

}

Den bruger jeg således i hovedkoden: $mySecretString =
obfuscate::encrypt('Hello World');

Fordelen ved dette er 2 ting: Dels har jeg funktionerne samlet i en
overordnet enhed, og dels behøver jeg ikke tænke på om der findes andre
funktioner der hedder encrypt(). Det er helt ligegyldigt.

Man kan sige at klassen obfuscate er en slags namespace for funktionerne.

Hilsen
Martin

scootergrisen (18-11-2010)
Kommentar
Fra : scootergrisen


Dato : 18-11-10 14:01

Jeg tror godt jeg forstår hvad du mener.
Men nu skal jeg bruge function() fordi det er det jeg skal vise som kode
på hjemmesiden fordi jeg skal forklare hvordan man laver function()'s.

Nu ville jeg havde ventet lidt med at vise siden før jeg havde det
rigtig godt men her er den alligevel :
http://scootergrisen.dk/php/kode_function.php

Den side viser hvordan man bruger function() også bliver jeg jo nød til
at bruge function() når det er det jeg skal vise.

Jeg vil bare gerne kunne bruge alle de navne jeg vil og ikke skulle
tænke på om det er taget i forvejen.

Jeg tror løsningen er hvis jeg kan bestemme hvilken namespace eval()
skal udføre sin kode i.

scootergrisen (18-11-2010)
Kommentar
Fra : scootergrisen


Dato : 18-11-10 14:24

Yes baby så har jeg fået det til at virke.

Løsningen er at namespace whatever; skal med ind i eval().
Så når man køre noget i eval() er det lige som at starte forfra hvergang
eller hvad man skal sige.

Nå men lad os sige jeg har denne kode som vises på hjemmesiden:

<?php

function visnoget(){

}

?>

På hjemmesiden vil jeg jo ikke have namespace whatever; til at står hver
gang jeg skal skrive noget kode men så lavede jeg denne her:

$phpkode indenholden koden foroven.

$phpkode = str_replace("<?php", "<?php\r\n\r\nnamespace
whatever;\r\n\r\n", $phpkode);

eval("?>".$phpkode."<?php ");

Så ser det ud til at virke.

Ellers vender jeg frygteligt tilbage :)

Birger Sørensen (18-11-2010)
Kommentar
Fra : Birger Sørensen


Dato : 18-11-10 15:17

Efter mange tanker skrev scootergrisen:
> Som jeg skrev så er det en rigtig funktion jeg laver hvor både kildekoden
> vises og funktioen virker.
> Så man kan se hvordan den virker "live" på hjemmesiden. Altså outputter
> kommer fra selve den kilde koden brugere ser og er ikke bare noget tekst jeg
> har skrevet.
>
> Jeg kunne selvfølgelig bare starte alle funktions navne med PHP_ for eksempel
> så udregn() kom til at hedde PHP_udregn() det ville løse problemet men det
> vil jeg gerne undgå hvis jeg kan.
> Jeg har dog set den metode brugt i bøger.
>
> Jeg har lige prøvet at læse om namespace på
> http://www.php.net/manual/en/language.namespaces.php og det virker lige
> præcis til at være det som jeg søger man jeg kan ikke få det til at du.
>
> Jeg har lavet en ny fil "eval.php" med denne kode.
>
>
>
> <?php
>
> namespace phpeksempler;
>
> function kodeeval(&$phpkode){
>
> eval("?>".$phpkode."<?php ");
>
> }
>
> ?>
>
>
>
> Så i stedet for at kalde funktionen med kodeeval() som jeg gjorde før så skal
> jeg skrive phpeksempler\kodeeval();
>
> Og det virker også.
>
> Men den kode som er i $phpkode for eksempel:
>
>
>
> <?php
>
> function byttegn(){
>
> // noget kode
>
> }
>
> ?>
>
>
> Ja den bliver jo udført af eval() og det betyder så åbenbart at den indlæses
> ind det normale namespace sammen med alle mine andre funktioner hvor der er
> en byttegn() funktioner i forvejen også får jeg en fejl besked.
>
> Jeg skulle gerne have udført eval() i phpeksempler namespacet.
>
> Kan det mon lade sig gøre ?

Jeg forstår ikke hvorfor du skal bruge to funktioner med samme navn der
gør det samme...

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



scootergrisen (18-11-2010)
Kommentar
Fra : scootergrisen


Dato : 18-11-10 15:39

Jeg skal ikke bruge 2 funktioner med samme navn der gør det samme.
Jeg vil bare gerne kunne vælge præcist de funktions navne jeg ønsker
uden jeg skal tænke på at det måske lave konflikt med andre funktioner.

Så jo jeg vil gerne kunne have 2 funktioner med samme navn men det har
ikke noget med at gøre de skal gøre det samme.

Men det virker nu også læste jeg noget nyt det super.
Det sker en sjælden gang i mellem he :)

Birger Sørensen (18-11-2010)
Kommentar
Fra : Birger Sørensen


Dato : 18-11-10 15:49

scootergrisen udtrykte præcist:
> Jeg skal ikke bruge 2 funktioner med samme navn der gør det samme.
> Jeg vil bare gerne kunne vælge præcist de funktions navne jeg ønsker uden jeg
> skal tænke på at det måske lave konflikt med andre funktioner.
>
> Så jo jeg vil gerne kunne have 2 funktioner med samme navn men det har ikke
> noget med at gøre de skal gøre det samme.
>
> Men det virker nu også læste jeg noget nyt det super.
> Det sker en sjælden gang i mellem he :)


Det er helt fint at lære nyt.

Mener nu stadig det er en skidt ide at bruge samme navn til forskellige
ting. Jeg har det fint med, at når man kalder på Morten så er det ham
der kommer, og ikke Jørgen.
Tror din ide med at kalde de funktioner du offentliggør for det du har
kaldt dem, men dem du ikke offentliggør noget andet - f.eks. det
foranstillede PHP_ - er meget bedre.
Men det er selvfølgelg dit eget valg.

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



scootergrisen (18-11-2010)
Kommentar
Fra : scootergrisen


Dato : 18-11-10 16:57

Jamn birger det jo netop derfor namespace er lavet. Så man kan gøre sådan.

Du har vel heller ikke forskellige navne på ALLE dine variabler i din kode ?

Mon ikke $value eller $key går igen nogle gange inden de diverse funktioner.



Birger Sørensen (18-11-2010)
Kommentar
Fra : Birger Sørensen


Dato : 18-11-10 18:00

scootergrisen forklarede den 18-11-2010:
> Jamn birger det jo netop derfor namespace er lavet. Så man kan gøre sådan.
>
> Du har vel heller ikke forskellige navne på ALLE dine variabler i din kode ?
>
> Mon ikke $value eller $key går igen nogle gange inden de diverse funktioner.

Helt klart. Det er så ikke nødvendigvis forskellige variable for det
forgår ikke nødvendigvis i funktioner, og jeg kalder helst mine
variable noget der betegner det indhold de er tiltænkt - og sjældent
taget fra eksempler. Men der er da gengangere.

Mine funktioner har til gengæld unike navne, for jeg vil have styr på
hvad de gør - eller omvendt; jeg ved hvilken funktion jeg skal kalde
for at få udført en given operation.

Det kan godt være det er mig - men meningen med namespace er vist ikke
at kunne oprette forskellige funktioner med samme navn. Hvis noget, at
kunne blande applikationer, der i forvejen har defineret samme funktion
med forskelligt navn, eller omvendt. At det så kan anvendes som du gør,
er en anden sag.

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



scootergrisen (18-11-2010)
Kommentar
Fra : scootergrisen


Dato : 18-11-10 18:20

Som der står på :
http://www.php.net/manual/en/language.namespaces.definition.php

"only three type of code are affected by namespaces: classes, functions
and constants."

Jeg vil da netop mene at meningen med namespace er at man så kan oprette
flere funktioner med samme navn.

Præcist dom du kan have flere variabler af samme navn i forskellige
funktioner uden at de påvirker hinanden.

Jeg kan ikke forstå du er imod at bruge funktioner med samme navn men
samtidig for at bruge variabler med samme navn.

Det handler jo bare on hvilket scope (eller namespace) de høre ind under.

Når man så kalder en funktion i et andet namespace så skriver man bare
etandetsted\visbilled();

Også kunne man have en anden function med samme navn i en anden
namespace og kalde den...

ettrediested\visbilled();

Så det jo ikke fordi man kalde visbilled() i blinde og håber på det er
den rigtige.

Forrestild dig også at du downloade et eller andet script som nogen
andre har skrevet som du vil bruge på din hjemmeside... men hov scriptet
bruge mange af de samme functions navne som du gør...
Hvad gør du ? vil du til at ændre en masse på din kode ?

Nej vel du bruger da bare namespace i dit nyt script og vupti så skal du
ikke tænkte på om der er nogle navne som er ens.


Birger Sørensen (18-11-2010)
Kommentar
Fra : Birger Sørensen


Dato : 18-11-10 19:29

scootergrisen skrev den 18-11-2010:
8X
> Forrestild dig også at du downloade et eller andet script som nogen andre har
> skrevet som du vil bruge på din hjemmeside... men hov scriptet bruge mange af
> de samme functions navne som du gør...
> Hvad gør du ? vil du til at ændre en masse på din kode ?
>
> Nej vel du bruger da bare namespace i dit nyt script og vupti så skal du ikke
> tænkte på om der er nogle navne som er ens.

Men det er så måske forskellen. Jeg bruger ikke andres programmer. Har
ikke mødt noget hvor det kunne betale sig eller har været nødvendigt
endnu. Men man skal da aldrig sige aldrig.
Skulle det ske, vil jeg nok bruge lidt tid i planlægningsfasen, så jeg
ikke ville risikere ens funktionsnavne, og også ikke at bruge tid på
selv programmere ting der allerede findes i det jeg låner/importerer

Og som du selv skriver, og jeg skrev tidligere: Hvis man blander
eksisterende applikationer.
Hvis man selv skriver sin egen kode - evt. mixer med andres
eksisterende, kan man skille dem med namespace.

At bruge namespace, for at kunne kalde forskellige funktioner det
samme, er IMHO dybt godnat.

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



scootergrisen (19-11-2010)
Kommentar
Fra : scootergrisen


Dato : 19-11-10 12:20

Hvad skulle man så bruge namespace til ?



Birger Sørensen (19-11-2010)
Kommentar
Fra : Birger Sørensen


Dato : 19-11-10 13:01

scootergrisen kom med denne ide:
> Hvad skulle man så bruge namespace til ?

Læs de tidlige indlæg : import af andre scripts/applikationer/api's.
Alternativt google.
Jeg har ikke brugt namespace i PHP, og ikke haft brug for det.
Men det er tumpet at tro, at meningen med namespace er at kunne kalde
forskellige funktioner det samme. At det giver den mulighed er en anden
ting. At det er muligt er ikke det samme som at det er rigtigt at gøre
det.

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



scootergrisen (19-11-2010)
Kommentar
Fra : scootergrisen


Dato : 19-11-10 13:37

Jeg kan ikke finde noget emner der hedder :
"import af andre scripts/applikationer/api's"

Der det det rigtige navn på emnet her i
dk.edb.internet.webdesign.serverside.php gruppen ?

Birger Sørensen (19-11-2010)
Kommentar
Fra : Birger Sørensen


Dato : 19-11-10 14:53

Følgende er skrevet af scootergrisen:
> Jeg kan ikke finde noget emner der hedder :
> "import af andre scripts/applikationer/api's"
>
> Der det det rigtige navn på emnet her i
> dk.edb.internet.webdesign.serverside.php gruppen ?

Det er det jeg mener namespace har sin berettigelse at blive brugt til

og prøv at google efter namespace - der er nok nogle fornuftigw
foklaringer

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Martin Larsen (19-11-2010)
Kommentar
Fra : Martin Larsen


Dato : 19-11-10 14:55

scootergrisen wrote:

> Hvad skulle man så bruge namespace til ?

Man bruger namespace til at sikre sig mod *utilsigtet* navnesammenfald,
så man ikke skal tænke på om forskellige kodebiblioteker konflikter med
hinanden.

Birger har helt ret i at det er en rigtig dårlig praksis at bruge det
til at lave flere funktioner med samme navn.

Men hvis det gør det lettere for dig at lave din guide, så er der ikke
noget i vejen for det i sig selv, men pas på at du ikke lærer dine
"elever" noget som ikke er anbefalelsesværdigt.

Martin



Søg
Reklame
Statistik
Spørgsmål : 177579
Tips : 31968
Nyheder : 719565
Indlæg : 6409073
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste