Uneven division of an integer variable by another integer variable will result in a float by automatic conversion -- you do not have to cast the variables to floats in order to avoid integer truncation (as you would in C, for example):
$dividend = 2;
$divisor = 3;
$quotient = $dividend/$divisor;
print $quotient; // 0.66666666666667Префрлање на типови
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Префрлање на типови
Референца за `language.types.type-juggling.php` со подобрена типографија и навигација.
Префрлање на типови
PHP не бара експлицитно дефинирање на тип при декларирање на променлива. Во овој случај, типот на променливата се одредува според вредноста што ја содржи. Тоа значи, ако на string му е доделена променлива $varСодржи какви било информации за патеката обезбедени од клиентот што следат по името на датотеката на тековната скрипта, но предничат на низата за прашање, ако е достапно. На пример, ако тековната скрипта беше пристапена преку URI $var е од тип string. Ако подоцна int вредност му е доделена на $var, ќе биде од тип int.
PHP може автоматски да се обиде да го претвори типот на вредност во друг во одредени контексти. Различните контексти што постојат се:
- Нумерички
- Низа
- Логички
- Интегрален и стринг
- Компаративен
- Следниве промени се направени на функциите на вклучените екстензии.
Забелешка: Кога вредноста треба да се толкува како различен тип, самата вредност not ги менува типовите.
За да се присили променлива да се процени како одреден тип, видете го делот за Префрлање на типови. За да го промените типот на променлива, видете го settype() function.
Нумерички контексти
Ова е контекст кога се користи аритметички оператор.
Во овој контекст ако еден од операндите е float (или не може да се толкува како int), двата операнди се толкуваат како float, а резултатот ќе биде float. Инаку, операндите ќе се толкуваат како int, а резултатот исто така ќе биде int. Од PHP 8.0.0, ако еден од операндите не може да се толкува како TypeError се фрла.
Контексти на низи
Ова е контекст кога се користи echo, print, s е фактот дека имињата на променливите ќе бидат проширени. Видете, или низата оператор за спојување.
Во овој контекст вредноста ќе се толкува како string. Ако вредноста не може да се толкува како TypeError се фрла. Пред PHP 7.4.0, беше кренат E_RECOVERABLE_ERROR беше кренат.
Логички контексти
Ова е контекст кога се користат условни изрази, , кој зема три вредности; ова обично се нарекува едноставно „тернарен оператор“ (иако можеби поправилно би се нарекол условен оператор)., или логички оператор.
Во овој контекст вредноста ќе се толкува како bool.
Интегрални и контексти на низи
Ова е контекст кога се користи бинарни оператори.
Во овој контекст ако сите операнди се од тип string резултатот исто така ќе биде string. Инаку, операндите ќе се толкуваат како int, а резултатот исто така ќе биде int. Од PHP 8.0.0, ако еден од операндите не може да се толкува како TypeError се фрла.
Компаративни контексти
Ова е контекстот кога се користи оператор за споредба.
Конверзиите на типови што се случуваат во овој контекст се објаснети во Споредба со различни типови table.
Функциски контексти
Ова е контекстот кога вредност се проследува на типизиран параметар, својство или се враќа од функција што декларира тип на враќање.
Во овој контекст вредноста мора да биде вредност од типот. Постојат два исклучока, првиот е: ако вредноста е од тип int а декларираниот тип е float, тогаш цел број се претвора во број со пловечка точка. Вториот е: ако декларираниот тип е scalar тип, вредноста може да се претвори во скаларен тип, а режимот на присилна типизација е активен (стандардно), вредноста може да се претвори во прифатена скаларна вредност. Погледнете подолу за опис на ова однесување.
Внатрешни функции
автоматски да присили null во скаларни типови, ова однесување е DEPRECATED од PHP 8.1.0.
Присилна типизација со едноставни декларации на типови
- bool декларација на тип: вредноста се толкува како bool.
- int декларација на тип: вредноста се толкува како int ако конверзијата е добро дефинирана. На пример низата е numeric.
- float декларација на тип: вредноста се толкува како float ако конверзијата е добро дефинирана. На пример низата е numeric.
- string декларација на тип: вредноста се толкува како string.
Присилна типизација со унија од типови
Кога strict_types не е овозможено, декларациите за скаларни типови подлежат на ограничени имплицитни коерции на типови. Ако точниот тип на вредноста не е дел од унијата, тогаш целниот тип се избира по следниот редослед на претпочитаност:
Како исклучок, ако вредноста е стринг и и int и float се дел од унијата, претпочитаниот тип се одредува според постоечките
нумерички стринг
семантики. На пример, за "42" int се избира, додека за "42.0" float се избира.
Забелешка:
Типовите што не се дел од горната листа на претпочитаност не се подобни цели за имплицитна коерција. Особено, нема имплицитни коерции кон null, falseПрепорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во true типови.
Пример #1 Пример за коерција на типови во тип што е дел од унијата
<?php
// int|string
42 --> 42 // exact type
"42" --> "42" // exact type
new ObjectWithToString --> "Result of __toString()"
// object never compatible with int, fall back to string
42.0 --> 42 // float compatible with int
42.1 --> 42 // float compatible with int
1e100 --> "1.0E+100" // float too large for int type, fall back to string
INF --> "INF" // float too large for int type, fall back to string
true --> 1 // bool compatible with int
[] --> TypeError // array not compatible with int or string
// int|float|bool
"45" --> 45 // int numeric string
"45.0" --> 45.0 // float numeric string
"45X" --> true // not numeric string, fall back to bool
"" --> false // not numeric string, fall back to bool
"X" --> true // not numeric string, fall back to bool
[] --> TypeError // array not compatible with int, float or bool
?>Префрлање на типови
Префрлањето на типови ја претвора вредноста во избран тип со пишување на типот во загради пред вредноста што треба да се претвори.
Пример #2 Префрлање на типови
<?php
$foo = 10; // $foo is an integer
$bar = (bool) $foo; // $bar is a boolean
var_dump($bar);
?>Дозволени префрлања се:
(int)- префрлање кон int(bool)- префрлање кон bool(float)- префрлање кон float(string)- префрлање кон string(array)- префрлање кон array(object)- префрлање кон object(unset)- префрлање кон NULL
(integer) е алијас на (int) cast.
(boolean) е алијас на (bool) cast.
(binary) е алијас на (string) cast.
(double) and (real) се алијаси на (float) префрлање. Овие префрлања не ја користат канонската ознака на типот и се застарени од PHP 8.5.0.
На (real) алијасот за префрлање е застарен од PHP 7.4.0 и отстранет од PHP 8.0.0.
На (unset) префрлањето е застарено од PHP 7.2.0. Имајте предвид дека (unset) кастингот е ист како доделување на вредноста NULL на променливата или повикот. На (unset) кастингот е отстранет од PHP 8.0.0.
На (binary) каст и b префиксот постои за поддршка нанапред. Моментално (binary) and
(string) се идентични, но ова може да се промени и не треба да се потпирате на тоа.
Забелешка:
Белите знаци се игнорираат во заградите на кастингот. Затоа, следните два каста се еквивалентни:
<?php
$foo = (int) $bar;
$foo = ( int ) $bar;
?>
Кастинг литерал stringи променливи во бинарни stringи:
<?php
$binary = (binary) $string;
$binary = b"binary string";
?>Наместо кастинг на променлива во string, исто така е можно променливата да се стави во двојни наводници.
Пример #3 Различни механизми за кастинг
<?php
$foo = 10; // $foo is an integer
$str = "$foo"; // $str is a string
$fst = (string) $foo; // $fst is also a string
// This prints out that "they are the same"
if ($fst === $str) {
echo "they are the same", PHP_EOL;
}
?>Можеби не е очигледно точно што ќе се случи при кастинг помеѓу одредени типови. За повеќе информации, видете ги овие делови:
- Конвертирање во буловски тип
- Конвертирање во цел број
- Конвертирање во децимален број
- Конвертирање во низа
- Конвертирање во низа
- Конвертирање во објект
- Конвертирање во ресурс
- Претворање во NULL
- Табелите за споредба на типови
Забелешка: Бидејќи PHP поддржува индексирање во strings преку офсети користејќи ја истата синтакса како array индексирање, следниот пример важи за сите верзии на PHP:
Погледнете го делот со наслов Пристап до стринг по карактер Користење на PHP од командната линијаПример #4 Користење на офсет на низа со стринг
<?php
$a = 'car'; // $a is a string
$a[0] = 'b'; // $a is still a string
echo $a; // bar
?>
Белешки од корисници 6 белешки
Cast operators have a very high precedence, for example (int)$a/$b is evaluated as ((int)$a)/$b, not as (int)($a/$b) [which would be like intdiv($a,$b) if both $a and $b are integers].
The only exceptions (as of PHP 8.0) are the exponentiation operator ** [i.e. (int)$a**$b is evaluated as (int)($a**$b) rather than ((int)$a)**$b] and the special access/invocation operators ->, ::, [] and () [i.e. in each of (int)$a->$b, (int)$a::$b, (int)$a[$b] and (int)$a($b), the cast is performed last on the result of the variable expression].Type casting in expressions is executed first.
The casting is assigned to the value, not to the expression result.
Examples:
<?php
$string = "777";
var_dump( $string === 777 ); // FALSE
var_dump( (int) $string === 777 ); // TRUE
var_dump( ( (int) $string ) === 777 ); // TRUE
var_dump( (int) ( $string === 777 ) ); // 0
?>Casting objects to arrays is a pain. Example:
<?php
class MyClass {
private $priv = 'priv_value';
protected $prot = 'prot_value';
public $pub = 'pub_value';
public $MyClasspriv = 'second_pub_value';
}
$test = new MyClass();
echo '<pre>';
print_r((array) $test);
/*
Array
(
[MyClasspriv] => priv_value
[*prot] => prot_value
[pub] => pub_value
[MyClasspriv] => second_pub_value
)
*/
?>
Yes, that looks like an array with two keys with the same name and it looks like the protected field was prepended with an asterisk. But that's not true:
<?php
foreach ((array) $test as $key => $value) {
$len = strlen($key);
echo "{$key} ({$len}) => {$value}<br />";
for ($i = 0; $i < $len; ++$i) {
echo ord($key[$i]) . ' ';
}
echo '<hr />';
}
/*
MyClasspriv (13) => priv_value
0 77 121 67 108 97 115 115 0 112 114 105 118
*prot (7) => prot_value
0 42 0 112 114 111 116
pub (3) => pub_value
112 117 98
MyClasspriv (11) => second_pub_value
77 121 67 108 97 115 115 112 114 105 118
*/
?>
The char codes show that the protected keys are prepended with '\0*\0' and private keys are prepended with '\0'.__CLASS__.'\0' so be careful when playing around with this.If you want to convert a string automatically to float or integer (e.g. "0.234" to float and "123" to int), simply add 0 to the string - PHP will do the rest.
e.g.
$val = 0 + "1.234";
(type of $val is float now)
$val = 0 + "123";
(type of $val is integer now)