PHP

programmeringssprog
Der er for få eller ingen kildehenvisninger i denne artikel, hvilket er et problem. Du kan hjælpe ved at angive troværdige kilder til de påstande, som fremføres i artiklen.

PHP er et objekt-orienteret server-side programmeringssprog anvendt til udvikling af dynamiske webapplikationer og websteder. Sproget blev grundlagt af Rasmus Lerdorf og udgivet første gang den 8. juni 1995. Projektet er open source, hvilket basalt set betyder, at alle har adgang til den underliggende kildekode, der er skrevet i programmeringssproget C. "PHP" er et rekursivt akronym for "PHP: Hypertext Preprocessor", men stod tidligere for "Personal Home Page Tools".

PHP
Original skaber(e)Rasmus Lerdorf
Udvikler(e)The PHP Development Team
Udgivet8. juni 1995
Stabil version8.0.1 (7. januar 2021)
StatusAktiv
Skrevet iC
OperativsystemUnix-lignende, Windows
PlatformPlatformsuafhængigt
LicensPHP License
Hjemmesidephp.net
Læs den relaterede bog
Programmering:PHPWikibooks.
For alternative betydninger, se PHP (flertydig). (Se også artikler, som begynder med PHP)

PHP er anvendt til at udvikle prominente services som Facebook, Wikipedia, Yahoo, WordPress, Drupal, m.fl. Det er det mest udbredte sprog til dynamiske webløsninger, fordi det har et stort fællesskab (community) i sit bagland. Det har gjort sproget interessant for nybegyndere såvel som øvede. PHP ligger i direkte konkurrence med Microsofts .Net-framework, Ruby, Python og Perl.

Historie

redigér

PHP startede som et lille, simpelt CGI-script i Perl, der skulle bruges til at overvåge trafikken på Rasmus Lerdorfs personlige hjemmeside. Det var på dette tidspunkt aldrig intentionen, at sproget skulle nå ud over hans egen private server. Da Perl-scriptet var for langsomt til at løse sin opgave, blev den omskrevet til C.

Andre personer der brugte samme server opdagede Rasmus' CGI-wrapper, og spurgte om de kunne bruge den på deres respektive projekter. Ikke lang tid gik der, før der opstod efterspørgsel på mere funktionalitet. Som følge af efterspørgslen samlede Lerdorf en – efter eget udsagn halvfærdig – distribution med dokumentation, mailing-liste og FAQ. Distributionen blev kaldt Personal Home Page Tools, men ændrede senere navn til Personal Home Page Construction Kit.

Umiddelbart efter fortsatte Rasmus arbejdet og skrev den grundlæggende funktionalitet til at forbinde til, og arbejde med, en SQL-database. Dette værktøj blev kaldt Form Interpreter, eller blot FI.

 
Andi Gutmans

I den senere om- og sammenskrivning blev det for første gang muligt at indsætte sin dynamiske PHP-kode i HTML-kontekst, frem for i separate filer. PHP 3 var endnu en omskrivning der blev udformet i samarbejde med Andi Gutmans og Zeev Suraski.

De blev lavet som en komplet omskrivning af PHP/FI, da PHP/FI i følge udviklerne var underdimensioneret til at lave et eCommerce-program de arbejdede på til et universitetsprojekt.

For at bygge på PHP/FI's eksisterende brugerbase samarbejdede Andi og Zeev med Rasmus, og offentliggjorde PHP 3.0 som den officielle efterfølger til PHP/FI.

PHP 3.0 blev officielt udgivet i juni 1998, efter omkring 9 måneder i offentlig test.

I vinteren 1998 gik Andi og Zeev i gang med en omskrivning af PHP's kerne. Målet var at forbedre ydeevnen af komplekse applikationer. Den nye motor, døbt Zend Engine, opfyldte målene. PHP 4.0 blev baseret på denne motor, og kombineret med en bred vifte af nye funktioner blev det udgivet i maj 2000.

PHP 5 blev udgivet i juli 2004 efter flere års aktiv udvikling og test. Version 5 er drevet af kernen Zend Engine 2.0. I PHP 5 kom der øget fokus på at forbedre OOP-delen, men der fulgte en lang række rettelser og tilføjelser, samt konventionelle modificeringer.

En anden markant ændring var automatisk hensyn til tidszoner, når man anvendte f.eks. date- og strtotime-funktionerne. Fra og med PHP 5 vil parametre og resultater til/fra disse funktioner være påvirket af serverens tidszone. Det betyder, at UNIX-tidspunktet "0" der i GMT tilsvarer 1. januar 1970 kl. 00:00, på danske servere automatisk blev konverteret til kl. 01:00. På trods af denne implementering af mange blev anset som en effektivisering, opstod der mange problemer under migreringen fra PHP 4 til 5, ganske enkelt fordi mange udviklere ikke var opmærksomme på denne ændring. Altså, ville den kode de var skrevet med manuelt hensyn til tidszoner, pludselig være automatisk, og i langt størstedelen af tilfældene derfor returnere ukorrekte resultater.

I PHP 5.1 blev der tilføjet understøttelse af PDO (PHP Data Object), der er et objekt-orienteret, mere sikkert og mere fleksibelt alternativ til den traditionelle MySQL-implementering. Det er ydermere annonceret at grundlæggende MySQL API vil blive fjernet fra PHP. Det vil dog ske ved en langsom udfasning, da man er velvidende omkring, at det stadig er det mest anvendte API til databaseadgang. Udviklere skal derfor begynde at anvende eksempelvis PDO, MySQLi eller tilsvarende alternativer.

I PHP5.3 blev tilføjet muligheden for at lave anonyme funktioner.

PHP 5.4

redigér

PHP 5.4 blev resultatet af det der skulle have været PHP 6. En af de kritiske ændringer i PHP version 5.4 har været beskyttelse mod en hacking-metode kaldt hash inject, hvor data sendt til serveren, er sammensat på en sådan måde, at det vil skabe enorme mængder ekstra beregninger på serveren, når dataene skal sorteres.

Der er også tilføjet et ny typehinting, callable. Det betyder, at man kan påtvinge at det parameter der videregives til en funktion kan kaldes – dvs. det typisk er en funktion.

PHP-teamet har også indført en ny notation for arrays, på formen [1, 2, 3, ...]. Samtidig er det blevet muligt, at gå direkte til en nøgle i et array returneret af en funktion. Eksempler på begge dele demonstreres her:

function test() {
    return ['Værdi et', 'Værdi to'];
}
echo test()[0]; // Værdi et

Den såkaldte "error supression", @-tegnet, man kan sætte foran funktioner for at de ikke skal udskrive fejlbeskeder, er blevet forbedret i sin hastighed. Oprindeligt var der tale om at udfase denne konstruktion.

Der kom også understøttelse af traits i OOP.

PHP er også blevet udstyret med en indbygget webserver. Denne er dog ikke beregnet til offentligt brug, men udelukkende til at teste sin kildekode.

Den omstridte og berygtede safe mode er blevet fjernet fuldkomment fra PHP, hvilket blev varslet flere år før annonceringen. I samme ombæring er register_globals og register_long_arrays også fjernet. register_globals har i mange år været til stor bekymring for sikkerheden i PHP-applikationer, da funktionen gør det nemt for uvedkommende at sende variabler med potentielt farligt indhold ind og blande sig i koden. Når register_globals var slået fra, eller som nu fjernet, skal programmøren selv importere udefrakommende variabler, og har derfor bedre kontrol med hvilke der kommer ind, og hvorledes de bliver valideret.

I 2014 og 2015 blev der udviklet en ny stor PHP-version, som blev nummereret PHP 7. Nummereringen af denne version involverede en del debat.[1] Mens PHP 6 Unicode-eksperimentet aldrig var blevet frigivet, henviste flere artikler og bogtitler til PHP 6-navnet, hvilket kunne have forårsaget forvirring, hvis en ny version skulle genbruge navnet.[2] Efter en afstemning blev navnet PHP 7 valgt.[3]

PHP 7 introducerede også nye sprogfunktioner, herunder returnertypeerklæringer til funktioner,[4] som supplerer de eksisterende parametertypeerklæringer og understøtter de skalære typer (integer, float, string, and boolean) i parameter og retur type erklæringer.[5]

Overblik

redigér

PHP benyttes til at skabe dynamisk indhold, herunder webshops, fora, CMS-systemer, intranets, databasebehandling, osv. Da det er et såkaldt general-purpose sprog er det ikke begrænset til at løse en bestemt slags opgaver, og udvikleren er derfor givet kreativ frihed, dels til at definere sin opgave, og dels til fremgangsmåden hvorpå denne skal løses. Disse to parametre gør sig ikke gældende for alle programmeringssprog.

PHP afvikles på webserver-software som eksempelvis Apache eller IIS. Almindeligvis når en besøgende ankommer til en hjemmeside, forespørges der på en side, og denne returneres af serveren. Her vil der på statiske webløsninger være tale om HTML og CSS. Når besøgende ankommer til en PHP-baseret server, vil en fortolker være til stede i processen mellem at en besøgende efterspørger på en side, og modtager den efterspurgte side. På dette ekstra trin i processen vil PHP-koden blive fortolket og behandlet, og således returnere et dynamisk resultat.

PHP har tre præ-installerede API'er til arbejde med databaser.

Filendelse

redigér

Som endelse på filnavne for PHP-filer benyttes ofte .php, .php3, .php4, .php5 eller .phtml. Tallene der står i forlængelse af .php kan bruges af webserveren til at identificere, hvilken version af php-fortolkeren der skal bruges. Til fremvisning af selve PHP-filerne med syntaksfremhævning kan endelsen .phps på filnavnet benyttes.

Afgrænsning

redigér

For at fortælle webserveren at der er tale om PHP koden, skal man afgrænse koden med nogle tags. Hvis man ikke gør det vil koden bare blive fortolket som almindelig tekst/HTML. Et PHP script starter altid med <?php eller <? og slutter med ?>, dog kan det også behandles ved brug af et HTML tag; <script language="php">. Der bruges dog også <?= ?> til et direkte print i html kode. Det ses ligeledes sjældent, at PHP åbnes med ASP tags som <% og %> og <%= %> til direkte print. Det er gyldig, hvis "asp_tags" er slået til i PHP konfigurationen – men dog yderst sjældent man ser det i praksis. Af hensyn bagudkompatibilitet bruges den såkaldte "shorthand" (<?=?>) kun sjældent i systemer der skal distribueres til forskellige servere. I PHP 6 er muligheden for brug af ASP tags blevet fjernet.

PHP i webmiljøer

redigér

Når en browser forespørger om en PHP-side, så fortolkes koden først af webserveren vha. et plug-in-program, der enten oversættes sammen med webserveren (oftest Apache under GNU/Linux og Unix – se LAMP) eller som et CGI/ISAPI-program (oftest Internet Information Server eller Apache under Windows), der så genererer websiden, inden den bliver sendt af sted tilbage til browseren, som fortolker HTML-koden og viser hjemmesiden.

Anvendelse

redigér

PHP benyttes blandt andet af til generering af Wikipedias websider, hvor den samlede PHP-løsning hedder MediaWiki.

PHP kan også bruges til andre formål end blot dynamiske websider, blandt andet kan shell scripts og programmer med grafisk brugerflade (gennem GTK+) også kodes med dette sprog.

PHP kan ses som et open source-alternativ til Microsofts Active Server Pages (ASP) og til CGI/Perl.

Fortolkeren til PHP er for det meste Zends Zend Engine, der er skrevet i C, og er blevet brugt i PHP siden PHP3 blev udgivet. PHP5, som blev udgivet d. 13. juli 2004, bruger Zend Engine II.

Til PHP findes der et udvidelsessæt af komponenter og hyppigt benyttede kodestykker – PEAR (PHP Extension and Application Repository) – meget i stil med CPAN til Perl.

Klassifikation

redigér

PHP er kategoriseret som dynamisk og svagt, når det drejer sig om datatyper. Det betyder dels, at man kan arbejde med variabler og funktioner der ikke er deklareret fra start af, og ydermere, at der ikke er et striks forhold mellem en variabel-type og den type data variablen indeholder. Dvs. at undervejs i en eksekvering kan den samme variabel godt have inholdt både tekststrenge, tal, objekter og ressourcer. Dette gør sig eksempelvis ikke gældende i sprog som C++ og Object Pascal, hvor man må konvertere på tværs af typer.

PHP er også imperativ programmering.

PHP kontra konkurrenterne

redigér

PHP er i almindelighed stærkt på sin performance/hastighed, samt at være open source og solidt understøttet af udviklerfællesskabet. Der findes mange fora og hjemmesider der tilbyder hjælp, guides og artikler, såvel som der findes tusindvis af udvidelser, frameworks og API'er.

.Net er et samlet framework fra Microsoft der i web-sammenhæng spænder over C#, C++ og Visual Basic. .Net er ofte foretrukket af virksomheder grundet sin stærkere implementering (af bl.a. MVC) og bagud-kompatibilitet, og fordi netop .Net har været anvendt til business i mange år. De to sprog/frameworks kan et langt stykke hen ad vejen løse de samme opgaver.

En af de fremtrædende forskelle på Python og PHP er rent æstetisk. PHP anvender såkaldte "curly braces", altså tegnene { og }, til at markere begyndelse og afslutning på kode-sektioner. Disse har aldrig været en del af Python, og skal man tro udviklerne, samt et easter egg plantet i Python, kommer det aldrig til at ske. De to fællesskaber har interne drillerier, der bygger på, at hvis man kan lide curly braces, så bør man vælge PHP, og hvis man ikke kan, så bør man vælge Python.

Ruby bliver ofte sammenlignet med PHP, i forbindelse med Rails. Rails er Rubys stack til webudvikling. Som Python er Ruby meget læsligt i syntaksen og har ikke påkrævede semikolon. I forhold til Python kræver Ruby ikke indentation i syntaksen. I forhold til PHP, kører mange af rails funktioner gennem en terminal og giver udvikleren andre og nogle gange flere muligheder til deployment og maintenance.

Perl / CGI

redigér
  Tekst mangler, hjælp os med at skrive teksten

Syntaks

redigér

PHP har en relativt fri syntaks, der langt hen ad vejen tillader programmøren at skabe sin egen stil. Der er delte meninger om den store frihed, hvor nogle mener, det har medført for meget rodet kode fra programmører der er uerfarne i teamwork, mens andre argumenterer for, at det gør sproget sjovere at arbejde med. Der findes flere definerede standarder, herunder PHPs egen PECL har en guide til, hvad der anses for korrekt syntaks. Idéen med en sådan fælles standard er simplificeringen af at dele og forstå andre udvikleres kode samt lettere at forstå sin egen kode, når man i fremtiden skal vedligeholde og tilrette den.

Hello world

redigér

Det klassiske Hello, World!-eksempel:

<?php
  echo "Hej verden!";
?>

Variabler

redigér

Variabler er applikationens hukommelse, hvor man lagrer værdier, man har i sinde at bruge på et senere tidspunkt. I nedenstående, meget simple – og meget statiske – eksempel, oprettes to variabler, x og y, og deres værdi bliver beregnet og lagt ind i variablen, resultat. Endeligt bliver resultatet skrevet, så den besøgende på hjemmesiden, vil kunne se det.

<?php
$x = 4;
$y = 5;
$resultat = $x + $y;
echo $resultat;   // 9
?>

I modsætning til mange andre programmeringssprog, er det ikke en forudsætning at man i PHP definerer en variabel før man bruger dem.

If / Else

redigér
<?php
  // if – else
  if ($variabel < 10) {
    echo "Variablen er mindre end 10";
  }
  else {
    echo "Variablen er større end eller lig med 10";
  }
?>

Løkker

redigér

En løkke er en algoritme der gentager et operation x antal gange. X kan enten være fast defineret eller variabelt. PHP understøtter flere typer af variabler.

  • For
  • Foreach
  • While
  • Do – While

Eksempel på en while-løkke der arbejder med udskriver iterations-værdien så længe denne er under 10.:

<?php
while ($i < 10) {
    echo $i;
    $i++;
}
?>

En for-løkke løber fra én værdi til en anden. Der eksisterer en række måder at udtrykke dette interval på, hvor nedenstående viser den mest almindelige. Det tredje parameter i for-løkken udtrykker den måde hvorpå værdien stiger eller falder. I størstedelen af tilfældene vil man benytte $i++ der ved hver iteration i løkken ligger en værdi til variablen i. Man kunne også skrive eksempelvis $i-- for en nedadgående løkke, eller eksempelvis $i = $i + 4 hvis springene skal være på intervaller á 4.

<?php
for ($i = 0; $i <= 20; $i++) {
    echo $i . "<br />";
}
?>

Foreach-løkken bruges til at gennemløbe alle nøgle/værdi-sæt i et array. PHP understøtter associative arrays, og man kan derfor ikke kategorisk være sikker på at nøglerne går fra fx 0 til 20, og derfor vil en for-løkke ofte vise sig at være utilstrækkelig til at løse opgaven.

<?php
$a = array(1, 2, 3, 17);

foreach ($a as $v) {
    echo "Værdien af \$a: $v.\n";
}
?>

Klasser og objekter blev indført i PHP 3, men forbedret væsentligt i særdeleshed PHP 5 og 5.4. En simpel klasse kan defineres således:

class Audi extends Bil {
  private $model;
  public function __construct($model){
    $this->model = $model;
  }
}

Det tilsvarende objekt kan instantieres på denne måde:

$audi_r8 = new Audi("R8");

Det er muligt at lave statiske funktioner, der kan kaldes globalt i programmet og uden først at instantiere klassen. Disse tilgås med den såkaldte scope resolution operator (::) på denne facon:

Audi::audis_historie();

Statiske funktioner defineres på samme vis som alm. funktioner, men benytter signaturen "static" før nøgleordet "function".

Community og udvidelser

redigér

PEAR og PECL

redigér
  Tekst mangler, hjælp os med at skrive teksten

Frameworks

redigér
  Hovedartikel: Frameworks til PHP.

Der eksisterer en lang række tredjeparts frameworks til PHP.

Bøger og dokumentation

redigér
  Tekst mangler, hjælp os med at skrive teksten

PHP dokumentationen findes på PHPs officielle hjemmeside php.net. Dokumentationen beskriver de forskellige dele af sproget og der er ofte eksempler på brug af f.eks. funktioner.

Fællesskab

redigér
  Tekst mangler, hjælp os med at skrive teksten

Normalt anses PHP som værende et hurtigt programmeringssprog, men programmørens forståelse for funktionerne og algoritmer er lige så vigtig for, at koden giver den højest mulige ydelse. I enkle eksempler måles ydelse med PHPs indbyggede microtime()-funktion, der giver det aktuelle tidsstempel i mikrosekunder. PHP har mange funktioner, der i grunden gør de samme ting, men ikke nødvendigvis på samme måde, hvorfor de er forskellige i deres afviklingstid. Afhængigt af situationen er udskrivefunktionen "echo" nogle gange hurtigere end den tilsvarende "print." Men i særlige tilfælde vil print-funktionen være hurtigere. Et andet eksempel er sammenligningsoperatorerne == og ===. Sidstnævnte er hurtigere, men giver kun det ønskede resultat hvis de to datatyper er identiske.

Normalt er der tale om forskelle på nano- og mikrosekunder. I disse tilfælde er ydelsen i højere grad et kvalitetsstempel end en praktisk nødvendighed. Der findes dog undtagelser i særligt komplekse, omfattende eller meget anvendte systemer, hvor god forståelse for ydelse er nødvendig. Dette omfatter især, hvilke løkker der benyttes, hvordan de benyttes og antal af kald til databasen.

Sikkerhed

redigér

Et af de mest alment kendte sikkerhedsproblemer i PHP er superglobale variabler og heraf risikoen for SQL-injections. SQL-injections er kort og godt, at der indsættes et eller flere specialtegn (typisk ' eller ") i de data der fremsendes til serveren. Hvis applikationen ikke er tilstrækkeligt beskyttet, vil disse tegn åbne muligheden for at personer med indgående kendskab til SQL kan udtrække og manipulere data, de ikke var tiltænkt.

Før version 5 var de såkaldte magic_quotes slået til som standard, men de er siden slået fra som standard, for at blive fuldkommen udfaset i version 5.4. magic_quotes hjælper begyndere med at beskytte sig mod SQL-injections, men som Rasmus Lerdorf og andre fremtrædende PHP-personligheder har argumenteret for, er det ultimativt ikke sprogets ansvar eller opgave, og samtidig fremmer det indirekte ikke programmøren til at være opmærksom på potentielle sikkerhedshuller og trusler. PHP tilbyder dog en række værktøjer til beskyttelse mod SQL-injections, bl.a. funktionerne add_slashes og mysql_real_escape_string. Disse er beregnet til en klassisk, procedural tilgang til databaserne. Benytter man det objekt-orienterede PDO er der praktisk talt ingen risiko for injections, data systemet holder parametre og forespørgsel adskilt.

Safe mode er lavet for at komme et sikkerhedsproblem til livs på delte servere. Det er lavet som et PHP script der går ind og sætter begrænsninger for hvad der er tilladt. En af de største begrænsninger er, at filbehandlingsmuligheder er stærkt begrænsede, og mange open source systemer vil derfor ikke virke. På mange danske webhoteller er der ikke mulighed for at slå safe mode fra på domænet, hvilket giver store problemer. Safe mode er da også fjernet i PHP 6.

PHP er kritiseret for sin inkonsistente navngivning af indbyggede funktioner og klasser, samt foruddefinerede konstanter. Nogle funktioner er for eksempel navngivet med underscores, som i mysql_fetch_array, mens andre er navngivet med store startbogstaver, for at adskille ord. Eksempelvis bindParam fra PDO-biblioteket.

PHP er også kritiseret for sin "løse tilgang" sammenlignet med eksempelvis sit modersprog C, der validerer på anvendte data-typer. I PHP er det muligt at blande tal, tekst, boolske værdier, mv. sammen. Det er bekvemt, hvis man er erfaren med PHP's håndtering og opførsel, men fra et programmeringsteoretisk synspunkt er det ikke altid velset. Når PHP skal afgøre, hvordan værdierne skal behandes, kigger den bl.a. på de logiske operatorer der er anvendt mellem værdierne. Et punktum "." vil indikere, at man ønsker at sammensætte stykker af tekst, mens matematiske operatører som +, -, / og * vil behandle udtrykket som sådan. Blander man et tekststreng, for eksempel "66 Test", ind i et sådant udtryk, foretager PHP en såkaldt typecasting. Det varierer mellem datatyper og kontekst, hvad resultatet bliver. I nævnte tilfælde bliver resultatet 66, fordi PHP er programmeret til at undersøge, hvad der står først i teksten. Er dette et tal, benytter den tallet i udtrykket og dropper resten af teksten. Står der intet tal, indsætter PHP et 0.

Udviklere har også efterspurgt multithreading (benyttelse af flere processorkerner) og Unicode-understøttelse. Sidstnævnte er angiveligt under udvikling, men har allerede forsinket udgivelsen af PHP 6 væsentligt.

Eksterne henvisninger

redigér
 
Wikimedia Commons har medier relateret til:
  1. ^ "The Neverending Muppet Debate of PHP 6 v PHP 7".
  2. ^ "RFC: Name of Next Release of PHP". php.net. 2014-07-07. Hentet 2014-07-15.
  3. ^ "Re: [PHP-DEV] [VOTE][RFC] Name of Next Release of PHP (again)". 2014-07-30. Hentet 2014-07-30.
  4. ^ "RFC: Return Types". php.net. 2015-01-27. Hentet 2015-01-28.
  5. ^ "RFC: Scalar Type Declarations". php.net. 2015-03-16. Hentet 2015-03-17.