PHP-syntax och semantik
Syntaxen och semantiken för PHP , ett programmeringsspråk , bildar en uppsättning regler som definierar hur ett PHP-program kan skrivas och tolkas .
Översikt
Historiskt sett har utvecklingen av PHP varit något slumpartad. För att motverka detta har PHP Framework Interop Group (FIG) skapat The PHP Standards Recommendation (PSR) dokument som har hjälpt till att skapa mer standardisering av språket sedan 2009. De moderna kodningsstandarderna finns i PSR-1 (Basic Coding Standard) och PSR-2 (Coding Style Guide).
Nyckelord
Vissa nyckelord representerar saker som ser ut som funktioner, vissa ser ut som konstanter, men de är faktiskt språkkonstruktioner. Det är förbjudet att använda några nyckelord som konstanter, klassnamn, funktioner eller metoder. Det är tillåtet att använda dem som variabelnamn, men det kan vara förvirrande.
__halt_compiler()
abstrakt
och
array()
som
ha sönder
-
anropsbar
(från och med PHP 5.4) fall
fånga
klass
klona
konst
Fortsätta
deklarera
standard
dö()
do
eko
annan
elseif
tömma()
slutdeklarera
endfor
endforeach
endif
ändbrytare
under tiden
eval()
utgång()
sträcker sig
slutlig
-
slutligen
(från och med PHP 5.5) -
fn
(från och med PHP 7.4) för
för varje
fungera
global
-
goto
(från och med PHP 5.3) om
redskap
omfatta
inkludera_en gång
instans av
-
istället för
(från och med PHP 5.4) gränssnitt
isset()
lista()
-
matcha
(från och med PHP 8.0) -
namnutrymme
(från och med PHP 5.3) ny
eller
skriva ut
privat
skyddad
offentlig
behöva
kräver_en gång
lämna tillbaka
statisk
växla
kasta
-
egenskap
(från och med PHP 5.4) Prova
unset()
använda sig av
var
medan
xor
-
avkastning
(från och med PHP 5.5) -
avkastning från
(från och med PHP 7.0)
Grundläggande språkkonstruktioner
PHP följer i allmänhet C-syntaxen , med undantag och förbättringar för dess huvudsakliga användning i webbutveckling , som använder strängmanipulation i hög grad . PHP-variabler måste ha prefixet " $
". Detta gör att PHP kan utföra stränginterpolation i strängar med dubbla citattecken , där omvänt snedstreck stöds som ett escape-tecken . Ingen escape eller interpolation görs på strängar avgränsade av enkla citattecken . PHP stöder också en C-liknande sprintf -funktion. Koden kan modulariseras till funktioner definierade med nyckelordsfunktion
. PHP stöder en valfri objektorienterad kodningsstil, med klasser betecknade med nyckelordet klass .
Funktioner som definieras i klasser kallas ibland metoder . Kontrollstrukturer inkluderar: if
, while
, do/while
, for
, foreach
och switch
. Påståenden avslutas med semikolon, inte radslut.
Avgränsare
PHP-processorn analyserar bara kod inom dess avgränsare . Allt utanför dess avgränsare skickas direkt till utgången och tolkas inte av PHP. De enda öppna/stängda avgränsare som tillåts av PSR-1 är " <?php
" och " ?>
" eller <? =
och ?>
.
Syftet med de avgränsande taggarna är att separera PHP-kod från icke-PHP-data (främst HTML). Även om det är sällsynt i praktiken kommer PHP att exekvera kod inbäddad i alla filer som skickas till dess tolk, inklusive binära filer som PDF- eller JPEG-filer, eller i serverloggfiler. Allt utanför avgränsarna ignoreras av PHP-parsern och skickas igenom som utdata.
Dessa rekommenderade avgränsare skapar korrekt utformade XHTML- och andra XML- dokument. Detta kan vara till hjälp om källkodsdokumenten någonsin behöver bearbetas på andra sätt under programvarans livstid.
Om korrekt XML-validering inte är ett problem, och en fil endast innehåller PHP-kod, är det bättre att utelämna PHP-avslutningstaggen (?> ) i
slutet av filen.
Ej rekommenderade taggar
Andra avgränsare kan användas på vissa servrar, även om de flesta inte längre stöds. Exempel är:
- "
<script language="php">
" och "</script>
" (borttaget i PHP7) - Korta öppningstaggar (
<?
) (konfigurerade med inställningenshort_open_tag
ini)- En speciell form av
<?
taggen är<?=
, vilket automatiskt ekar nästa påstående. Före PHP 5.4.0 styrdes även detta medshort_open_tag
, men finns alltid tillgängligt i senare versioner.
- En speciell form av
-
ASP- stiltaggar (
<%
eller<%=
) (borttaget i PHP7)
Variabler och kommentarer
Variabler är prefixerade med en dollarsymbol och en typ behöver inte anges i förväg. Till skillnad från funktions- och klassnamn är variabelnamn skiftlägeskänsliga. Både dubbla citationstecken ( ""
) och heredoc -strängar tillåter möjligheten att bädda in en variabels värde i strängen. Som i C, kan variabler gjutas till en specifik typ genom att prefixet typen inom parentes. PHP behandlar nya rader som blanksteg , på samma sätt som ett språk i fritt format . Sammankopplingsoperatorn är .
_ (punkt). Arrayelement nås och sätts med hakparenteser i både associativa arrayer och indexerade arrayer. Lockiga parenteser kan användas för att komma åt arrayelement, men inte för att tilldela.
PHP har tre typer av kommentarsyntax : /* */
som fungerar som blockkommentarer och //
samt #
som används för inline-kommentarer. Många exempel använder utskriftsfunktionen
istället för ekofunktionen
. Båda funktionerna är nästan identiska; Den stora skillnaden är att utskrift
är långsammare än eko
eftersom den förra kommer att returnera en status som indikerar om den var framgångsrik eller inte utöver text till utmatning, medan den senare inte returnerar en status och bara returnerar texten för utmatning.
Enklaste programmet
Det vanliga " Hello World "-kodexemplet för PHP är:
<?php echo "Hej världen! \n " ; ?>
Exemplet ovan ger ut följande:
Hej världen!
Istället för att använda <?php
och ekosatsen
, är en valfri "genväg" användningen av <? =
istället för <?php
som implicit ekar data. Till exempel:
<!DOCTYPE html> < html > < head > < title > PHP "Hej världen!" program </ title > </ head > < body > < p > <? = "Hej världen!" ?> </ p >
</ body > </ html >
Ovanstående exempel illustrerar också att text som inte finns i omslutande PHP-taggar kommer att matas ut direkt.
Operatörer
PHP stöder: aritmetiska operatorer , tilldelningsoperatorer , bitvisa operatorer , jämförelseoperatorer , felkontrolloperatorer, exekveringsoperatorer, inkrement/minska operatorer , logiska operatorer , strängoperatorer , arrayoperatorer, villkorsstyrda tilldelningsoperatorer .
Kontrollstrukturer
Villkor
Om ... annat uttalande
Syntaxen för en PHP if ... else-sats är som följer:
if ( villkor ) { // uttalanden; } elseif ( condition2 ) { // uttalanden; } annat { // uttalanden; }
För enstaka uttalanden kan parenteser utelämnas och om valfritt kondenseras till en enda rad:
om ( tillstånd ) dosomething (); elseif ( villkor2 ) dosomethingelse (); annat doyetathirdthing ();
Ternär villkorad operatör
0
0
$abs = $värde >= ? $värde : - $värde ; /* Motsvarar */ if ( $värde >= ) { $abs = $värde ; } annat { $abs = - $värde ; }
Elvis operatör
Eftersom PHP 5.3 stöder Elvis-operator ( ?:
) där det är möjligt att utelämna den mellersta delen av den ternära operatorn.
$c = $a ?: $b ; /* Motsvarar */ $c = $a ? $a : $b ;
Noll sammansmältande operatör
Sedan version 7.0 stöder PHP också Null-koalescerande operatör ( ??
).
$a = $b ?? $c ; /* Motsvarar */ $a = isset ( $b ) ? $b : $c ;
Sedan version 7.4 stöder PHP också Null-koalescerande operatör med syntaxen ??= .
$a ??= $b ; /* Motsvarar */ $a = $a ?? $b ;
Sedan version 8.0 stöder PHP även Safe navigation operator ( ?->
).
$variabel = $objekt ?-> metod (); /* Motsvarar */ $variabel = $objekt !== null ? $object -> metod () : null ;
Byt uttalande
Ett exempel på syntaxen för en PHP switch-sats är följande:
0
switch ( expr ) { case : // uttalanden; bryta ; fall 1 : // uttalanden; bryta ; fall 2 : // uttalanden; bryta ; default : // uttalanden; }
Observera att till skillnad från i C kan värden i case-satsen vara vilken typ som helst, inte bara heltal.
Matcha uttryck
PHP 8 introducerar matchningsuttrycket
. Matchningsuttrycket liknar konceptuellt en switch-
sats och är mer kompakt för vissa användningsfall.
0
echo match ( 1 ) { => 'Foo' , 1 => 'Bar' , 2 => 'Baz' , }; //> Bar
Slingor
För loop
PHP-syntaxen för en for-loop är följande:
for ( initiering ; villkor ; eftertanke ) { // uttalanden; }
Medan loop
Syntaxen för en PHP while loop är följande:
while ( villkor ) { // uttalanden; }
Gör while loop
Syntaxen för en PHP do while loop är som följer:
gör { // uttalanden; } while ( villkor );
För varje slinga
Syntaxen för en PHP för varje slinga är följande:
foreach ( $set som $värde ) { // uttalanden; }
Alternativ syntax för kontrollstrukturer
PHP erbjuder en alternativ syntax som använder kolon snarare än standardsyntaxen med lockigt klammer (av " { ...} "
). Denna syntax påverkar följande kontrollstrukturer: if
, while
, for
, foreach
och switch
. Syntaxen varierar endast något från syntaxen med lockigt klammer. ersätts öppningsstången ( { ) med ett kolon (
:
) och den täta klammern ersätts med endif;
, under tiden;
, endfor;
, endforeach;
, eller ändbrytare;
, respektive. Att blanda syntaxstilar inom samma kontrollblock stöds inte. Ett exempel på syntaxen för en if
/ elseif
-sats är följande:
if ( villkor ) : // code here elseif ( villkor ) : // code here else : // code here endif ;
Denna stil kallas ibland mallsyntax, eftersom den ofta är lättare att läsa när man kombinerar PHP och HTML eller JavaScript för villkorlig utdata:
< html > <?php if ( $day == 'torsdag' ) : ?> < div > Imorgon är det fredag! </ div > <?php elseif ( $day == 'fredag' ) : ?> < div > TGIF </ div > <?php else : ?> < div > ugh </ div > <?php endif ; ?> </ html >
Undantagshantering
Körtidsundantagshanteringsmetoden i PHP ärvs från C++.
0
0
function inv ( $x ) { if ( $x == ) { throw new Exception ( 'Division med noll' ) ; } returnera 1 / $x ; } prova { echo inv ( 2 ); // skriver ut 0,5 echo inv ( ); // kasta ett undantag echo inv ( 5 ); // kommer inte att köra } catch ( Undantag $e ) { echo $e -> getMessage (); // skriver ut Division med noll } // Fortsätt exekvering echo "Hej" ; // skriver ut Hej
Datatyper
Skalära typer
PHP stöder fyra skalärtyper: bool
, int
, float
, string
.
Boolean
PHP har en inbyggd boolesk typ, som heter " bool
", liknande de ursprungliga booleska typerna i Java och C++ . Med hjälp av reglerna för omvandling av boolesk typ tolkas värden som inte är noll som sant
och noll som falskt
, som i Perl . Både konstanterna sant
och falskt
är skiftlägesokänsliga.
Heltal
PHP lagrar heltal i ett plattformsberoende intervall. Detta intervall är vanligtvis det för 32-bitars eller 64-bitars tecken med heltal. Heltalsvariabler kan tilldelas med decimala (positiva och negativa), oktala och hexadecimala notationer.
0
$a = 1234 ; // decimaltal $b = 0321 ; // oktalt tal (motsvarande 209 decimaler) $c = 0x1B ; // hexadecimalt tal (motsvarande 27 decimaler) $d = b11 ; // binärt tal (motsvarande 3 decimaler) $e = 1 _234_567 ; // decimaltal (från och med PHP 7.4.0)
Flyta
Reella tal lagras också i ett plattformsspecifikt intervall. De kan specificeras med flyttalsnotation eller två former av vetenskaplig notation .
$a = 1,234 ; $b = 1,2e3 ; // 1200 $c = 7E-5 ; // 0,00007 $d = 1 _234 . 567 ; // från och med PHP 7.4.0
Sträng
PHP stöder strängar
, som kan användas med enkla citattecken, dubbla citattecken, nowdoc eller heredoc -syntax.
Dubbla citattecken stöder variabel interpolation:
$age = '23' ; echo "John är $age years old" ; // John är 23 år gammal
Syntax för lockiga hängslen:
$f = "sqrt" ; $x = 25 ; echo "a $xc\n " ; // Varning: Odefinierad variabel $xc echo "a { $x } c \n " ; // skriver ut a25c echo "a ${ x } c \n " ; // skriver också ut a25c echo " $f ( $x ) is { $f ( $x ) } \n " ; // prints sqrt(25) är 5
Specialtyper
PHP stöder två specialtyper: null
, resurs
. Datatypen noll
representerar en variabel som inte har något värde. Det enda värdet i datatypen null är
NULL . NULL - konstanten är inte skiftlägeskänslig. Variabler av typen " resurs
" representerar referenser till resurser från externa källor. Dessa skapas vanligtvis av funktioner från ett visst tillägg och kan endast bearbetas av funktioner från samma tillägg. Exempel inkluderar fil-, bild- och databasresurser.
Sammansatta typer
PHP stöder fyra sammansatta typer: array
, object
, callable
, iterable
.
Array
Arrayer kan innehålla blandade element av vilken typ som helst, inklusive resurser, objekt. Flerdimensionella arrayer skapas genom att tilldela arrayer som arrayelement. PHP har ingen sann array-typ. PHP-matriser är naturligt glesa och associativa . Indexerade arrayer är helt enkelt hash som använder heltal som nycklar.
Indexerad array:
$season = [ "Höst" , "Vinter" , "Vår" , "Sommar" ]; echo $säsong [ 2 ]; // Vår
Associativ array:
$salary = [ "Alex" => 34000 , "Bill" => 43000 , "Jim" => 28000 ]; echo $salary [ "Bill" ]; // 43000
Flerdimensionell array:
$mark = [ "Alex" => [ "biologi" => 73 , "historia" => 85 ], "Jim" => [ "biologi" => 86 , "historia" => 92 ] ]; echo $mark [ "Jim" ][ "historia" ]; // 92
Objekt
Objektdatatypen är en kombination av variabler, funktioner och datastrukturer i det objektorienterade programmeringsparadigmet .
class Person { //... } $person = ny person ();
Ringbar
Sedan version 5.3 har PHP förstklassiga funktioner som kan användas t.ex. som argument till en annan funktion.
function runner ( anropbar $funktion , blandad ... $args ) { return $function ( ... $args ); } $f = fn ( $x , $y ) => $x ** $y ; funktion summa ( int | float ... $args ) { return array_sum ( $args ); } echo runner ( fn ( $x ) => $x ** 2 , 2 ); // skriver ut 4 echo runner ( $f , 2 , 3 ); // skriver ut 8 echo runner ( 'summa' , 1 , 2 , 3 , 4 ); // skriver ut 10
Iterable
Iterabel
typ indikerar att variabel kan användas med varje
slinga. Det kan vara vilken array
eller generator
eller objekt som helst som implementerar det speciella interna Traversable
-gränssnittet.
function printSquares ( iterable $data ) { foreach ( $data as $value ) { echo ( $value ** 2 ) . "" ; } echo " \n " ; } // array $array = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ]; // generator $generator = function () : Generator { for ( $i = 1 ; $i <= 10 ; $i ++ ) { yield $i ; } }; // objekt $arrayIterator = ny ArrayIterator ([ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ]); printSquares ( $array ); // 1 4 9 16 25 36 49 64 81 100 printSquares ( $generator ()); // 1 4 9 16 25 36 49 64 81 100 printSquares ( $arrayIterator ) ; // 1 4 9 16 25 36 49 64 81 100
Fackliga typer
Unionstyper introducerades i PHP 8.0
function foo ( sträng | int $foo ) : sträng | int {}
Funktioner
PHP har hundratals basfunktioner och tusentals fler från tillägg. Före PHP version 5.3.0 är funktioner inte förstklassiga funktioner och kan endast refereras till med deras namn, medan PHP 5.3.0 introducerar stängningar. Användardefinierade funktioner kan skapas när som helst och utan prototyper. Funktioner kan definieras inuti kodblock, vilket tillåter ett körtidsbeslut om huruvida en funktion ska definieras eller inte. Det finns inget koncept för lokala funktioner. Funktionsanrop måste använda parenteser med undantag för noll-argumentklasskonstruktorfunktioner som anropas med PHP new
operator, där parenteser är valfria.
Ett exempel på funktionsdefinition är följande:
function hello ( $target = 'World' ) { echo "Hej $target ! \n " ; } hej (); // utmatar "Hello World!" hej ( 'Wikipedia' ); // utmatar "Hej Wikipedia!"
Funktionsanrop kan göras via variabler, där värdet på en variabel innehåller namnet på den funktion som ska anropas. Detta illustreras i följande exempel:
function hello () { return 'Hej' ; } function world () { return "World!" ; } $function1 = 'hej' ; $function2 = 'värld' ; echo " { $funktion1 () } { $funktion2 () } " ;
Ett standardvärde för parametrar kan tilldelas i funktionsdefinitionen, men före PHP 8.0 stödde inte namngivna parametrar eller parameterhoppning. Vissa grundläggande PHP-utvecklare har offentligt uttryckt besvikelse över detta beslut. Andra har föreslagit lösningar för denna begränsning.
Namngivna argument
Namngivna argument introducerades i PHP 8.0
function power ( $bas , $exp ) { return $base ** $exp ; } // Använda positionsargument: echo power ( 2 , 3 ); // prints 8 // Använda namngivna argument: echo power ( bas : 2 , exp : 3 ); // skriver ut 8 ekokraft ( exp : 3 , bas : 2 ) ; // skriver ut 8
Typdeklaration
Specificering av typer av funktionsparametrar och funktionsreturvärden har stöds sedan PHP 7.0.
Returtypdeklaration:
funktion summa ( $a , $b ) : float { return $a + $b ; } var_dump ( summa ( 1 , 2 )); // skriver ut float(3)
Typ av parametrar:
function summa ( int $a , int $b ) { return $a + $b ; } var_dump ( summa ( 1 , 2 )); // skriver ut int(3) var_dump ( summa ( 1.6 , 2.3 )); // skriver ut int(3)
Strikt skrivning
Utan strikt skrivning aktiverat:
$f1 = fn ( $a , $b ) : int => $a + $b ; $f2 = fn ( int $a , int $b ) => $a + $b ; var_dump ( $f1 ( 1.3 , 2.6 )); // skriver ut int(3) var_dump ( $f1 ( 1 , '2' )) ; // skriver ut int(3) var_dump ( $f2 ( 1.3 , 2.6 )); // skriver ut int(3) var_dump ( $f2 ( 1 , '2' ) ); // skriver ut int(3)
Med strikt skrivning aktiverat:
deklarera ( strikta_typer = 1 );
$f1 = fn ( $a , $b ) : int => $a + $b ; $f2 = fn ( int $a , int $b ) => $a + $b ; var_dump ( $f1 ( 1.3 , 2.6 )); // Fatalt fel: Returvärdet måste vara av typen int, float returnerade var_dump ( $f1 ( 1 , '2' )) ; // skriver ut int(3) var_dump ( $f2 ( 1.3 , 2.6 )); // Fatalt fel: Argument #1 ($a) måste vara av typen int, float givet var_dump ( $f2 ( 1 , '2' )) ; // Fatalt fel: Argument #2 ($b) måste vara av typen int, sträng given
Anonyma funktioner
PHP stöder äkta anonyma funktioner från och med version 5.3. I tidigare versioner stödde PHP endast kvasi-anonyma funktioner genom funktionen create_function() .
$x = 3 ; $func = funktion ( $z ) { return $z * 2 ; }; echo $func ( $x ); // skriver ut 6
Eftersom version 7.4 PHP även stöder syntax för pilfunktioner ( => )
.
$x = 3 ; $func = fn ( $z ) => $z * 2 ; echo $func ( $x ); // skriver ut 6
Stängningar
Skapar stängningar
$add = fn ( $x ) => fn ( $y ) => $y + $x ; /* Motsvarar */ $add = function ( $x ) { return function ( $y ) use ( $x ) { return $y + $x ; }; };
använder sig av
$f = $add ( 5 ); eko $f ( 3 ); // skriver ut 8 echo $add ( 2 )( 4 ); // skriver ut 6
Generatorer
Med hjälp av generatorer kan vi skriva kod som använder foreach för att iterera över en datauppsättning utan att behöva skapa en array i minnet, vilket kan resultera i minneskostnader eller betydande bearbetningstid för generering.
Föremål
Grundläggande objektorienterad programmeringsfunktionalitet lades till i PHP 3. Objekthanteringen skrevs om helt för PHP 5, vilket utökade funktionsuppsättningen och förbättrade prestandan. I tidigare versioner av PHP hanterades objekt som primitiva typer . Nackdelen med denna metod var att hela objektet kopierades när en variabel tilldelades eller skickades som en parameter till en metod. I det nya tillvägagångssättet refereras objekt med handle och inte efter värde. PHP 5 introducerade privata och skyddade medlemsvariabler och metoder, tillsammans med abstrakta klasser och slutliga klasser samt abstrakta metoder och slutliga metoder . Den introducerade också ett standardsätt för att deklarera konstruktörer och destruktorer , liknande det för andra objektorienterade språk som C++ , och en standardmodell för undantagshantering . Dessutom lade PHP 5 till gränssnitt och möjliggör att flera gränssnitt kan implementeras. Det finns speciella gränssnitt som gör att objekt kan interagera med runtime-systemet. Objekt som implementerar ArrayAccess kan användas med arraysyntax och objekt som implementerar Iterator eller IteratorAggregate kan användas med foreach- språkkonstruktionen . Den statiska metoden och klassvariabelfunktionerna i Zend Engine 2 fungerar inte som vissa förväntar sig. Det finns ingen virtuell tabellfunktion i motorn, så statiska variabler är bundna med ett namn istället för en referens vid kompilering.
Det här exemplet visar hur man definierar en klass, Foo
, som ärver från klassen Bar
. Metoden myStaticMethod
är en offentlig statisk metod som kan anropas med Foo::myStaticMethod();
.
klass Foo utökar Bar { function __construct () { $doo = "wah dee dee" ; } offentlig statisk funktion myStaticMethod () { $dee = "dee dee dum" ; } }
Om utvecklaren skapar en kopia av ett objekt med det reserverade ordet clone kommer Zend-motorn att kontrollera om en __clone()-
metod har definierats eller inte. Om inte, anropar den en standard __clone()
som kopierar objektets egenskaper. Om en __clone()
-metod är definierad, kommer den att ansvara för att ställa in nödvändiga egenskaper i det skapade objektet. För enkelhetens skull kommer motorn att tillhandahålla en funktion som importerar egenskaperna för källobjektet, så att programmeraren kan börja med en replika av källobjektet med bivärde och bara åsidosätta egenskaper som behöver ändras.
Egenskaper
Det här exemplet använder en egenskap för att förbättra andra klasser:
// Mallegenskapen TSingleton { private static $_instance = null ; privat funktion __construct () {} // Måste ha privat standardkonstruktor och vara medveten om att den inte öppnas i klassen public static function getInstance () { if ( null === self :: $_instance ) { self :: $_instance = nytt jag (); } returnera själv :: $_instance ; } } klass FrontController { använd TSingleton ; } // Kan även användas i redan utökade klasser class WebSite extends SomeClass { use TSingleton ; }
Detta gör det möjligt att simulera aspekter av multipelt arv:
egenskap TBounding { public $x , $y , $width , $height ; } trait TMoveable { public function moveTo ( $x , $y ) { // … } } trait TResizeable { public function resize ( $newWidth , $newHeight ) { // … } } class Rectangle { use TBounding , TMoveable , TResizeable ; public function fillColor ( $color ) { // … } }