Typkonvertering

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

Typkonvertering i PHP

PHP kräver inte att en variabels typ definieras explicit vid deklaration. Typen för en variabel bestäms av det värde den lagrar. Till exempel, om en sträng tilldelas till variabeln $var, är $var av typen sträng. Om ett heltal senare tilldelas till $var, kommer den att vara av typen int.

PHP kan försöka konvertera en variabels typ automatiskt i vissa sammanhang. De olika sammanhangen inkluderar:

  • Numeriskt
  • Sträng
  • Logiskt
  • Bitvis och sträng
  • Jämförelse
  • Funktion

Notera: När ett värde behöver tolkas som en annan typ, ändras inte typen av värdet.

Numeriska sammanhang

Detta är sammanhanget när man använder en aritmetisk operator.

I detta sammanhang, om någon av operanderna är ett flyttal (eller inte tolkas som ett heltal), tolkas båda operanderna som flyttal, och resultatet blir ett flyttal. Annars tolkas operanderna som heltal, och resultatet blir också ett heltal. Från och med PHP 8.0.0 kastas ett TypeError om en av operanderna inte kan tolkas.

Strängsammanhang

Detta är sammanhanget när man använder echo, print, stränginterpolation eller strängkonkateneringsoperatorn.

I detta sammanhang tolkas värdet som en sträng. Om värdet inte kan tolkas kastas ett TypeError. Innan PHP 7.4.0 utlöstes ett E_RECOVERABLE_ERROR.

Logiska sammanhang

Detta är sammanhanget när man använder villkorssatser, den ternära operatorn eller en logisk operator.

I detta sammanhang tolkas värdet som bool.

Bitvis och strängsammanhang

Detta är sammanhanget när man använder bitvisa operatorer.

I detta sammanhang, om alla operanderna är av typen sträng blir resultatet också en sträng. Annars tolkas operanderna som heltal, och resultatet blir också ett heltal. Från och med PHP 8.0.0 kastas ett TypeError om en av operanderna inte kan tolkas.

Jämförelsesammanhang

Detta är sammanhanget när man använder en jämförelseoperator.

De typkonverteringar som sker i detta sammanhang förklaras i tabellen Jämförelse med olika typer.

Funktionssammanhang

Detta är sammanhanget när ett värde skickas till en typad parameter, egenskap eller returneras från en funktion som deklarerar en returtyp.

I detta sammanhang måste värdet vara av den typen. Två undantag finns: om värdet är av typen int och den deklarerade typen är float, konverteras heltal till ett flyttal. Det andra undantaget är: om den deklarerade typen är en skalär typ, värdet kan konverteras till en skalär typ, och det koerciva typningsläget är aktivt (standard), kan värdet konverteras till en accepterad skalärvärde. Se nedan för en beskrivning av detta beteende.

Varning

Internt funktioner konverterar automatiskt null till skalära typer, detta beteende är FÖRÅLDRAT från och med PHP 8.1.0.

Typkonvertering med enkla typerklaringar

  • bool typdeklaration: värdet tolkas som bool.
  • int typdeklaration: värdet tolkas som int om konverteringen är väldefinierad. Till exempel om strängen är numerisk.
  • float typdeklaration: värdet tolkas som float om konverteringen är väldefinierad. Till exempel om strängen är numerisk.
  • string typdeklaration: värdet tolkas som sträng.

Typkonvertering med unionstyper

När strict_types inte är aktiverat, är skalära typerklaringar föremål för begränsade implicita typkonverteringar. Om den exakta typen av värdet inte är en del av unionen, väljs måltypen i följande ordningsföljd:

  • int
  • float
  • string
  • bool

Om typen finns i unionen och värdet kan konverteras till typen enligt PHP:s befintliga typkontrollsemantik, väljs den typen. Annars prövas nästa typ.

Exempel

PHP <?php

// int|string

42 --> 42 // exakt typ

"42" --> "42" // exakt typ

new ObjectWithToString --> "Resultat av __toString()"

// objekt aldrig kompatibelt med int, faller tillbaka till sträng

42.0 --> 42 // flyttal kompatibelt med int 42.1 --> 42 // flyttal kompatibelt med int

1e100 --> "1.0E+100" // flyttal för stort för int-typ, faller tillbaka till sträng INF --> "INF"

// flyttal för stort för int-typ, faller tillbaka till sträng true --> 1

// bool kompatibelt med int

[] --> TypeError

// array inte kompatibel med int eller sträng

// int|float|bool "45" --> 45

// int numerisk sträng "45.0" --> 45.0

// float numerisk sträng

"45X" --> true // inte numerisk sträng, faller tillbaka till bool

"" --> false // inte numerisk sträng, faller tillbaka till bool "X" --> true // inte numerisk sträng, faller tillbaka till bool

[] --> TypeError // array inte kompatibel med int, float eller bool

?>