Guide:
Introduksjon til PHP
PHP er per idag det mest kjente, og muligens mest brukte, språket for dynamisk formatering av websider på internett. Det er et språk med mange muligheter, og er noe du bør kunne hvis du driver med seriøs webutvikling. Vi vil her prøve å gi en liten smakebit på språket.
Side 1: Historie
Historie
PHP (PHP Hypertext Preprocessor) startet sitt liv i 1994 da Rasmus Lerdorf trengte en enklere måte å holde kontroll på brukerene som var innom siden hans. I skrivende øyeblikk er PHP påvei inn i femte versjon med introduksjonen av PHP 5.0 Beta 4. Og populariteten til PHP er stigende. Statistikk på sidene til PHP viser at det er hele 15.2 millioner domener som bruker PHP, og 1.3 millioner IP addresser. Store tall for åpen kildekode.
Hvorfor PHP?
Mange spør seg hvorfor de i det hele tatt skal gidde å lære seg PHP. Holder det ikke HTML? Det er vel og bra med HTML, og du bør abolutt kunne det når du driver med PHP. Men bare HTML skaper som regel utrolig kjedlige sider. Med PHP får du muligheten til å kunne knytte HTML-en din opp mot databaser, la brukeren gi tilbakemeldinger, kunne kjøre forum og andre interaktive tjenester.
PHP er også et meget enkelt språk å lære basisen i. Har du programmert noe som helst før er det omtrent bare variabler som vil overaske deg litt. Det å slippe å deklarere dem er både en drøm og et lite helvete, men alt i alt så er det meget enkelt.
Alternativer
Selvsagt fins det gode alternativer til PHP. Utallige språk har vært brukt til CGI, hvorav Perl sannsynligvis har vært det mest populære. Sun har selvsagt prøvd å komme på banen med Java Servlets. Men per idag er det nok ASP fra Microsoft som er den mest populære motstanderen.
Selv om ASP likner veldig på PHP er det mange grunner til å velge PHP over ASP:
- Gratis
- Åpen kildekode
- Enkelt
Hva trengs
En webserver med PHP installert og gjort tilgjengelig. De fleste som leier ut webhoteller har støtte for PHP. Informasjon om dette finner du som regel på sidene til webhotellet. Det finnes også utallige gratistjenester der ute slik at du får testet skriptene dine.
Hva må jeg gjøre
For at webserveren skal kunne kjøre en fil som et PHP skript må den normalt sett ha en spesiell filtype. Vanligvis er dette '.php', men serveren kan innstilles til å godta en hvilken som helst filtype, så dette er noe du må sjekke med leverandøren din
Det holder ikke at filen din er av rett filtype. Alle filer tolkes innledningsvis som HTML filer av webserveren, så du må 'gå i PHP modus' for å kjøre et PHP skript. Dette gjør du ved å skrive <?php eller <? om ASP tagger aksepteres av serveren (denne formen anbefales ikke å bruke da ikke alle servere aksepterer denne formen for tagger). Når du skal ut av PHP modus bruker du ?>-taggen. Du kan gå inn og ut av PHP modus så mange ganger du vil i løpet av en fil, og inkludere så mye annet du vil i mellom, men har du gått inn i PHP modus må du gå ut igjen.
Side 2: Hello World
Hello World
Hello World med varianter er sannsynligvis historiens mest implementerte program. Det brukes som regel til å teste om du har fått installert alt korrekt, i tillegg til at du lærer de mest grunnleggende tingene om språket. Så her følger en versjon av "Hello World" for PHP:
<?php
$skriv = "Hello World";
echo "<html>\n";
echo "<head>\n";
echo "<title>Hello World</title>\n";
echo "</head>\n";
echo "<body>\n";
echo "<p>$skriv</p>\n";
echo "</body>\n";
echo "</html>\n";
?>
Om du lagrer dette i filen hello.php og kjører det på en maskin som støtter PHP bør du få et resultat som ligner på dette.
Alternativer
Dette er selvsagt ikke eneste måten å implementere Hello World på. Her kommer et alternativ som bruker en form for syntaks som kalles heredoc på tekststrenger.
<?php
$skriv = "Hello World";
echo <<<EOS
<html>
<head>
<title>Hello World</title>
</head>
<body>
<p>$skriv</p>
</body>
</html>
EOS;
?>
Fordelen med denne stilen er det at en kan bruke HTML direkte, i tillegg til at koden får et mye penere utseende. Resultatet kan sees her.
Heredoc
Siden heredoc syntaks ikke er den mest brukte er det kanskje på plass med en liten beskrivelse av hvordan det fungerer. Å starte heredoc er ikke vansklig. Det er bare å skrive <<<navn. All påfølgende kode frem til heredoc avsluttes tolkes som det står. Eneste som endres er at variabler tolkes. Til og med tabeller. Men har du flerdimensjonale tabeller bør du sette dem inn som følger: {$tabell[0][1]}. Dette grunnet at ikke alle versjoner av PHP tolker tabeller inne i tekst likt. En avslutter heredoc ved å skrive navn om igjen, helt på starten av en ny linje.
Et eksempel på heredoc er:
<? $a = array (array ("test"));
$b = 5;
echo <<<EOS
<html>
<head>
<title>{$a[0][0]}</title>
</head>
<body>Dette er en heredoc test b = $b</body>
</html>
EOS;
?>
Dette skal ende opp i følgende utskrift:
<html>
<head>
<title>test</title>
</head>
<body>Dette er en heredoc test b = 5</body>
</html>
Det er tre ting som er veldig viktig å få med seg når man benytter seg av heredoc og det er:
- Ikke skriv noe som helst mer på den linjen du åpner heredoc-en på
- Alltid avslutt en heredoc seksjon HELT på starten av linja
- Ikke skriv noe som helst mer enn navnet på heredoc seksjonen du skal avslutte og et semikolon på siste linja
\" når du trenger dette inne i en tekststreng.
Et lite eksempel som benytter heredoc for å tegne opp et nummerert rutemønster.
<?php
echo <<<HEAD
<html>
<head>
<title>Rutemønster</title>
</head>
<body>
<table border="1">
HEAD;
for ($i = 0; $i < 10; $i++)
{
echo <<<ROW
<tr>
ROW;
for ($j = 0; $j < 10; $j++)
{
$cell = <<<CELL
<td name="$i$j">[$i, $j]</td>
CELL;
echo $cell;
}
echo "<tr>\n";
}
echo <<<END
</table>
</body>
</html>
END;
?>
Resultatet av dette kan du se her.
Side 3: Variabler
Variabler
Alle variabler i PHP er dynamiske. Det vil si at du kan tilordne en tekststreng i det ene øyeblikket, og et tall i neste. Du trenger dermed heller ikke å deklarere variabler før du bruker dem. Fordelene med dette er mange. Personlig må jeg få si at jeg skulle ønske at man hadde mulighet til å tvinge inn typedeklarerering slik som i Visual Basic. Dette er noe en venner seg til å bruke.
En annen viktig ting å få med seg når det gjelder PHP variabler er det at de må starte med $. Og så lenge du holder deg til tall og bokstaver har i alle fall ikke jeg sett noen begrensninger på variabelnavn.
Enkle variabler
Under denne definisjonen finner du tekststrenger og tall. Måten en deklarerer disse på er ganske enkelt og greit:
$tall = 1; $flyttall = 1.2; $tekst = "Test";
Manipulasjon er også enkelt. Eneste en må passe på er at man bruker '.' istedefor '+' til å slå sammen tekststrenger.
$tall1 = 1; $tall2 = 2; $tall3 = $tall1 + $tall2 + 1; $flyttall1 = 1.2; $flyttall2 = 0.5; $flyttall3 = $flyttall1 + $flytttall2; $tekst = "$tall1 + $tall2 + 1 = $tall3"; $tekst = $tekst . "$flyttall1 + $flyttall2 = $flyttall3";
I eksemplet kan man også se en annen morsom ting med PHP og tekststrenger. Variabler kan settes rett inn i teksten. Helt uten problemer. Til og med tabeller kan settes inn, men da bør en bruke '{}' rundt for å sikre kompatibilitet, særlig om du har en flerdimensjonell tabell.
Tabeller
Tabeller i PHP er assosiative. Det vil si at du kan bruke både tall og tekst som indeks til en tabell. Om du ikke spesifiserer noe bruker PHP tall nummerert fra 0 og oppover. Men følgende er også god kode:
$tabell = $array ("en", "to", 3, "fire", 5.0, $mysqlresultat);
$tabell[] = 7;
$tabell["test"] = 8;
$tabell[7] = 9;
$tabell[6] inneholder nå tallet 7. $tabell[5] inneholder referansen til et resultat på en mysql spørring. $tabell["test"] inneholder tallet 8.
Det finnes mange array-spesifikke funksjoner. En liste over disse kan finnes her.
Klasser
Alle som har kodet i objekt orienterte språk har vært borti klasser av en eller annen form. Klasser i PHP fungerer på mange måter som i Java og C++. Men det er ikke en riktig "voksen" implementasjon av klasser enda, og klasser er normalt sett ikke noe man trenger i enkle skript til en enkel, dynamisk hjemmeside, så dette er all omtalen de får i denne artikkelen.
Ressurser
PHP støtter også noe de kaller ressurser. Dette er bindinger mot eksterne programmer og ressurser. Den mest vanlige formen for ressurser er resultater fra databasespørringer. Dette blir behandlet litt senere i denne innføringen.
Variabel funksjoner
Det finnes et stort antall funksjoner for å evaluere innholdet i variabler. På websidene til PHP finner du en oversikt over de fleste.
Side 4: Superglobale variabler
Superglobale variabler
PHP har 9 "suberglobale variabler" som ble introdusert i PHP 4.1. Dette er tabeller som inneholder variabler fra forskjellige kilder. Disse er:
- $_SERVER
- $_ENV
- $_COOKIE
- $_GET
- $_POST
- $_FILES
- $_REQUEST
- $_SESSION
- $GLOBALS
$_GET og $_POST, med $_COOKIE og $_SESSION på god tredjeplass. Grunnen til at man har disse superglobale variablene er at en gjerne vil at utviklere skal kode sikrere. Før PHP 4.2 stod alltid register_globals på On i php.ini. Dette betyr at alle variabler som kommer fra skjemaer automatisk blir gjort tilgjengelig i skriptet ditt med navnet. Et eksempel på dette vil være koden
<form action="test.php" method="post">
<input name="test" type="text" />
<input type="submit" />
</form>
Hvis register_globals er satt til On vil det automatisk bli laget en variabel med navn $test i test.php. Dette er et potensielt enormt sikkerhetsproblem. Om en ved et uhell gjør som følger:
<form action="test.php?test=hei" method="post">
<input name="test" type="text" />
<input type="submit" />
</form>
vil en plutselig ha en variabel sendt via POST og en via GET som heter det samme. Hvilken skal en bruke? Det er dermed mulig å deklarere rekkefølgen som POST, GET og andre variabler blir lest. Den som leses sist brukes. Men vanligvis er det en grunn til at du har begge der. Du vil bruke dem selv om du var litt uheldig med navngiving. Og det er nettopp her de superglobale variablene kommer inn.
Tilgjengelighet
Alle de superglobale variablene er tilgjengelige hvor som helst i skriptet ditt. Ingenting kan hindre deg i å bruke en superglobal variabel.
I bruk
Sett at du har følgende kode:
<form action="test.php?test=hei" method="post">
<input name="test" type="text" />
<input type="submit" />
</form>
Du har her to konkurerende variabler med navn test. En som kommer inn via addresselinja (GET) og en som kommer inn via et postet skjema (POST). For å unngå all tvil om hvor disse mottas av skriptet legges de inn i tabellene til $_POST og $_GET med indeksen test. For da å f.eks. skrive ut begge kan du gjøre noe slikt:
<?php
echo "Post er {$_POST['test']}<br />";
echo "Get er {$_GET['test']}<br />";
echo "test er $test <br />";
?>
Dette skriptet kan du teste med register_globals til OFF her. Et eksempel med register_globals satt til ON kan sees her.
En oversikt og beskrivelse av alle de superglobale variablene kan du finne her.
Side 5: Kontrollstrukturer
Kontrollstrukturer
PHP har en rekke med kontrollstrukturer. Følgende er innebygd i PHP:
| Struktur | Hva | Bruk |
| if | Undersøker om kodesegment skal kjøres eller ikke. | if ($a == 2)
{ $a = 3; } |
| elseif | Om ikke første 'if' slår til undersøker vi på nye premisser. | if ($a == 2)
{ $a = 3; }
elseif ($a == 4)
{ $a = 5; } |
| else | Om ingen tidligere 'if' har slått til kjøres denne. | if ($a == 2)
{ $a = 3; }
elseif ($a == 4)
{ $a = 5; }
else
{ $a = 7; } |
| while | Kjører så lenge sant. | while ($a < 10)
{ $a++; } |
| do...while | Kjører først en gang og fortsetter så lenge uttrykket til slutt evalueres til sant | $a = 11;
do
{
$a++;
} while ($a < 10); |
| for | for (start; slutt; steg) Kjører fra start kondisjonen og så lenge slutt evaluerer til sant med steg mellom hver runde. Alle tre uttrykk kan utelates. |
for ($i = 2; $i < 30; $i++)
{
$tabell[$i] = $tabell[$i - 1] +
$tabell[$i - 2]
} |
| foreach | foreach ($stor as $liten) Går igjenom alle elementene i en tabell. |
$a = array ("en", "to", "tre");
foreach ($a as $b)
{
echo "$b<br />";
} |
| break | Hopper ut et nivå fra løkke strukturene (for, while, do...while, switch, foreach) | while (1)
{
break;
} |
| continue | Avbryter kjøringen av løkken og hopper til neste element. | $i = 0;
//skriver kun ut oddetall
while ($i < 100)
{
$i++;
if ($i % 2 == 0)
{
continue;
}
echo $i;
} |
| switch | Kjører en av flere 'case'-er. Kjører kun den 'case'-en som oppfyller betingelsene. | $i = 2;
switch ($i)
{
case 1:
echo "en";
break;
case 2:
echo "to";
break;
case 3:
case 4:
default:
echo "mange";
break;
} |
| return | Hva som skal returneres fra en funksjon. | return $a; |
I tillegg finnes include/include_once og require/require_once som blir beskrevet på en senere side, og declare som hovedsaklig brukes til effektivitetstesting. Bruk av declare kan du lese om på PHP sine sider.
Alternativ skrivemåte
PHP har også støtte for en alternativ skrivemåte som kan være veldig oversiktlig om du bytter masse mellom HTML og PHP modus. Beskrivelse av denne finner du her.
Side 6: Funksjoner
Funksjoner
Det å definere en funksjon i PHP er lett. Ved å skrive function test (param1) har du definert funksjonen test med en inngangsparameter. Å gjøre funksjonskall er like enkelt. test ("hallo"); gjennomfører et kall til funksjonen.
Retur
Hva returnerer en funksjon? Siden PHP er typeløst kan du returnere praktisk talt hva som helst. Null begrensninger. Måten du returnerer er kort og godt ved å skrive return $test;.
Variabel tilgang
Variabel tilgang er noe av det første man ofte merker seg som virkelig merkelig i PHP. Fra de aller fleste store språk er man vant til å ha tilgang til variabler deklarert utenfor en funksjon slik som dette:
<?php
$var1 = "test";
function test ()
{
if (isset ($var1))
{
echo "Var1 er satt til $var1";
}
else
{
echo "Var1 er IKKE satt";
}
}
test ();
?>
I C/C++, Java etc forventer du å se utskriften "Var1 er satt til test". I PHP derimot får du nå "Var1 er IKKE satt". For å komme rundt dette må variabler som skal kunnes defineres utenfor en funksjon og brukes og enderes inni gjøres tilgjengelige. Dette gjøres ved å skrive global etterfulgt av de variablene du vil bruke. For å få forrige eksempel til å skrive ut "Var1 er satt til test" må vi ende scriptet til følgende:
<?php
$var1 = "test";
function test ()
{
global $var1;
if (isset ($var1))
{
echo "Var1 er satt til $var1";
}
else
{
echo "Var1 er IKKE satt";
}
}
test ();
?>
Ikke store forskjellen, men det er nok utallige timer som er brukt på å rette opp på feil som kort og godt kommer av at variabler ikke er gjort tilgjengelig i funksjoner.
Det er gode grunner for at man i et skriptspråk som PHP benytter seg av denne måten å begrense tilgang til variabler deklarert utenfor funksjonen. Hvis en benytter seg av skript som en henter fra andre risikerer en at en funksjon benytter en variabel med samme navn som en variabel som brukes i skriptet som inkluderer den. Denne funksjonen måtte dermed ha sikret seg at den ikke endret noen ytre variabler. Det er mye enklere å måtte skrive global $var1; i toppen av funksjonen enn å måtte bruke midlertidige variabler for alle variabler du bruker for så å gjennopprette dem på slutten.
Nøsting
Grunnet PHP sin dynamiske tankegang og muligheten for å inludere andre filer hvor som helst støtter PHP nøsting av funksjoner. Følgende er tilatt i PHP:
<?php
$var1 = "test";
$var2 = "test2";
function test ()
{
global $var1;
function test2()
{
global $var1, $var2;
echo "Var1: $var1\n";
echo "Var2: $var2\n";
}
test2 ();
}
test ();
test2 ();
?>
Hvis du prøver å kjøre dette skriptet vil du se at test2 er definert både utenfor og inne i funksjonen test. test2 har heller ingen problemer med å få tilgang til $var2 selv om ikke test har tilgang til denne. I praksis er det ingen forskjell på å deklarere en funksjon inne i en funksjon eller utenfor. Tilgangen til den er samme uansett.
Side 7: Avansert om funksjoner
Avansert om funksjoner
Er du usikker på om en funksjon eksisterer? Og hva om du vil opprette en funksjon den mangler? Eller vil du kanskje la en bruker sende inn en funksjon å teste den på siden din? Alt dette er egentlig ganske enkelt i PHP.
<?php
$parametere = '$a';
$eksisterer_ikke = 'echo "$a eksisterer ikke";';
$funksjoner = array ("test1", "test2");
function test1 ($inn)
{
echo "$inn eksisterer.";
}
foreach ($funksjoner as $funk)
{
$gammelfunk = $funk;
if (!function_exists ($funk))
{
$funk = create_function ($parametere, $eksisterer_ikke);
}
call_user_func ($funk, $gammelfunk);
}
?>
Denne koden sjekker om en funksjon eksisterer eller ikke. Om funksjonen ikke eksisterer oppretter den en funksjon som sier at funksjonen ikke eksisterer. Til slutt kaller den funksjonen med navnet som parameter. Både funksjoner som allerede eksisterer og nyopprettede blir kalt. En ting som er viktig å merke seg er at både parameterlisten og koden som skal inn i create_function må settes inne i ' istedefor ". Dette grunnet at gåseøyne (") automatisk evaluerer innholdet mens en apostrof (') beholder innholdet bokstavlig. Flere funksjoner for funksjonsbehandling kan du finne her.
Side 8: Inkludering
Include
Når en utvikler en side ved hjelp av PHP ender en stadig opp i situasjonen at koden en bruker blir brukt flere steder, eller kanskje til og med utviklet av andre. Og selv på en liten side kan det bli nok kode til at en mister oversikten. Hvis du da forventer at koden skal trenge vedlikehold bør du øyeblikkelig dele den opp i flere filer og heller inkludere felles enheter. Det er alltid lettere å rette en feil et sted enn å rette den ti steder. Korrekturen er ikke alltid like rett alle steder.
Include/Include_once
Include og include_once er funksjonene som gir deg muligheten til å hente inn andre skript filer. Om filen som skal inkluderes ikke eksisterer returneres en feilkode. Her følger et enkelt eksempel på bruk av include:
test.inc
Dette er en test.<br />
includetest.php
<?php
for ($i = 0; $i < 10; $i++)
{
include ("test.inc");
}
?>
Dette skal ende opp i følgende utskrift:
Dette er en test. Dette er en test. Dette er en test. Dette er en test. Dette er en test. Dette er en test. Dette er en test. Dette er en test. Dette er en test. Dette er en test.
Om en istede vil forsikre seg om at en fil kun inkluderes en gang i et skript benytter en seg av include_once, som det følgende er et eksempel på:
includeoncetest.php
<?php
for ($i = 0; $i < 10; $i++)
{
include_once ("test.inc");
}
?>
Dette skal ende opp i følgende utskrift:
Dette er en test.
Fordelen med 'include_once' fremfor 'include' er når du skal inkludere PHP skript. Et PHP skript godtar ikke at du har flere funksjoner med samme navn, så du vil få en feilmelding om du ved et uhell skulle inkludere samme skriptet flere ganger.
Require/Require_once
Dette er egentlig helt samme funksjonene som include og include_once. Så lenge filen du ønsker er der er det ingen forskjell. Forskjellen oppstår når filen ikke er der. Mens 'include' kun indikerer at den mislyktes kaller 'require' det for en katastrofal feil og avslutter. Dette er veldig praktisk hvis en har funksjonalitet en absolutt må ha inn, som f.eks. brukervalidering. Litt kjedelig om en bruker skulle komme seg inn kun grunnet at validerings skriptet ditt har fått feil navn. Dette er også en feil som kan være vanskelig å lete fram.
File_exists
Hvis du vil slippe feilmeldingene til require, men ha like god sikkerhet, bør du sjekke om filen eksisterer først. Dette kan du gjøre ved å bruke file_exists sammen med en if test. F.eks. slik:
<?php
$inkfil = "test.php";
if (file_exists ($inkfil))
{
require_once ($inkfil);
}
else
{
require ("error.php");
}
?>
Her vil filen bli inkludert hvis den eksisterer, hvis ikke vil en feilmelding inkluderes istede. Legg merke til bruken av require_once for virkelig å sikre seg at filen blir inkludert.
Viktig
Enhver fil som inkluderes blir inkludert som om den er i HTML modus, så du må passe på å gå i PHP modus i enhver fil som skal tolkes som PHP for at den faktisk skal tolkes som dette.
Side 9: Konklusjon
Konklusjon
Jeg håper dette var en introduksjon som gav deg lyst til å se mer på PHP, da det er et spennende språk som er ganske enkelt å lære seg basisen til. PHP er også et språk som er under meget aktiv utvikling slik at støtte for nye standarder kommer veldig fort inn i språket. PHP har blandt annet flere intressante XML tolkere som vidreutvikles kontinuerlig. I versjon 5 av PHP er en av de store nyhetene en komplett omskriving av de allerede eksisterene XML modulene slik at de skal bli enda bedre.
Avslutningsvis vil jeg henvise folk til det eminente PHP forumet her på sourcecode.no. Det er mange der som er veldig flinke til det de driver med, så er det noe du lurer på er det bare å stille spørsmål.
Siste oppfordring
Kommenter all kode. Skal du kun kommentere ut deler av en linje bruker du //. Resten av linja blir da kommentert ut. Skal du kommentere ut flere linjer starter du med /* og avslutter med */. Enlinjes kommentarer kan stå inne i en flerlinjekommentar, men ikke prøv å sette inn en flerlinje kommentar inn i en annen flerlinje kommentar. Da får du feilmeldinger.