/ 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
Reference til endnu ikke-eksisterende vari~
Fra : Bertel Lund Hansen


Dato : 08-05-07 20:14

Hej alle

Et lille teknisk spørgsmål:

Jeg har en funktion der indlæser en datafil i et array og
barberer hver linje samt fjerne tomme linjer i slutningen. Den
ser sådan ud:

function read_datafile (&$arrayname,&$filename) {
   $arrayname=explode("\n", file_get_contents($filename));
   while (strlen(end($arrayname))<4) array_pop($arrayname);
   for ($nr=0; $nr<count($arrayname); ++$nr) $arrayname[$nr]=trim($arrayname[$nr]);
}

Et kald til funktionen ser sådan ud:

$filecontent=Array();
read_datafile($filecontent,$answerfilename);

Nu er mit spørgsmål:
Er det nødvendigt at erklære variablen som et array før kaldet
eller kan man operere med en reference til en endnu ikke
eksisterende variabel?

Hvis man kan, er det så dårlig skik?

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

 
 
Nezar Nielsen (09-05-2007)
Kommentar
Fra : Nezar Nielsen


Dato : 09-05-07 09:10

Bertel Lund Hansen wrote:
> function read_datafile (&$arrayname,&$filename) {
....
> Er det nødvendigt at erklære variablen som et array før kaldet
> eller kan man operere med en reference til en endnu ikke
> eksisterende variabel?

Det kan man godt, fordi php bare opretter den, idet du begynder at bruge
den, så flg. vil virke:

function t(&$var){$var = "yes";} t($fez); print $fez;

Efter min mening er det dog enormt dårlig stil, fordi du måske kunne
komme til at fylde noget i variablen før funktionskaldet, og hvis
funktionen så kiggede på indholdet for at udfylde det korrekt(i forb.
med loops eller lign.), så kunne du pludselig få uventede resultater.

Men hvorfor bruger du ikke bare en returværdi i stedet for at sende den
med som parameter?

function t(){$var = "yes"; return $var;} $fez = t(); print $fez;

--
Mvh. Nezar Nielsen
http://gorilla.dk

Bertel Lund Hansen (09-05-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 09-05-07 09:46

Nezar Nielsen skrev:

> Men hvorfor bruger du ikke bare en returværdi i stedet for at sende den
> med som parameter?

Jo, det tænkte jeg også på da jeg havde spurgt. Det er mere
logisk. Jeg tror at jeg lavede den anden konstruktion for at
spare tid.

Jeg voksede op med en 8080'er der kørte ½ MHz og havde 24 Kbyte
ram, så jeg lærte at udnytte hver bit og hver clockcycle.

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

Jöran Egdahl (09-05-2007)
Kommentar
Fra : Jöran Egdahl


Dato : 09-05-07 23:11

"Bertel Lund Hansen" <unospamo@lundhansen.dk> wrote in message
news:j3jmqoa7c9ac.a75nmlbf5n1i.dlg@40tude.net...
> Nezar Nielsen skrev:
>
>> Men hvorfor bruger du ikke bare en returværdi i stedet for at sende den
>> med som parameter?
>
> Jo, det tænkte jeg også på da jeg havde spurgt. Det er mere
> logisk. Jeg tror at jeg lavede den anden konstruktion for at
> spare tid.
>
> Jeg voksede op med en 8080'er der kørte ½ MHz og havde 24 Kbyte
> ram, så jeg lærte at udnytte hver bit og hver clockcycle.

Hvorfor tror du, at det vil udnytte dine clockcycles bedre? Lav gerne et
eksempel i 8080 asm som illustration.



Michael Zedeler (10-05-2007)
Kommentar
Fra : Michael Zedeler


Dato : 10-05-07 00:01

Jöran Egdahl skrev:
> "Bertel Lund Hansen" <unospamo@lundhansen.dk> wrote in message
> news:j3jmqoa7c9ac.a75nmlbf5n1i.dlg@40tude.net...
>> Nezar Nielsen skrev:
>>
>>> Men hvorfor bruger du ikke bare en returværdi i stedet for at sende den
>>> med som parameter?
>> Jo, det tænkte jeg også på da jeg havde spurgt. Det er mere
>> logisk. Jeg tror at jeg lavede den anden konstruktion for at
>> spare tid.
>>
>> Jeg voksede op med en 8080'er der kørte ½ MHz og havde 24 Kbyte
>> ram, så jeg lærte at udnytte hver bit og hver clockcycle.
>
> Hvorfor tror du, at det vil udnytte dine clockcycles bedre? Lav gerne et
> eksempel i 8080 asm som illustration.

Jeg kan genkende samme problem fra dengang jeg kodede 6510 på C64. Hvis
det skal gå stærkt smider man ikke noget på stakken når man laver
procedurekald men lader en pointer stå i et register, som så peger på
det der skal behandles (det kommer igen an på hvad proceduren laver -
6510 har en masse snedige addresseringsmetoder, man kan vælge imellem).

Det er ikke mangle cycles man sparer, men til den anvendelse det havde
dengang, kunne 3-4 cykler sparet på det rigtige sted gør en kæmpe forskel.

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
I am less likely to answer usenet postings by anonymous authors.
Visit my home page at http://michael.zedeler.dk/

Bertel Lund Hansen (10-05-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 10-05-07 09:35

Jöran Egdahl skrev:

>> Jeg voksede op med en 8080'er der kørte ½ MHz og havde 24 Kbyte
>> ram, så jeg lærte at udnytte hver bit og hver clockcycle.

> Hvorfor tror du, at det vil udnytte dine clockcycles bedre?

Min bemærkning om clockcycles skulle ikke forstås som at det er
det det drejer sig om i PHP-tilfældet. Tidsbesparelsen er af en
helt anden størrelsesorden end en clockcycle. Jeg skrev det kun
for at forklare hvorfor jeg i dag er (somme tider) unødvendigt
nøjeregnende med tidsbesparelser når jeg programmerer. Det er en
vane der blev grundlagt i en tid med helt andre harwareforhold,
og den vane er naturligvis ikke kun af det onde, men i dag bør
hensynet til letlæseligt design og kode ofte få større prioritet
end pedantiske tidsbesparelser.

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

Jöran Egdahl (10-05-2007)
Kommentar
Fra : Jöran Egdahl


Dato : 10-05-07 10:17

"Bertel Lund Hansen" <unospamo@lundhansen.dk> wrote in message
news:1co3hlu57h8pu.ywiu5i9zn30y.dlg@40tude.net...
> Jöran Egdahl skrev:
>
>>> Jeg voksede op med en 8080'er der kørte ½ MHz og havde 24 Kbyte
>>> ram, så jeg lærte at udnytte hver bit og hver clockcycle.
>
>> Hvorfor tror du, at det vil udnytte dine clockcycles bedre?
>
> Min bemærkning om clockcycles skulle ikke forstås som at det er
> det det drejer sig om i PHP-tilfældet.

Det er jeg godt klar over. Det var derfor, at jeg bad dig lave et eksempel i
8080 asm, men det fik du sjovt nok klippet væk.




Bertel Lund Hansen (10-05-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 10-05-07 10:24

Jöran Egdahl skrev:

> Det er jeg godt klar over. Det var derfor, at jeg bad dig lave et eksempel i
> 8080 asm, men det fik du sjovt nok klippet væk.

Ja, for det var sjovt nok irrelevant. Og så er det for længe
siden at jeg har brugt assembler, til at jeg kan ryste eksempler
ud af ærmet.

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

Jöran Egdahl (10-05-2007)
Kommentar
Fra : Jöran Egdahl


Dato : 10-05-07 10:24

"Bertel Lund Hansen" <unospamo@lundhansen.dk> wrote in message
news:j3jmqoa7c9ac.a75nmlbf5n1i.dlg@40tude.net...
> Jeg voksede op med en 8080'er der kørte ½ MHz og havde 24 Kbyte
> ram, så jeg lærte at udnytte hver bit og hver clockcycle.

Jeg synes, at det lyder mærkeligt, at du har købt 500 kHz på en 8080. I
følge wikipedia kørte den første 8080'er, der blev frigivet i 1974, 2 MHz.
Er du helt sikker?



Bertel Lund Hansen (10-05-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 10-05-07 10:27

Jöran Egdahl skrev:

> Jeg synes, at det lyder mærkeligt, at du har købt 500 kHz på en 8080. I
> følge wikipedia kørte den første 8080'er, der blev frigivet i 1974, 2 MHz.
> Er du helt sikker?

Nogenlunde, men du kan godt få mig i tvivl. Det er 22 år siden
jeg skrottede den.

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

Martin Mouritzen (09-05-2007)
Kommentar
Fra : Martin Mouritzen


Dato : 09-05-07 10:50

On Tue, 8 May 2007 21:14:18 +0200, Bertel Lund Hansen
<unospamo@lundhansen.dk> wrote:

>Jeg har en funktion der indlæser en datafil i et array og
>barberer hver linje samt fjerne tomme linjer i slutningen. Den
>ser sådan ud:
>
>function read_datafile (&$arrayname,&$filename) {
>   $arrayname=explode("\n", file_get_contents($filename));
>   while (strlen(end($arrayname))<4) array_pop($arrayname);
>   for ($nr=0; $nr<count($arrayname); ++$nr) $arrayname[$nr]=trim($arrayname[$nr]);
>}
>
>Et kald til funktionen ser sådan ud:
>
>$filecontent=Array();
>read_datafile($filecontent,$answerfilename);
>
>Nu er mit spørgsmål:
>Er det nødvendigt at erklære variablen som et array før kaldet
>eller kan man operere med en reference til en endnu ikke
>eksisterende variabel?
>
>Hvis man kan, er det så dårlig skik?

Altså, jeg ved ikke om det er dårlig skik, men jeg syntes tit at det
gør koden sværere at arbejde med, fordi man måske ikke lige forventer
at funktionen arbejder på en eksisterende variabel.

Er det pga. performance?

Men udover læsbarhed af koden (Som jo kan diskuteres) er det ikke
nødvendigt, så længe variablen er defineret som "by reference" i
funktionen, så giver det ingen notices eller warnings ikke at have
erklæret den før.
--
Med venlig hilsen,
Martin Mouritzen.
http://www.siteloom.dk

Bertel Lund Hansen (09-05-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 09-05-07 12:42

Martin Mouritzen skrev:

> Altså, jeg ved ikke om det er dårlig skik, men jeg syntes tit at det
> gør koden sværere at arbejde med, fordi man måske ikke lige forventer
> at funktionen arbejder på en eksisterende variabel.

Ja, jeg har også lavet det om til en returnerende funktion nu.

> Er det pga. performance?

På en måde. Det er på grund af et abstrakt performance-begreb.
Det er slet ikke noget man vil kunne mærke.

Tak for kommentarerne til jer begge.

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

Martin Mouritzen (09-05-2007)
Kommentar
Fra : Martin Mouritzen


Dato : 09-05-07 17:17

On Wed, 9 May 2007 13:42:01 +0200, Bertel Lund Hansen
<unospamo@lundhansen.dk> wrote:

>På en måde. Det er på grund af et abstrakt performance-begreb.
>Det er slet ikke noget man vil kunne mærke.

Kender du forresten file() funktionen? Den hiver en fil ind, og laver
et array pr. linie - Så kan du nøjes med den, frem for din explode og
file_get_contents funktion.
--
Med venlig hilsen,
Martin Mouritzen.
http://www.siteloom.dk

Bertel Lund Hansen (09-05-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 09-05-07 18:31

Martin Mouritzen skrev:

> Kender du forresten file() funktionen? Den hiver en fil ind, og laver
> et array pr. linie - Så kan du nøjes med den, frem for din explode og
> file_get_contents funktion.

Ja, men hvis jeg husker ret, efterlader den linjeskiftet mens
explode fjerner det. Det er vist derfor jeg brugte den anden
metode. Da jeg alligevel stripper strengene, kan jeg dog lige så
godt bruge den.

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

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