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

?>

Typomvandling i PHP

Typomvandling i PHP innebär att konvertera ett värde till en vald typ genom att skriva typen inom parenteser före värdet som ska konverteras.

PHP <?php $foo = 10; // $foo är ett heltal $bar = (bool) $foo; // $bar är en boolean ?> De tillåtna typerna för omvandling är:

  • (int) - omvandla till int
  • (bool) - omvandla till bool
  • (float) - omvandla till float
  • (string) - omvandla till sträng
  • (array) - omvandla till array
  • (object) - omvandla till objekt
  • (unset) - omvandla till NULL

Notera

  • (integer) är ett alias för (int)-omvandlingen.
  • (boolean) är ett alias för (bool)-omvandlingen.
  • (binary) är ett alias för (string)-omvandlingen.
  • (double) och (real) är alias för (float)-omvandlingen.

Dessa omvandlingar använder inte det kanoniska typnamnet och rekommenderas inte.

Varning

  • Aliaset (real) har avskaffats från och med PHP 8.0.0.
  • Aliaset (unset) har avskaffats från och med PHP 7.2.0. Notera att (unset)-omvandlingen är densamma som att tilldela värdet NULL till variabeln eller anropet. (unset)-omvandlingen har tagits bort från och med PHP 8.0.0.

Försiktighet

Aliaset (binary) och prefixet b finns för framtida stöd. För närvarande är (binary) och (string) identiska, men detta kan ändras och bör inte förlitas på.

Notera

Mellanslag ignoreras inom parenteserna för en typomvandling. Därför är följande två omvandlingar ekvivalenta:

PHP

<?php

$foo = (int) $bar;

$foo = ( int ) $bar;

?>

Omvandling av bokstavliga strängar och variabler till binära strängar:

PHP

<?php

$binary = (binary) $string;

$binary = b"binary string";

?>

Notera: Istället för att omvandla en variabel till en sträng är det också möjligt att omsluta variabeln med dubbla citattecken.

PHP

<?php

$foo = 10; // $foo är ett heltal

$str = "$foo"; // $str är en sträng $fst = (string)

$foo; // $fst är också en sträng

// Detta skriver ut att "de är samma" if ($fst === $str) {

   echo "de är samma";

}

?>

Det kanske inte är uppenbart exakt vad som händer när man omvandlar mellan vissa typer. För mer information, se dessa avsnitt:

  • Konvertering till boolean
  • Konvertering till integer
  • Konvertering till float
  • Konvertering till sträng
  • Konvertering till array
  • Konvertering till objekt
  • Konvertering till resurs
  • Konvertering till NULL
  • Tabeller för typjämförelse

Notera: Eftersom PHP stöder indexering i strängar via förskjutningar med samma syntax som arrayindexering, håller följande exempel sant för alla PHP-versioner:

PHP

<?php

$a = 'bil'; // $a är en sträng

$a[0] = 'b'; // $a är fortfarande en sträng

echo $a; // bar

?>