Gå til innhold

PHP- & MySQL-innføring: Kapittel 5


Anbefalte innlegg

Videoannonse
Annonse
På engelsk kalles dette pass by reference (når du sender inn en referanse), i motsetning til pass by value, som er standard.

Det kan kanskje legges til at pass by reference i endel programmeringsspråk kalles pointer (peker), f.eks. i Java og C. Det er det uttrykket endel av oss er vant til.

 

Uansett, dere er godt igang med en bra php-guide, kjør på! Lenge til vi begynner på MySQL-delen og koblingen til php? Det er det jeg trenger øving på..

Lenke til kommentar

Endelig noen som forklarer hva peker egentlig er, kort og godt. Har søkt etter det men ingen som har sagt det så enkelt som pass by reference.

 

Bra guide. Håper dere legger til litt info også for de som har litt mer erfaring med PHP fra før av i tillegg. Ellers utrolig bra.

Lenke til kommentar
Gjest Slettet+9018234

Det greieste kapittelet i denne serien, hovedsakelig fordi skribenten er Vegard, og ikke han andre som skrev kapittel 1-3. Selv om alt dette er old-news er selve artikkelen nokså kurrant forklart. God jobb Vegard!

Lenke til kommentar
På engelsk kalles dette pass by reference (når du sender inn en referanse), i motsetning til pass by value, som er standard.

Det kan kanskje legges til at pass by reference i endel programmeringsspråk kalles pointer (peker), f.eks. i Java og C. Det er det uttrykket endel av oss er vant til.

 

Uansett, dere er godt igang med en bra php-guide, kjør på! Lenge til vi begynner på MySQL-delen og koblingen til php? Det er det jeg trenger øving på..

7215524[/snapback]

 

Det er ikke helt riktig.

 

"Pass by reference" kalles ikke pointer i noen programmeringsspråk. Pointer er enten pointer, eller reference variable. Java har ikke vanlige pointere slik som i C/C++, men de har reference variables. Begge språkene har "pass-by-reference" funksjonalitet, som altså ikke må forveksles med pointer, eller reference variable. F.ex kan en pointer også bli brukt i en "pass-by-reference" funksjon (da altså en reference til en pointer).

 

Ganske viktig å ikke rote sammen uttrykkene her. Nå går de fleste nye språk vekk fra pointer bruk (som egentlig er hardware minne adressen til en verdi, eller funksjon...etc), og lar programmereren tenke på mer fornuftige ting.

Lenke til kommentar
Det er ikke helt riktig.

 

"Pass by reference" kalles ikke pointer i noen programmeringsspråk. Pointer er enten pointer, eller reference variable. Java har ikke vanlige pointere slik som i C/C++, men de har reference variables. Begge språkene har "pass-by-reference" funksjonalitet, som altså ikke må forveksles med pointer, eller reference variable. F.ex kan en pointer også bli brukt i en "pass-by-reference" funksjon  (da altså en reference til en pointer).

 

Ganske viktig å ikke rote sammen uttrykkene her. Nå går de fleste nye språk vekk fra pointer bruk (som egentlig er hardware minne adressen til en verdi, eller funksjon...etc), og lar programmereren tenke på mer fornuftige ting.

7215826[/snapback]

Woops, du har rett, jeg har feil. Nå blandet jeg begrepene. Takk for oppklaringen.

Lenke til kommentar
*snip*

Ganske viktig å ikke rote sammen uttrykkene her. Nå går de fleste nye språk vekk fra pointer bruk (som egentlig er hardware minne adressen til en verdi, eller funksjon...etc), og lar programmereren tenke på mer fornuftige ting.

7215826[/snapback]

Det at folk, særlig Java-programmere blander sammen de uttrykkene er noe som har irritert meg lenge. De er langt ifra det samme, dog muliggjør de mye av den samme funksjonaliteten når de sendes inn i en funksjon.

 

Ellers ville jeg bare påpeke at pointers ikke alltid peker til hardwareadresser. Når det ligger et OS imellom peker som regel pointers til virtuelle minneadresser som kun OS'et egentlig vet hvor befinner seg i det virkelige minnet.

(Det er ihvertfall slik jeg har forstått det)

Lenke til kommentar
Det at folk, særlig Java-programmere blander sammen de uttrykkene er noe som har irritert meg lenge. De er langt ifra det samme, dog muliggjør de mye av den samme funksjonaliteten når de sendes inn i en funksjon.

 

Ellers ville jeg bare påpeke at pointers ikke alltid peker til hardwareadresser. Når det ligger et OS imellom peker som regel pointers til virtuelle minneadresser som kun OS'et egentlig vet hvor befinner seg i det virkelige minnet.

(Det er ihvertfall slik jeg har forstått det)

7217720[/snapback]

 

Jau...det at de roter med de uttrykkene når de ikke har lært hva en ekte pointer er, er ikke så rart i grunn. Heldigvis hadde jeg C++ på Universitetet og ikke Java som de lærer vekk nå. MYE lettere å gå fra C++ til Java, enn Java til C++. Og da lærer du hva en garbage collector FAKTISK gjør istedenfor at objekter på magisk vis forsvinnner når du er ferdig med dem.

 

Og når det er teoretisk programmering (i motsetning til praktisk/yrkesrettet) så syns jeg de fortsatt burde brukt C++ som eksempel. Selv om Java er lettere å lære vekk.

 

Jeje...

 

/rant off

 

Ps. Du har selvfølgelig rett i at at OS'et deler ut minneplassen til programmene. Ellers ville det jo vært fullstendig texas på maskinen :) ... Men det kommer jo selvsagt an på hva OS du bruker. Er jo systemer uten slik beskyttelse.

Endret av Fangs78
Lenke til kommentar
Så for oss som ikke helt vet hva en pointer/peker nøyaktig er... Kan noen forklare det?

7218697[/snapback]

 

Trodde det kom helt klart fram i posten min tidligere jeg :D

 

Det kommer vel an på språk og OS hva det er i hvert tilfelle, men en pointer sånn kort forklart er : en adresse til et minneområde i maskinen.

 

Det som er så spennende med en pointer er at man kan dele dette "området" i minnet med andre funksjoner/ algortimer i programmet ditt, og denne funksjonen/algoritmen kan SELV forandre verdien, OG/ELLER selve adressen den peker på.

 

Det er (eller "var" siden man i nyere språk har tatt seg av alt dette i compileren/frameworket) til stor fordel når man vil lage samlinger av objekter (som arrays o.l.), (-snip- fjernet denne siden den kan gjøre ting uklart mtp "pass-by-reference"-snip-) og organisere et objekt-tre i minnet f.eks.

 

Håper det hjalp litt...er vel bare å søke på "pointer faq C++" i google så kommer det vel opp en haug med bedre forklaringer.

Endret av Fangs78
Lenke til kommentar
Bra med en strukturert liten guide om hver ting i php. Gleder meg til din versjon av OOP. De jeg fant på nett var rotete og knotete og uforståelige... bare for å øke forventningspresset på deg litt ;)

7220580[/snapback]

 

Hehe... Håper eg klarer å innfri. Neste kapittel blir mottak og behandling av brukerdata, og sannsynligvis OOP etterpå der. Men det tar litt tid å skrive, at desse to kom ut så kort tid etter kvarandre var fordi eg skreiv kapittel 5 først, men så bestemte meg for at det kanskje var lurt å ha gått gjennom arrays først... :)

Lenke til kommentar
Lenge til vi begynner på MySQL-delen og koblingen til php? Det er det jeg trenger øving på..

7215524[/snapback]

 

En veldig god ressurs rundt php er http://phpbuilder.com/board/

Man pleier å få veldig raskt svar på problemer, og det er en enorm menge poster så med litt søking så pleier man å finne svar på det meste.

 

Ellers så syntes jeg http://www.w3schools.com/php/default.asp er en ganske nyttig side som jeg bruker ofte når jeg lurer på ting. Syntes det er litt enklere å finne frem til hvilke funksjoner jeg trenger der enn på http://www.php.net (men bruker selvfølgelig denne også).

Lenke til kommentar
Hehe... Håper eg klarer å innfri. Neste kapittel blir mottak og behandling av brukerdata, og sannsynligvis OOP etterpå der. Men det tar litt tid å skrive, at desse to kom ut så kort tid etter kvarandre var fordi eg skreiv kapittel 5 først, men så bestemte meg for at det kanskje var lurt å ha gått gjennom arrays først... :)

Da håper jeg at du tar for deg fellene ved håndtering av variabler, og at man ikke bør gjøre ting som include($_GET["side"]), exec($_REQUEST["kommando"]), samt ymse andre tilsvarende problemer.

 

Dette er noe nybegynnere i PHP-programmering dummer seg ut i stadig vekk, og det er dårlig belyst i svært mange kurs og annen opplæring.

 

Som tidligere vil jeg igjen anbefale Innocent Code av Sverre Huseby.

 

Hvis du bor i Oslo, så kan du få låne mitt eksemplar om du ikke allerede har det selv.

Lenke til kommentar

Sikkert mer enn nok av ideer til denne artikkelserien allerede, men jeg lager en liten ønskeliste likevel:

  • Gjennomgang av IDE's (PHPEclipse + plugins, Zend, etc, ikke bare enkle teksteditorer)
  • Sammenligning av applikasjonsrammeverk (Solar, CakePHP, P4A, Prado, Zend, etc)
  • Sammenligning av template-systemer (Smarty, Savant, Flexy, etc)
  • PEAR og evt. PECL (akkurat dette føler jeg er litt viktig, folk flest aner ikke hvor mange av problemene deres som kan løses kjapt og enkelt med dette biblioteket)

Disse emnene blir meget interessante når man har kommet seg over nybegynnerstadiet. Hadde vært knall med en artikkel eller to rundt dette :)

Lenke til kommentar

En ting å tenke på i PHP, som jeg ser forfatteren av artikelen kanskje heller ikke har vurdert, er å ikke bruke dobble sitat-tegn (") i strenger med tekst & variabler. Årsaken er at dette er mye treigere enn å bruke enke sitat-tegn (').

 

For å teste, så laget jeg med ett lite script:

<?php


function microtime_float()
{
  list($usec, $sec) = explode(" ", microtime());
  return ((float)$usec + (float)$sec);
}

/**
* Test performance of single vs double quotes
*
* @param bool $double
* @param int $loop
*/
function test_speed($double = false, $loop = 0) {

$result = array();

for($i=0; $i < $loop; $i++) {
 $time = time();
 $microtime = microtime_float();

 $time_start = microtime_float();

 for($ii=0; $ii < 1000000; $ii++) {
 	$var[] = ($double) ? "This test was started at $time ($microtime)" : 'This test was started at '.$time.' ('.$microtime.')';
 }

 $time_end = microtime_float();
 $time = $time_end - $time_start;

 $result[$i+1] = $time;
}

$quotes = ($double) ? 'double' : 'single';

echo 'Time taken with '.$quotes.' quotes:<br />';

foreach ($result as $key => $value) {
 echo ($key).' : '.$value.'<br />';
}

}

test_speed(false, 5); // Single
test_speed(true, 5); // Double

?>

 

Her er resultatet:

Time taken with single quotes:
1 : 5.74370908737
2 : 5.70529007912
3 : 5.89124107361
4 : 5.42553114891
5 : 6.39423799515
Time taken with double quotes:
1 : 7.82924795151
2 : 7.80135393143
3 : 8.10489392281
4 : 7.66670608521
5 : 8.62187695503

 

Som dere ser, så er det mye mere effektivt å skrive f.eks.:

$var = 'Dette er en streng';

enn:

$var = "Dette er en streng";

 

Noe å tenke på kanskje? :)

Lenke til kommentar

Så vidt jeg vet kan du ikke bruke escape char, f.eks \n, i single quotes.

echo 'dette funker ikke\n';
echo "dette funker\n";
echo 'og dette funker'."\n";

 

Kan være at det er mere effektivt å bruke single quotes, men du looper en million ganger, vet ikke hvor ofte man får behov for slikt. Virker på meg som dette blir litt mer teoretisk effektivitet enn man vil merke i daglig bruk. Men er langt fra noen ekspert i PHP, begynte å lære meg det for ca 2-3 månder siden.

Leste også en artikkel om at funksjoner også er ganske resursskrevende når de blir kjørt i samme type test, tror det var en 400 000 ganger loop, forskjellen på å utføre samme oppgave med en funksjon og uten var 5-15 sekunder (husker ikke helt nøyaktig).

Lenke til kommentar
Så vidt jeg vet kan du ikke bruke escape char, f.eks \n, i single quotes.

echo 'dette funker ikke\n';
echo "dette funker\n";
echo 'og dette funker'."\n";

 

Kan være at det er mere effektivt å bruke single quotes, men du looper en million ganger, vet ikke hvor ofte man får behov for slikt. Virker på meg som dette blir litt mer teoretisk effektivitet enn man vil merke i daglig bruk. Men er langt fra noen ekspert i PHP, begynte å lære meg det for ca 2-3 månder siden.

Leste også en artikkel om at funksjoner også er ganske resursskrevende når de blir kjørt i samme type test, tror det var en 400 000 ganger loop, forskjellen på å utføre samme oppgave med en funksjon og uten var 5-15 sekunder (husker ikke helt nøyaktig).

7237817[/snapback]

 

Jeg kjørte loopen så mange ganger slik at det ble enklere å virkelig se forskjellen. Selvfølgelig vil nok ikke de fleste generere ett array på 1 000 000, men tenk deg at du jobber med ett større prosjekt som f.eks. ett forum (tenk vBulletin eller Invision). Hvis alle strengene etc. i hele prosjektet da var laget med double quotes ville du nok ganske sikkert merket ganske stor forskjell i ytelse.

 

Nei, escape chars vil måtte stå i double quotes som du helt riktig påpeker, men som du viste over så er dette ikke noe problem å omgå. Det er stor forskjell på å bruke double quotes kun på \t , \n etc. , og å bruke det på hele strengen.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...