Logotyp för Björns studiewebb

PHP-lathund (del 1)

Inledning

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.)

Grundläggande

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.

Satser och block

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 }).

Kommentarer

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 och datatyper

Variabler

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".

Datatyper

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

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.

Tal

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! (???)

Boolean

Booleska variabler kan tilldelas något av de reserverade orden TRUE eller FALSE.

Objekt

Tilldelning av objekt sker på samma sätt som de primitiva (enkla) värdena.

Vektorer (arrays)

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.

Tilldela till vektor utan index

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.

Exempel 1 - vektorer

Tilldela till vektor med index

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.

Exempel 2 - mer vektorer

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).

Indexera i vektorer med strängar

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.

Mer om vektorer...

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

Utskrifter till den resulterande webbsidan (HTML-dokumentet) kan ske på två sätt:

  • en sträng med print
  • en eller flera strängar med echo
  • en formaterad sträng med printf
  • eller som enstaka variabler (eller satser).

Utskrift av sträng med print

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".

Exempel 1.1 - utskrift

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.

Utskrift av en eller flera strängar med echo

"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".

Exempel 1.1 - utskrift (igen)

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.

Utskrift av formaterad sträng med printf

Funktionen printf() fungerar på ett liknande sätt som i C/C++. Vi kan bl.a. styra

  • utfyllnadstecken (padding)
  • justering (alignment)
  • antal teckens bredd
  • precision för decimaltal
  • och typ (hur värde ska behandlas, t.ex. tal eller sträng)

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. :-)

Utskrift av enstaka variabler eller satser

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

Operatorer

Nedan listas de olika typerna av operatorer som finns i PHP. Sist i detta avsnitt visas en tabell med operatorprioritet.

Tilldelning

Tilldelning sker med likhetstecknet (=)

$intTal1 = 5;

Aritmetiska operator

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).

Sammanfogning av strängar

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 :-).

Jämförelse operatorer

  • == - 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 identitet
1 != 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.

Exempel operatorer 1.

Logiska operatorer

  • && 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.

Operatorprioritet

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

Kontrollstrukturer

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.

if-satser

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.

Syntax

if(villkor)
  satser;
[ elseif(villkor2)
  satser;
  ...
    ... ]
[else
  satser; ]

Exempel

$intTimme = date("h");

if($intTimme < 12)
  print "God morgon";
elseif($intTimme < 18)
  print "God middag";
else
  print "God kväll";

switch-satser

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).

Syntax

switch(värde_att_jämföra)
{
  case värde1:
    satser;
    break;
  case värde2:
    satser;
    break;
  ...
    ...
[ default:
    satser;
    break; ]
}

Exempel

$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. :-)

Funktioner (och procedurer)

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.

Syntax

function funktionsnamn([ param1, param2, ... ])
{
  satser;
  [ return returvärde; ]
}

Exempel

function addera(tal1, tal2)
{
  return tal1 + tal2;
}

Till början på sida

Loopar (iteration)

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

Syntax

for(initiering; slutvillkor; uppräkning)
  satser;

Exempel

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>";

Exempel kontrollstukturer 1.1

foreach

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).

Syntax

foreach($arrVektor as $varde)
  satser;

foreach ($arr as $key => $value)
  print "Key: $key; Value: $value<br>\n";

Exempel

$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

while

Denna loop loopar så länge villkoret på första raden är sant.

Syntax

while(villkor)
  satser;

Exempel

$intTal = 0;

while($intTal < 10)
{
  print "Talet är: $intTal <BR>";
  $intTal++;
}

Exempel kontrollstrukturer 1.1 (igen)

do...while

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.

Syntax

do
  satser;
while(villkor);

Exempel

$intTal = 0

do
{
  print "Talet är: $intTal <br />";
  $intTal++;
} while(intTal < 10);

Exempel kontrollstrukturer 1.1

break och continue

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).

Exempel

$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

Länkar

(Kommer... eller???)