PHP: Forskelle mellem versioner

Fra Wikipedia, den frie encyklopædi
Content deleted Content added
Linje 196: Linje 196:
$audi_r8 = new Audi("R8");
$audi_r8 = new Audi("R8");
</source>
</source>

== Frameworks ==
Der eksisterer en lang række tredjeparts [[framework]]s til PHP.


== Ydelse ==
== Ydelse ==

Versionen fra 24. jun. 2012, 07:29

PHP
Original skaber(e) Rasmus Lerdorf
Udvikler(e) The PHP Group
Udgivet 1995
Stabil version 5.3.10 (2. februar 2012)
Nyeste version 5.4.0 RC 7 (2. februar 2012)
Status Aktiv
Skrevet i C
Platform Platformsuafhængigt
Licens PHP License
Hjemmeside php.net
Læs den relaterede bog
Programmering:PHPWikibooks.
For alternative betydninger, se PHP (flertydig). (Se også artikler, som begynder med PHP)

PHP er et objekt-orienteret programmeringssprog anvendt til udvikling af dynamiske webapplikationer og hjemmesider. 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 er anvendt til at udvikle prominente services som Facebook, Wikipedia, Yahoo, Digg, 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.

Overblik

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.

Server

PHP skal afvikles på en server med eksempelvis Apache eller WAMP. 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

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

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

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

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.

Den 8. juni 2010 fyldte PHP 15 år.

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.

PHP kontra konkurrenterne

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 tusindevis af udvidelser, frameworks og API'er.

.Net

.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 et langt stykke hen ad vejen løse de samme opgaver.

Python

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

Perl / CGI

Versioner

PHP/FI

Personal Home Page / Forms Interpreter (PHP/FI) var den første version af PHP. Det blev udviklet af Rasmus Lerdorf i 1995. I starten var det et simpelt sæt af Perl-kommandoer til at spore adgangen til hans online-CV.

Efterhånden som mere funktionalitet var nødvendigt lavede han en stor C-implementering, som gjorde det muligt at kommunikere med databaser og lave simple web-applikationer.

Rasmus Lerdorf valgte at offentliggøre kildekoden til PHP/FI, så alle kunne se og bruge den.

PHP 3

Andi Gutmans

PHP 3.0 blev udviklet af Andi Gutmans og Zeev Suraski i 1997.

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

PHP 4

I vinteren 1998 gik Andiog 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

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.

PHP 5.3

Understøttelse af traits i OOP.

Tilføjet muligheden for at lave anonyme funktioner.

PHP 5.4

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.

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 infamøse 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.

Syntaks

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 at lettere at forstå sin egen kode, når man i fremtiden skal vedligeholde og tilrette den.

Hello world

Det klassiske Hello, World!-eksempel:

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

Variabler

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.

$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

<?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

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

while ($i < 10) {
    echo $i;
    $i++;
}
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.

foreach ($array as $key => $value){
    echo "Nøglen $key har værdien $value.<br>";
}

Klasse

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

Frameworks

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

Ydelse

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

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.

Kritik

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, booleanske værdier, mv. sammen. Det er bekvemt hvis man er erfaren med PHPs håndtering og opførsel, men fra et programmeringsteoretisk synspunkt er det ikke altid velset. Når PHP skal ligge determinere 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 multi-threading (benyttelse af flere processorkerner) og Unicode-understøttelse. Sidstnævnte er angiveligt under udvikling, men har allerede forsinket udgivelse af PHP 6 væsentligt.

Eksterne henvisninger

Wikimedia Commons har medier relateret til:

Skabelon:Link GA