Denna sida innehåller första delen av lathunden för PHP. Här beskrivs det grundläggande om placering av PHP-kod och PHP:s syntax. PHP:s syntax påminner mycket om C/C++, Java och Perl samt fungerar på ett liknande sätt som ASP (liksom JSP om vi ska nämna förkortningar :-).
För en komplett beskrivning av PHP rekommenderas PHP-dokumentation på adressen www.php.net. Den finns att ladda ner som bl.a. en Windows-hjälpfil (.CHM).
Lathunden kommer göra referenser till språk som C, C++ och Java eftersom mycket av PHP:s syntax påminner om syntaxer i just dessa språk.
Tanken med denna sida var att göra en referenslista (lathund) för PHP - men det visade sig bli en lite väl omfattande lathund. :-) Därför har lathunden delats i två delar. Framöver kommer jag (antagligen) att göra exempel för de olika sakerna som finns på denna sida. (För den vetgiriga så innehöll denna webbsida ca. 930 rader med HTML-kod den 6/01-04.)
PHP-kod "bäddas in" (eng. is embedded) i HTML-kod mellan den öppnande taggen <?php och den avslutande taggen ?>. (Ibland kan andra taggar användas, bl.a. samma som i ASP.) PHP-taggarna kan förekomma flera gånger i HTML-koden, d.v.s. vi kan dela upp PHP-koden i flera olika delar.
<!-- Utanför PHP-taggar är det ren HTML-kod -->
<?php
//Här placeras koden
?>
<!-- Utanför PHP-taggar är det ren HTML-kod -->
PHP-koden mellan taggarna tolkas och exekveras (av den s.k. PHP-motorn) varje gång som en webbläsare begär PHP-sidan. Resultatet från exekveringen kommer infogas på den plats (i, vad jag kallar, den resulterande webbsidan) där PHP-koden finns. D.v.s. PHP-koden ersätts med resultatet från exekveringen av PHP-koden. Resultatet kan bestå av utskrifter, värdet på en variabel eller resultatet av ett funktionsanrop.
I exemplet nedan har PHP-koden markerats med gul bakgrund.
<p>Detta är ren HTML-kod</p>
<p>
<?php
$str = "Detta är PHP-kod";
print $str;
?>
</p>
<p>Detta är mer HTML-kod</p>
Resultatet från exekveringen ovan blir följande HTML-kod, d.v.s. den HTML-kod som skickas till besökarens webbläsare:
<p>Detta är ren HTML-kod</p>
<p>
Detta är PHP-kod
</p>
<p>Detta är mer HTML-kod</p>
PHP skiljer inte på gemener och versaler, d.v.s. är "case insensetive", förutom i variabelnamn.
Precis som i C/C++/Java så består PHP-kod av satser. En sats är någon form av exekvering som utförs och varje sats måste avslutas med ett semikolon (med några undantag :-). Även block fungerar som i C/C++/Java, d.v.s. innesluts inom "hakparenteser" ({ och }).
PHP använder både en- och flerradiga kommentarer. Enradiga kommentarer skrivs
efter ett två snedstreck (//
) eller "brädgård" (#
) och allt på
raden efter ett kommentarstecken kommer att bortses från av
PHP-motorn. Flerradiga kommentarer innesluts mellan öppnande /*
och
avslutande */
(och är bl.a. användbart för att "kommentera bort" kod).
Radera (eller ersätt) aldrig kod förrän du är
säker på att du inte behöver den - kommentera bort den istället. Även om
koden är felaktig så har den en "tanke", d.v.s. talar om vad du tänkt dig
göra.
Om du vill ändra i fungerande kod kan det vara en bra idé att ta en kopia
på koden och "kommentera bort" originalet samt ändra i kopian.
I exemplet nedan så har kommentarer markerats med fet stil.
<?php
$tal = 1 + 2; //Addition av två tal - 1 + 2
$strang = "En tuff sträng"; #En till
/* En kommentare
på flera rader */
?>
Variabler behöver inte deklareras i PHP, men alla variabler föregås av ett dollartecken ($). För att införa ("deklarera") en variabel så tilldelar vi bara variabeln ett värde.
$tal1 = 42;
$text1 = "En sträng";
Observera att detta gör att variabelnamn som stavas fel kan leda till att det blir svårt att hitta fel i PHP-kod! Den enda gången som PHP skiljer på gemener och versaler är i variabelnamn. Nedanstående variabler betraktas alltså som olika variabler.
$tal1 = 42;
$TaL1 = 37;
Det trevliga med att variabler använder dollartecken (före namnet på variabeln) är att de kan användas inuti strängar direkt (i.a.f. de med dubbla citattecken - se Strängar nedan). D.v.s. vi slipper slå samman (konkatinera) strängar med variabler (vilket kan skapa ganska "ful" kod). Detta fungerar dock inte alltid då vi vill indexera i (hämta ett värde från) en vektor (se mer under rubriken Vektorer (arrays) nedan).
I exempel nedan så infogas första variabeln (heltalet) i strängen som tilldelas till andra variabelns (strängen).
$tal1 = 42;
$text1 = "Svaret på allt är $tal1";
Strängen ($text1
) innehåller nu texten "Svaret på allt är 42"
.
PHP har inga egentliga datatyper, men man brukar ändå skilja på variabler som innehåller tal, strängar och vektorer (arrays). (Vektorer behandlas i ett eget avsnitt nedan.)
För att underlätta läsandet av PHP-kod så bör man använda prefix för att tala om vilken "datatyp" som lagras (eller är tänkt att lagras) i variabeln. Nedan visas en tabell med exempel på prefix och vilka motsvarande datatyper som de avser beteckna.
Prefix | Undertyp |
---|---|
str | sträng (string) |
int | heltal (integer) |
sng | decimaltal (single) |
dbl | decimaltal (double) |
bln | boolesk (boolean) |
obj | objekt (object) |
Strängar kan innesluts mellan både enkla och dubbla citattecken ('
resp. "), t.ex.
'Detta är en sträng'
resp. "Detta är en också sträng"
.
En escape-sekvens är ett bakåt snedstreck (backslash, \
) följt
av ytterligare ett tecken. Escape-sekvenser används t.ex. för att infoga
ett citattecken i en sträng (utan att för den sakens skull avsluta
strängen).
"Denna sträng \"innehåller\" citattecken"
ger
Denna sträng "innehåller" citattecken
Escape- sekvens | Betydelse |
---|---|
\" el. \' |
Infogar ett citattecken i sträng |
\n |
Ger radbrytning (i HTML-kod - använd
<br /> för att få en radbrytning i webbsida) |
\t |
Ger en tabb (i HTML-kod) |
\\ |
Infogar ett bakåt snedstreck (backslash, \ ) |
\$ |
Infogar ett dollartecken ($ ) |
Escape-sekvenser är främst användbara i strängar som innesluts inom
dubbla citattecken ("
). Samma gäller användandet av variabler i strängar.
När vi jobbar med tal i PHP så behöver vi inte tänka på att deklarera en variabel med tillräcklig kapacitet (t.ex. Integer eller Long) för att lagra talet i fråga. Det sköter PHP åt oss.
Decimaltal skrivs i PHP-kod (enligt amerikansk standard) med punkt,
t.ex. 3.14
. Vid utskrift kommer dock talet att
skrivas ut enligt landspecifikt format, t.ex. med ett kommatecken (3,14
)
på en svensk webbserver (???).
Observera att besökare med svenska webbläsare ska fylla i decimaltal med komma när dom fyller i ett formulär! (???)
Booleska variabler kan tilldelas något av de reserverade orden TRUE
eller
FALSE
.
Tilldelning av objekt sker på samma sätt som de primitiva (enkla) värdena.
En vektorvariabel skiljer sig från en vanlig variabel genom att den alltid följs av ett "hakparentespar" ([]). Precis som inte vanliga variabler behöver deklareras så behöver inte heller vektorer (arrays) heller deklareras. Inte heller behöver vi skapa skapa vektorer innan vi kan tilldela värden till dem (även om detta också fungerar :-).
En skillnad mot vanliga programmeringsspråk (men inte skriptspråk) är att vi kan lagra värden av olika typer i en vektor. Ytterligare en skillnad är att vi kan använda både heltal och strängar som index i vektor - t.o.m. i samma vektor.
För att skapa en vektor så tilldelar vi helt enkelt ett värde till en vektorvariabel.
$arrTal[] = 1; //index = 0
$arrTal[] = 1;
$arrTal[] = 1;
$arrTal[] = 1; //index = 3
Vektor i exempel kommer att få index med början på 1. Efterföljande index kommer ha index +1 från högsta index i vektor. D.v.s. eftersom vektor är tom första gången så kommer högsta index vara "-1" och första positionen kommer få index 0.
Vi kan också ange index som värden ska ha, d.v.s. index behöver inte vara ordnade eller efter varandra följande värden (d.v.s. sekventiella som 1, 2, 3, ...).
$arrTal[3] = 1;
$arrTal[6] = 2;
$arrTal[2] = 3;
$arrTal[1] = 4;
I exempel ovan så kommer första positionen i vektorn ha index 3 samt efterföljande index vara 6, 2 och 1.
Observera att vi inte kan använda en "klassisk" for-loop (med en räknare som $i) för att loopa över en vektor med icke-sekventiella index. Istället måste vi t.ex. använda foreach-loop (se mer under Kontrollstrukturer nedan).
Vi kan även använda strängar som index i vektorer - vad som ibland även kallas associativa vektorer (ett namn har associerats med värdet i vektorn).
$arrTal["ett"] = 1;
$arrTal["två"] = 2;
$arrTal["femtitvå"] = 3;
$arrTal["sture"] = 4;
Exempel ovan talar för sig själv. :-)
>Exempel 3 - ännu mer vektorer
Denna typ av index är något som vi bl.a. kan använda oss av då vi hämta poster från en databas och vill använda kolumnnamnen för att hämta värden från posterna.
Observera att vi inte heller här kan använda en for-loop.
Ovanstående beskrivning av vektorer (arrays) är en del av de sätt som vektorer kan manipuleras. Se PHP-manual för en komplett beskrivning. För funktioner som opererar på vektorer - se del 2 av lathund.
Till början på sida
Utskrifter till den resulterande webbsidan (HTML-dokumentet) kan ske på två sätt:
Det vanligaste sättet att skriva till den resulterande webbsidan är att använda "funktionen" print(). "Funktionen" kan anropas med eller utan parenteser kring argumenten. Som enda argument tar metoden en sträng - en sträng som kan vara sammanfogad av både strängar och andra värden. PHP kommer automatiskt konvertera t.ex. tal till strängar för utskrift.
<?php
print "Hej hela världen. ";
print("Klockan är nu: " . date("H:i");
?>
Resultatet från de två raderna ovan kommer bli "Hej hela världen. Klockan är nu XX:XX".
För att sammanfoga två strängar används
punktoperatorn (.
) och för att erhålla tiden så används funktionen
date()
(se även kommande avsnitt).
print
är egentligen inte en funktion utan en del av PHP:s språk.
"Funktionen" echo()
fungerar som "funktionen"
print()
med skillnaden att vi kan skicka flera argument till metoden
(d.v.s. inte bara en sträng). Resultaten från både print()
och
echo()
är i stort sett de samma.
<?php
echo "Hej hela världen. ";
echo("Klockan är nu: ", date("H:i"));
?>
Resultatet från de två raderna ovan kommer bli "Hej hela världen. Klockan är nu XX:XX".
Observera att inga mellanrum infogas mellan parametrarna! I exemplet ovan har ett mellanslag placerats sist i båda strängar för att erhålla "rätt" resultat.
echo
är egentligen inte en funktion utan en del av PHP:s språk.
Funktionen printf()
fungerar på ett liknande sätt som i C/C++. Vi kan
bl.a. styra
Syntaxen för printf()
är
printf(format_sträng, arg1, arg2, ...);
Se PHP-dokumentationen för en beskrivning för nu... (Jag kommer ev. i
framtiden att göra en beskrivning). printf()
är en funktion. :-)
Ibland vill vi bara skriva ut ett värde (i t.ex. en variabel) samt resultatet från ett funktionsanrop eller en sats. Då kan vi använda en "genväg" (kallat inline på engelska). Vi använder oss av likhetstecknet för att skriva ut enligt följande exempel:
Lite text <?php =sats ?> och mer text
Observera att endast ett värde kan skrivas ut åt gången och att likhetstecknet (=) måste skrivas direkt efter frågetecknet (utan mellanslag)! Vill vi skriva ut flera värden så måste vi innesluta respektive sats med PHP-taggar eller använda någon av "funktionerna" ovan.
<head>
<?php
$intTal = 5
?>
</head>
<body>
<p>Talet är <?php =$intTal ?>.</p>
</body>
Resultatet (i webbläsare) från dessa rader ovan blir "Talet är 5".
Exempel 1.1 - utskrift (igen!)
Det kan ibland vara praktiskt att samla all exekvering i början på en webbsida och spara eventuella resultat i variabler för att skriva ut variablerna med denna genväg. Detta brukar göra både PHP- och HTML-koden lättare att läsa samt underhålla.
Till början på sida
Nedan listas de olika typerna av operatorer som finns i PHP. Sist i detta avsnitt visas en tabell med operatorprioritet.
Tilldelning sker med likhetstecknet (=
)
$intTal1 = 5;
Operatorerna är de samma som i många andra språk, d.v.s. följande:
+, -, *, /
- de fyra räknesätten%
- modulusdivision; returnerar resten efter heltalsdivision.-
- negering (unärt minus).$intTal1 = 1 + 2 * 3 / 4;
Division resulterar i decimaltal, även om båda operander är heltal.
Operatorerna har de "vanliga" prioriteterna som i de flesta språk (se nedan).
För att sammanfoga två strängar (konkatinera) använder vi punktoperatorn (.
)
$strText1 = "Lite text" . " och lite text till";
Använder vi plustecken av misstag så kommer variabel att innehålla en 0:a (d.v.s. om utskrift av en sträng blir 0 så kan vi vid felsökning leta efter plustecken :-).
==
- likhetsjämförelse!=, <>
- skilt från; jämför om operanderna inte är lika<
- mindre än>
- större än<=
- mindre än eller lika>=
- större än eller lika===
- identitet!==
- icke identitet1 != 2 //Ger resultatet TRUE
PHP stödjer två skilt från-operatorer: != och <>. Likhet i PHP innebär att två värden är lika - oavsett vilken datatyp värdena är. Identitet innebär att två värden är lika och har samma datatyp.
1 == "1"
1 == 1.0
1 == "1.0"
1 === 1
Alla fyra ovanstående uttryck är sanna.
&&
eller And
- logiskt och||
eller Or
- logiskt eller!
- logiskt icke; returnerar motsatsen (sant om falskt och
tvärtom)1 != 2 && 1 < 2 //Ger resultatet TRUE
Skillnaden mellan operatorerna &&
och ||
samt and
och or
är att de två senare har lägre prioritet.
Nedan visas en tabell med operatorernas prioritet. Operatorer överst tar prioritet över de nedanför och de längst till vänster på samma rad har högre prioritet än de längre till höger.
högst | !, - (unär), *, /, %, +, - (binär), . |
&&, || |
|
<, >, <=, >=, ==, != |
|
lägst | and, xor, or |
Till början på sida
if-/switch-satser, funktioner och loopar fungerar ungefär som i
C/C++/Java. Satser kan "ersättas" med block, d.v.s. flera satser
inneslutna av "hakparenteserna" {
och }
.
Loopar presenteras i nästa avsnitt.
I elseif-grenen kan elseif skrivas som ett eller två ord, d.v.s. som elseif
eller som else if
. Det första sättet är att föredra för att minska
felaktigheter.
if(villkor)
satser;
[ elseif(villkor2)
satser;
...
... ]
[else
satser; ]
$intTimme = date("h");
if($intTimme < 12)
print "God morgon";
elseif($intTimme < 18)
print "God middag";
else
print "God kväll";
I motsats till språk som C/C++/Java så kan värden i en switch-sats i PHP även vara strängar (d.v.s. inte bara heltal).
switch(värde_att_jämföra)
{
case värde1:
satser;
break;
case värde2:
satser;
break;
...
...
[ default:
satser;
break; ]
}
$intTimme = date("h");
switch($intTimme)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
print "God morgon";
break;
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
print "God middag";
break;
default:
print "God kväll";
break;
}
Ovanstående exempel visar även på att det finns tillfällen då if-satser är bättre än switch-satser. :-)
För att skapa en funktion så använder vi det reserverade ordet function följt av funktionens namn och eventuella parametrar. Vi anger inga datatyper för parametrar till funktioner - endast namn på parametrarna. Inte heller för funktionens eventuella returvärde anges datatyp.
För att returnera ett returvärde så använder vi det reserverade ordet return följt av returvärdet.
function funktionsnamn([ param1, param2, ... ])
{
satser;
[ return returvärde; ]
}
function addera(tal1, tal2)
{
return tal1 + tal2;
}
Till början på sida
Loopar är egentligen också de kontrollstrukturer, men p.g.a. avsnittens (detta och föregåendes) omfattning så har det fått ett eget avsnitt.
Observera att det är extra noga att du kontrollera att villkoret som avbryter loopar verkligen kommer att bli sant (någon gång). Det finns nämligen inget sätt att avbryta exekveringen av oändliga loopar annat än att låta den tillåtna tiden för PHP-sidor ta slut (ligger mellan 1-3 minuter). Skälet till detta är att PHP-sidan exekverar på servern som utvecklare inte brukar ha tillgång till. Under tiden som loopen exekverar så är det ganska troligt att graden av CPU-utnyttjande uppgår till 100% (i.a.f. i ett system med bara en CPU)!
for(initiering; slutvillkor; uppräkning)
satser;
I nedanstående exempel utförs loopen 10 gånger och skriver ut strängen "Talet är: XX" i varje iteration. På första raden initieras variabeln $varTal till 1 - variabel som används för att bl.a. avbryta loopen då variabelns värde överstiger 10. Observera hur vi kan infoga variabeln direkt i strängen som skrivs ut utan att sammanfoga variabeln med två strängar (en på var sida om variabeln).
for($varTal = 1; $varTal <= 10; $varTal++)
print "Talet är: $varTal <BR>";
foreach-loopen används för att loopa över en vektor, d.v.s. att utföra loopen en gång för varje position i vektorn. Det finns (minst?) två versioner: en där man endast använder sig av värdet och en där man är intresserad av både värdet och index (nyckel).
foreach($arrVektor as $varde)
satser;
foreach ($arr as $key => $value)
print "Key: $key; Value: $value<br>\n";
$arrVektor[] = array(21, 22, 23);
foreach($arrVektor as $varde)
print "$varde | ";
foreach ($arrVektor as $nyckel => $varde)
print "$nyckel : $varde<br>\n";
Exempel kontrollstrukturer 1.1
Denna loop loopar så länge villkoret på första raden är sant.
while(villkor)
satser;
$intTal = 0;
while($intTal < 10)
{
print "Talet är: $intTal <BR>";
$intTal++;
}
Exempel kontrollstrukturer 1.1 (igen)
Denna loop loopar så länge villkoret på sista raden är sant. Skillnaden mellan do...while och while är att den första utförs minst en gång och den senare endast om villkoret är sant från början.
do
satser;
while(villkor);
$intTal = 0
do
{
print "Talet är: $intTal <br />";
$intTal++;
} while(intTal < 10);
Exempel kontrollstrukturer 1.1
Precis som i C/C++/Java så kan vi använda de reserverade ordet break
för att avsluta en loop och continue
för att avsluta aktuell iteration
(för att börja med nästa).
$intTimme = date("H");
for($varTal = 0; $varTal < 24; $varTal++)
{
if($intTimme == $varTal)
break;
print "$varTal | ";
}
print "Timme är: $intTimme.";
for($varTal = 0; $varTal < 24; $varTal++)
{
if($varTal % 2)
continue;
print "$varTal | ";
}
Exempel kontrollstrukturer 1.1
Till början på sida | Till del 2 | Tillbaka till PHP
(Kommer... eller???)