PHP.mk документација

Префрлање на типови

Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.

language.types.type-juggling.php PHP.net прокси Преводот е вчитан
Оригинал на PHP.net
Патека language.types.type-juggling.php Локална патека за оваа страница.
Извор php.net/manual/en Оригиналниот HTML се реупотребува и локално се стилизира.
Режим Прокси + преведен приказ Кодовите, табелите и белешките остануваат читливи во истиот тек.
Префрлање на типови

Референца за `language.types.type-juggling.php` со подобрена типографија и навигација.

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 тип, вредноста може да се претвори во скаларен тип, а режимот на присилна типизација е активен (стандардно), вредноста може да се претвори во прифатена скаларна вредност. Погледнете подолу за опис на ова однесување.

Ги ескејпува специјалните знаци во стринг за употреба во SQL изјава

Внатрешни функции автоматски да присили null во скаларни типови, ова однесување е DEPRECATED од PHP 8.1.0.

Присилна типизација со едноставни декларации на типови

  • bool декларација на тип: вредноста се толкува како bool.
  • int декларација на тип: вредноста се толкува како int ако конверзијата е добро дефинирана. На пример низата е numeric.
  • float декларација на тип: вредноста се толкува како float ако конверзијата е добро дефинирана. На пример низата е numeric.
  • string декларација на тип: вредноста се толкува како string.

Присилна типизација со унија од типови

Кога strict_types не е овозможено, декларациите за скаларни типови подлежат на ограничени имплицитни коерции на типови. Ако точниот тип на вредноста не е дел од унијата, тогаш целниот тип се избира по следниот редослед на претпочитаност:

  1. int
  2. float
  3. string
  4. bool
Ако типот постои во унијата и вредноста може да се коерцира во типот според постоечките семантики за проверка на типови на PHP, тогаш се избира типот. Во спротивно, се пробува следниот тип.
Безбедност: стандардниот сет на знаци

Како исклучок, ако вредноста е стринг и и 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
Ги ескејпува специјалните знаци во стринг за употреба во SQL изјава

(integer) е алијас на (int) cast. (boolean) е алијас на (bool) cast. (binary) е алијас на (string) cast. (double) and (real) се алијаси на (float) префрлање. Овие префрлања не ја користат канонската ознака на типот и се застарени од PHP 8.5.0.

Ги ескејпува специјалните знаци во стринг за употреба во SQL изјава

На (real) алијасот за префрлање е застарен од PHP 7.4.0 и отстранет од PHP 8.0.0.

Ги ескејпува специјалните знаци во стринг за употреба во SQL изјава

На (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;
}
?>

Можеби не е очигледно точно што ќе се случи при кастинг помеѓу одредени типови. За повеќе информации, видете ги овие делови:

Забелешка: Бидејќи PHP поддржува индексирање во strings преку офсети користејќи ја истата синтакса како array индексирање, следниот пример важи за сите верзии на PHP:

Пример #4 Користење на офсет на низа со стринг

<?php
$a
= 'car'; // $a is a string
$a[0] = 'b'; // $a is still a string
echo $a; // bar
?>
Погледнете го делот со наслов Пристап до стринг по карактер Користење на PHP од командната линија

Белешки од корисници 6 белешки

Раџа
21 години пред
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
Анонимен
пред 5 години
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].
Анонимен
пред 1 година
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
?>
fardelian
12 години пред
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.
чудо на 1oo-percent точка де
20 години пред
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)
Анонимен
пред 23 години
Printing or echoing a FALSE boolean value or a NULL value results in an empty string:
(string)TRUE //returns "1"
(string)FALSE //returns ""
echo TRUE; //prints "1"
echo FALSE; //prints nothing!
На оваа страница

Автоматски outline од активната документација.

Насловите ќе се појават тука по вчитување.

Попрегледно читање

Примерите, changelog табелите и user notes се визуелно издвоени за да не се губат во долгата содржина.

Брз совет Користи го outline-от Скокни директно на главните секции од активната страница.
Извор Оригиналниот линк останува достапен Кога ти треба целосен upstream context, отвори го PHP.net во нов tab.