Как изменить тип данных php

PHP не требует явного определения типа при объявлении переменной. В этом случае тип переменной определяется значением, которое она хранит. То есть, если переменной $var присваивается значение типа строка (string), то $var изменит тип на строку (string). Если после этого переменной $var будет присвоено значение типа целое число (int), то она изменит тип на целое число (int).

Манипуляции с типами

PHP не требует явного определения типа при объявлении переменной.
В этом случае тип переменной определяется значением, которое она хранит.
То есть, если переменной $var присваивается значение типа строка (string), то
$var изменит тип на строку (string).
Если после этого переменной $var будет присвоено значение типа целое число (int), то она изменит тип на целое число (int).

В определённых контекстах PHP может попытаться автоматически преобразовать тип значения в другой. Существуют следующие различные контексты:

  • Числовой контекст
  • Строчный контекст
  • Логический контекст
  • Контекст целых чисел и строк
  • Сравнительный контекст
  • Контекст функций

Замечание:

Когда значение нужно интерпретировать как другой тип, само значение не меняет тип.

Чтобы принудительно установить тип переменной, смотрите раздел Приведение типа.
Чтобы изменить тип переменной, смотрите описание функции settype().

Числовой контекст

Контекст при использовании
арифметического оператора.

В данном контексте, если один из операндов является числом с плавающей точкой (float) (или не интерпретируется как целое число (int)),
оба операнда интерпретируются как число с плавающей точкой (float)
и результатом будет число с плавающей точкой (float).
В противном случае операнды будут интерпретированы как целое число (int)
и результатом также будет целое число (int).
Начиная с PHP 8.0.0, если один из операндов не может быть интерпретирован, выбрасывается ошибка TypeError.

Строчный контекст

Контекст при использовании функций echo,
print, интерполяции строк
или строкового оператора конкатенации.

В данном контексте значение будет интерпретироваться как строка (string).
Если значение не может быть интерпретировано, выбрасывается ошибка TypeError.
До версии PHP 7.4.0 выдавалась ошибка уровня E_RECOVERABLE_ERROR.

Контекст целых чисел и строк

Контекст при использовании побитовых операторов.

В данном контексте, если у всех операндов тип строка (string), результат также будет строкой (string).
В противном случае операнды будут интерпретированы как целое число (int)
и результат также будет целым числом (int).
Начиная с PHP 8.0.0, если один из операндов не может быть интерпретирован, то будет выброшена ошибка TypeError.

Контекст функций

Контекст, когда значение передаётся типизированному параметру, свойству или возвращается из функции, в которой объявлен тип возвращаемого значения.

В этом контексте значение должно быть значением данного типа.
Существуют два исключения, первое: если тип значения – целое число (int),
а объявленный тип — число с плавающей точкой (float), то целое число преобразуется в число с плавающей точкой.
Второй: если объявленный тип является скалярным типом, значение преобразуется в скалярный тип
и режим строгой типизации активен (по умолчанию), значение может быть преобразовано в допустимое скалярное значение.
Описание такого поведения смотрите ниже.

Внимание

Встроенные функции автоматически подставляют null к скалярным типам,
это поведение УСТАРЕЛО в PHP 8.1.0.

Принудительная типизация с простым объявлением типов


  • Объявление типа bool: значение интерпретируется как логическое значение (bool).

  • Объявление типа int: значение интерпретируется как целое число (int),
    если преобразование хорошо определено. Например, строка является
    числовой строкой.

  • Объявление типа float: значение интерпретируется как число с плавающей точкой (float)
    если преобразование хорошо определено. Например, строка является
    числовой строкой.

  • Объявление типа string: значение интерпретируется как строка (string).

Принудительная типизация с объединением типов

При выключенном strict_types, объявления скалярных типов
подвергаются ограниченному неявному приведению типов.
Если точный тип значения не является частью объединения,
то целевой тип выбирается в следующем порядке предпочтения:


  1. int

  2. float

  3. string

  4. bool

Если тип и существует в объединении и значение может быть приведено к этому типу
в соответствии с существующей семантикой проверки типов PHP, то выбирается этот тип.
В противном случае выбирается следующий тип.

Предостережение

В качестве исключения, если значение является строкой,
а целое число (int) и число с плавающей точкой (float) являются частью объединения,
предпочтительный тип определяется существующей семантикой числовой строки.
Например, для "42" выбирается целое число (int),
а для "42.0" выбирается число с плавающей точкой (float).

Замечание:

Типы, не входящие в приведённый выше список предпочтений, не являются объектами
для неявного приведения. В частности, не происходит неявного приведения
к типам null, false и true.

Пример #1 Пример принудительного включения типов в состав объединения


<?php
// int|string
42 --> 42 // точный тип
"42" --> "42" // точный тип
new ObjectWithToString --> "Результат __toString()"
// объект не совместим с int, переход к string
42.0 --> 42 // float совместимый с int
42.1 --> 42 // float совместимый с int
1e100 --> "1.0E+100" // float слишком велик для типа int, переход к string
INF --> "INF" // float слишком велик для типа int, переход к string
true --> 1 // bool совместимый с int
[] --> TypeError // массив не совместим с int или string

// int|float|bool

"45" --> 45 // int числовая строка
"45.0" --> 45.0 // float числовая строка"45X" --> true // не числовая строка, переход к bool
"" --> false // не числовая строка, переход к bool
"X" --> true // не числовая строка, переход к bool
[] --> TypeError // массив не совместимый с int, float или bool
?>

Приведение типов

Приведение типа преобразует значение к выбранному типу,
записывая тип в круглых скобках перед преобразуемым значением.


<?php
$foo
= 10; // $foo - это целое число
$bar = (bool) $foo; // $bar - это логическое значение
?>

Допускаются следующие приведения типов:

  • (int) — приведение типа к целому числу (int)
  • (bool) — приведение типа к логическому значению (bool)
  • (float) — приведение типа к числу с плавающей точкой (float)
  • (string) — приведение типа к строке (string)
  • (array) — приведение типа к массиву (array)
  • (object) — приведение типа к объекту (object)
  • (unset) — приведение типа к NULL

Замечание:

(integer) является псевдонимом приведения типа (int).
(boolean) является псевдонимом приведения типа (bool).
(binary) является псевдонимом приведения типа (string).
(double) и (real) являются псевдонимами приведения типа (float).
Эти приведения не используют каноническое имя типа и не рекомендуются.

Внимание

Псевдоним приведения типа (real) устарел, начиная с PHP 8.0.0.

Внимание

Приведение типа (unset) устарело, начиная с версии PHP 7.2.0.
Обратите внимание, что приведение (unset) равносильно присвоению переменной или вызову значения NULL.
Приведение (unset) удалено в PHP 8.0.0.

Предостережение

Приведение типа (binary) и префикс b существуют для прямой поддержки.
В настоящее время (binary) и (string) идентичны, однако это может измениться и на это не следует полагаться.

Замечание:

Пробелы игнорируются в круглых скобках при приведении типа.
Таким образом, следующие два приведения типов эквивалентны:


<?php
$foo
= (int) $bar;
$foo = ( int ) $bar;
?>

Приведение строк (string) и переменных к бинарным строкам (string):


<?php
$binary
= (binary) $string;
$binary = b"binary string";
?>

Замечание:

Вместо приведения переменной к типу строка (string) можно также заключить переменную в двойные кавычки.


<?php
$foo
= 10; // $foo является целым числом
$str = "$foo"; // $str является строкой
$fst = (string) $foo; // $fst также является строкой

// Выводит, что "они одинаковые"

if ($fst === $str) {
echo
"они одинаковые";
}
?>

Может быть неочевидно, что именно произойдёт при преобразовании между определёнными типами.
Для получения дополнительной информации смотрите эти разделы:

  • Преобразование типа к логическому значению (boolean)
  • Преобразование типа к целому числу (integer)
  • Преобразование типа к числу с плавающей точкой (float)
  • Преобразование типа к строке (string)
  • Преобразование типа к массиву (array)
  • Преобразование типа к объекту (object)
  • Преобразование типа к ресурсу (resource)
  • Преобразование типа к NULL
  • Таблицы сравнения типов

Замечание:

Поскольку PHP поддерживает индексацию в строках (string) с помощью смещения, используя тот же синтаксис,
что и индексация в массивах (array), следующий пример справедлив для всех версий PHP:


<?php
$a
= 'car'; // $a является строкой
$a[0] = 'b'; // $a по-прежнему является строкой
echo $a; // bar
?>


Дополнительную информацию смотрите в разделе Доступ к символу в строке и его изменение.

Raja

18 years ago


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


Anonymous

2 years ago


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].

Anonymous

3 years ago


"An example of PHP's automatic type conversion is the multiplication operator '*'. If either operand is a float, then both operands are evaluated as floats, and the result will be a float. Otherwise, the operands will be interpreted as integers, and the result will also be an integer. Note that this does not change the types of the operands themselves; the only change is in how the operands are evaluated and what the type of the expression itself is."

I understand what the doc is trying to say here, but this sentence is not correct as stated, other types can be coerced into floats.

e.g.

<?php
$a
= "1.5"; // $a is a string
$b = 100; // $b is an int
$c = $a * $b; // $c is a float, value is 150
// multiplication resulted in a float despite fact that neither operand was a float


fardelian

9 years ago


Casting objects to arrays is a pain. Example:

<?phpclass 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:

<?phpforeach ((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 '*' and private keys are prepended with ''.__CLASS__.'' so be careful when playing around with this.


yury at krasu dot ru

20 years ago


incremental operator ("++") doesn't make type conversion from boolean to int, and if an variable is boolean and equals TRUE than after ++ operation it remains as TRUE, so:

$a = TRUE;
echo ($a++).$a;  // prints "11"


miracle at 1oo-percent dot de

16 years ago


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)


rmirabelle

12 years ago


The object casting methods presented here do not take into account the class hierarchy of the class you're trying to cast your object into.

/**
     * Convert an object to a specific class.
     * @param object $object
     * @param string $class_name The class to cast the object to
     * @return object
     */
    public static function cast($object, $class_name) {
        if($object === false) return false;
        if(class_exists($class_name)) {
            $ser_object     = serialize($object);
            $obj_name_len     = strlen(get_class($object));
            $start             = $obj_name_len + strlen($obj_name_len) + 6;
            $new_object      = 'O:' . strlen($class_name) . ':"' . $class_name . '":';
            $new_object     .= substr($ser_object, $start);
            $new_object     = unserialize($new_object);
            /**
             * The new object is of the correct type but
             * is not fully initialized throughout its graph.
             * To get the full object graph (including parent
             * class data, we need to create a new instance of
             * the specified class and then assign the new
             * properties to it.
             */
            $graph = new $class_name;
            foreach($new_object as $prop => $val) {
                $graph->$prop = $val;
            }
            return $graph;
        } else {
            throw new CoreException(false, "could not find class $class_name for casting in DB::cast");
            return false;
        }
    }


Anonymous

20 years ago


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!

ieee at REMOVE dot bk dot ru

10 years ago


There are some shorter and faster (at least on my machine) ways to perform a type cast.
<?php
$string
='12345.678';
$float=+$string;
$integer=0|$string;
$boolean=!!$string;
?>

Dhairya Lakhera

3 years ago


Value of uninitialized variable of different data types.

settype($a,'bool');
var_dump($a);         //boolean false

settype($b,'string');
var_dump($b);        //string '' (length=0)

settype($c,'array');
var_dump($c);        //array (size=0)  empty

settype($d,'int');
var_dump($d);       //int 0

settype($e,'float');
var_dump($e);      //float 0

settype($f,'object');
var_dump($f);     //object(stdClass)[1]


kuzawinski dot marcin at NOSPAM dot gmail dot com

8 years ago


You REALLY must be aware what you are doing, when you cast a lot  in your code. For example, you can accidentaly change FALSE to TRUE  (probably not in one line, like here):

if(TRUE === (boolean) (array) (int) FALSE) {
    kaboom();
}


martinscotta at gmail dot com

12 years ago


in response to bhsmither at gmail.com

It raises a warning because of the bad enquoted variable

<?php

error_reporting

( E_ALL | E_STRICT );$foo['ten'] = 10;        // $foo['ten'] is an array holding an integer at key "ten"
$str = "{$foo['ten']}"// works "10"
$str = "$foo[ten]";      // DO NOT work!


jphansen at uga dot edu

11 years ago


Type casting from string to int and vice versa is probably the most common conversation. PHP does this very simply through the +. and .= operators, removing any explicit casting:

<?php
$x
= 1;
var_dump($x); // int(1)
$x .= 1;
var_dump($x); // string(2) "11"; also an empty string ("") would cast to string without changing $x$x = "1";
var_dump($x);  // string(1) "1"
$x += 1;
var_dump($x); // int(2); also a zero value (0) would cast to int without changing $x
?>


Anonymous

11 years ago


namaroulis stated "I found it tricky to check if a posted value was an integer"; to test if a variable is a number or a numeric string (such as form input, which is always a string), you must use is_numeric():

<?php
$_POST
['a'] = "42";is_numeric( $_POST['a'] ); // true
?>


hemi68 at hotmail dot com

11 years ago


Cast a string to binary using PHP < 5.2.1

$binary = unpack('c*', $string);


namaroulis at gmail dot com

11 years ago


I found it tricky to check if a posted value was an integer.

<?php

$_POST

['a'] = "42";is_int( $_POST['a'] ); //false
is_int( intval( "anything" ) ); //always true
?>

A method I use for checking if a string represents an integer value.

<?php
function check_int( $str )
                {
                    return 
is_numeric( $str ) && intval( $str ) - $str == 0;
                }
?>


bhsmither at gmail.com

12 years ago


<?php
$foo
['ten'] = 10;            // $foo['ten'] is an array holding an integer at key "ten"
$str = "$foo['ten']";        // throws T_ENCAPSED_AND_WHITESPACE error
$str = "$foo[ten]";          // works because constants are skipped in quotes
$fst = (string) $foo['ten']; // works with clear intention
?>

edgar dot klerks at gmail dot com

13 years ago


It seems (unset) is pretty useless. But for people who like to make their code really compact (and probably unreadable). You can use it to use an variable and unset it on the same line:

Without cast:

<?php

$hello

= 'Hello world';
print
$hello;
unset(
$hello);?>

With the unset cast:

<?php

$hello

= 'Hello world';
$hello = (unset) print $hello;?>

Hoorah, we lost another line!


hek at theeks dot net

14 years ago


It would be useful to know the precedence (for lack of a better word) for type juggling.  This entry currently explains that "if either operand is a float, then both operands are evaluated as floats, and the result will be a float" but could (and I think should) provide a hierarchy that indicates, for instance, "between an int and a boolean, int wins; between a float and an int, float wins; between a string and a float, string wins" and so on (and don't count on my example accurately capturing the true hierarchy, as I haven't actually done the tests to figure it out).  Thanks!

berniev

7 years ago


May be expected, but not stated ..
Casting to the existing (same) type has no effect.
$t = 'abc';          // string 'abc'
$u=(array) $t;   // array 0 => string 'abc'  <-- now an array
$v=(array) $u;  // array 0 => string 'abc'  <-- unchanged

lucazd at gmail dot com

14 years ago


@alexgr (20-Jun-2008)

Correct me if I'm wrong, but that is not a cast, it might be useful sometimes, but the IDE will not reflect what's really happening:

<?php
class MyObject {
   
/**
     * @param MyObject $object
     * @return MyObject
     */
   
static public function cast(MyObject $object) {
        return
$object;
    }
   
/** Does nothing */
   
function f() {}
}

class

X extends MyObject {
   
/** Throws exception */
   
function f() { throw new exception(); }
}
$x = MyObject::cast(new X);
$x->f(); // Your IDE tells 'f() Does nothing'
?>

However, when you run the script, you will get an exception.


toma at smartsemantics dot com

17 years ago


In my much of my coding I have found it necessary to type-cast between objects of different class types.

More specifically, I often want to take information from a database, convert it into the class it was before it was inserted, then have the ability to call its class functions as well.

The following code is much shorter than some of the previous examples and seems to suit my purposes.  It also makes use of some regular expression matching rather than string position, replacing, etc.  It takes an object ($obj) of any type and casts it to an new type ($class_type).  Note that the new class type must exist:

function ClassTypeCast(&$obj,$class_type){
    if(class_exists($class_type,true)){
        $obj = unserialize(preg_replace"/^O:[0-9]+:"[^"]+":/i",
          "O:".strlen($class_type).":"".$class_type."":", serialize($obj)));
    }
}


wbcarts at juno dot com

14 years ago


WHERE'S THE BEEF?

Looks like type-casting user-defined objects is a real pain, and ya gotta be nuttin' less than a brain jus ta cypher-it. But since PHP supports OOP, you can add the capabilities right now. Start with any simple class.
<?php
class Point {
  protected
$x, $y;

  public function

__construct($xVal = 0, $yVal = 0) {
   
$this->x = $xVal;
   
$this->y = $yVal;
  }
  public function
getX() { return $this->x; }
  public function
getY() { return $this->y; }
}
$p = new Point(25, 35);
echo
$p->getX();      // 25
echo $p->getY();      // 35
?>
Ok, now we need extra powers. PHP gives us several options:
  A. We can tag on extra properties on-the-fly using everyday PHP syntax...
    $p->z = 45; // here, $p is still an object of type [Point] but gains no capability, and it's on a per-instance basis, blah.
  B. We can try type-casting it to a different type to access more functions...
    $p = (SuperDuperPoint) $p; // if this is even allowed, I doubt it. But even if PHP lets this slide, the small amount of data Point holds would probably not be enough for the extra functions to work anyway. And we still need the class def + all extra data. We should have just instantiated a [SuperDuperPoint] object to begin with... and just like above, this only works on a per-instance basis.
  C. Do it the right way using OOP - and just extend the Point class already.
<?php
class Point3D extends Point {
  protected
$z;                                // add extra properties...public function __construct($xVal = 0, $yVal = 0, $zVal = 0) {
   
parent::__construct($xVal, $yVal);
   
$this->z = $zVal;
  }
  public function
getZ() { return $this->z; }  // add extra functions...
}$p3d = new Point3D(25, 35, 45);  // more data, more functions, more everything...
echo $p3d->getX();               // 25
echo $p3d->getY();               // 35
echo $p3d->getZ();               // 45
?>
Once the new class definition is written, you can make as many Point3D objects as you want. Each of them will have more data and functions already built-in. This is much better than trying to beef-up any "single lesser object" on-the-fly, and it's way easier to do.


philip_snyder at hotmail dot com

18 years ago


Re: the typecasting between classes post below... fantastic, but slightly flawed. Any class name longer than 9 characters becomes a problem... SO here's a simple fix:

function typecast($old_object, $new_classname) {
  if(class_exists($new_classname)) {
    // Example serialized object segment
    // O:5:"field":9:{s:5:...   <--- Class: Field
    $old_serialized_prefix  = "O:".strlen(get_class($old_object));
    $old_serialized_prefix .= ":"".get_class($old_object)."":";

    $old_serialized_object = serialize($old_object);
    $new_serialized_object = 'O:'.strlen($new_classname).':"'.$new_classname . '":';
    $new_serialized_object .= substr($old_serialized_object,strlen($old_serialized_prefix));
   return unserialize($new_serialized_object);
  }
  else
   return false;
}

Thanks for the previous code. Set me in the right direction to solving my typecasting problem. ;)


Anonymous

17 years ago


If you have a boolean, performing increments on it won't do anything despite it being 1.  This is a case where you have to use a cast.

<html>
<body> <!-- don't want w3.org to get mad... -->
<?php
$bar
= TRUE;
?>
I have <?=$bar?> bar.
<?php
$bar
++;
?>
I now have <?=$bar?> bar.
<?php
$bar
= (int) $bar;
$bar++;
?>
I finally have <?=$bar?> bar.
</body>
</html>

That will print

I have 1 bar.
I now have 1 bar.
I finally have 2 bar.


Anonymous

11 years ago


Checking for strings to be integers?
How about if a string is a float?

<?php/* checks if a string is an integer with possible whitespace before and/or after, and also isolates the integer */
$isInt=preg_match('/^s*([0-9]+)s*$/', $myString, $myInt);

echo

'Is Integer? ',  ($isInt) ? 'Yes: '.$myInt[1] : 'No', "n";/* checks if a string is an integer with no whitespace before or after  */
$isInt=preg_match('/^[0-9]+$/', $myString);

echo

'Is Integer? ',  ($isInt) ? 'Yes' : 'No', "n";/* When checking for floats, we assume the possibility of no decimals needed.  If you MUST require decimals (forcing the user to type 7.0 for example) replace the sequence:
[0-9]+(.[0-9]+)?
with
[0-9]+.[0-9]+
*/

/* checks if a string is a float with possible whitespace before and/or after, and also isolates the number */

$isFloat=preg_match('/^s*([0-9]+(.[0-9]+)?)s*$/', $myString, $myNum);

echo

'Is Number? ',  ($isFloat) ? 'Yes: '.$myNum[1] : 'No', "n";/* checks if a string is a float with no whitespace before or after */
$isInt=preg_match('/^[0-9]+(.[0-9]+)?$/', $myString);

echo

'Is Number? ',  ($isFloat) ? 'Yes' : 'No', "n";?>


alexgr at gmail dot com

14 years ago


For a Cast to a User Defined Object you can define a cast method:

class MyObject {
    /**
     * @param MyObject $object
     * @return MyObject
     */
    static public function cast(MyObject $object) {
        return $object;
    }
}

In your php page code you can:
$myObject = MyObject::cast($_SESSION["myObject"]);

Then, PHP will validate the value and your IDE will help you.


mbrowne83 (at GM)

8 years ago


The code listed in some of the comments here for supposedly "casting" from one class to another using unserialize/serialize does not actually change the class of the existing object; it creates a new object. So it's not the same as a cast.

Eric Lavoie

8 years ago


(array) null
array(null)

are not the same.

var_dump((array) null) =>
array (size=0)
  empty

var_dump(array (null)) =>
array (size=1)
  0 => null


post_at_henribeige_dot_de

19 years ago


If you want to do not only typecasting between basic data types but between classes, try this function. It converts any class into another. All variables that equal name in both classes will be copied.

function typecast($old_object, $new_classname) {
  if(class_exists($new_classname)) {
    $old_serialized_object = serialize($old_object);
    $new_serialized_object = 'O:' . strlen($new_classname) . ':"' . $new_classname . '":' .
                             substr($old_serialized_object, $old_serialized_object[2] + 7);
    return unserialize($new_serialized_object);
  }
  else
    return false;
}

Example:

class A {
  var $secret;
  function A($secret) {$this->secret = $secret;}
  function output() {echo("Secret class A: " . $this->secret);}
}

class B extends A {
  var $secret;
  function output() {echo("Secret class B: " . strrev($this->secret));}
}

$a = new A("Paranoia");
$b = typecast($a, "B");

$a->output();
$b->output();
echo("Classname $a: " . get_class($a) . "Classname $b: " . get_class($b));

Output of the example code above:

Secret class A: Paranoia
Secret class B: aionaraP
Classname $a: a
Classname $b: b


dimo dot vanchev at bianor dot com

18 years ago


For some reason the code-fix posted by philip_snyder at hotmail dot com [27-Feb-2004 02:08]
didn't work for me neither with long_class_names nor with short_class_names. I'm using PHP v4.3.5 for Linux.
Anyway here's what I wrote to solve the long_named_classes problem:

<?php
function typecast($old_object, $new_classname) {
    if(
class_exists($new_classname)) {
       
$old_serialized_object = serialize($old_object);
       
$old_object_name_length = strlen(get_class($old_object));
       
$subtring_offset = $old_object_name_length + strlen($old_object_name_length) + 6;
       
$new_serialized_object  = 'O:' . strlen($new_classname) . ':"' . $new_classname . '":';
       
$new_serialized_object .= substr($old_serialized_object, $subtring_offset);
        return
unserialize($new_serialized_object);
     } else {
         return
false;
     }
}
?>


tom5025_ at hotmail dot com

18 years ago


function strhex($string)
{
   $hex="";
   for ($i=0;$i<strlen($string);$i++)
       $hex.=dechex(ord($string[$i]));
   return $hex;
}
function hexstr($hex)
{
   $string="";
   for ($i=0;$i<strlen($hex)-1;$i+=2)
       $string.=chr(hexdec($hex[$i].$hex[$i+1]));
   return $string;
}

to convert hex to str and vice versa


nullhilty at gmail dot com

14 years ago


Just a little experiment on the (unset) type cast:

<?php
$var
= 1;
$var_unset = (unset) $var;
$var_ref_unset &= (unset) $var;
var_dump($var);
var_dump($var_unset);
var_dump($var_ref_unset);
?>

output:
int(1)
NULL
int(0)


davaakhuu at outlook dot com

7 years ago


Type Juggling<br/>
   <?php $count = "2 cats"; ?>
   Type: <?php echo gettype($count); ?><br/>
   <?php $count += 3; ?>
   Type: <?php echo gettype($count); ?><br/>
   <?php $cats = "I have " . $count . "cats."; ?>
   Cats: <?php echo gettype($cats); ?><br/>
   <br/>
   Type Casting<br/>
   <?php settype($count, "integer"); ?>
   count: <?php echo gettype($count); ?><br/>

   <?php $count2 = (string)$count; ?>
   count: <?php echo gettype($count); ?><br/>
   count2: <?php echo gettype($count2); ?><br/>

   <?php $test1 = 3; ?>
   <?php $test2 = 3; ?>
   <?php settype($test1, "string"); ?>
   <?php (string)$test2; ?>
   test1: <?php echo gettype($test1); ?><br/>
   test2: <?php echo gettype($test2); ?><br/>


kajsunansis at that gmail

14 years ago


json_decode users consider this, when casting stdClass to array:
<?php
$obj
= new stdClass();
$obj->{"2"} = "id";
$arr = (array) $obj;
$result = isset($arr["2"]) || array_key_exists(2, $arr); // false
?>
..though casting is at least 2x faster than foreach.

Jeffrey

14 years ago


IMAGINATION REQUIRED...

We can be a witness to PHP's 'type-jugglin' in real-time with a simple implementation of a MemoryMap. For the sake our purposes, pretend that this is an empty MemoryMap.
+-------+------+------+-------+
| index | $var | type | value |
+-------+------+------+-------+
|     1 |  --- | NULL |  null |
|     2 |  --- | NULL |  null |
|     3 |  --- | NULL |  null |
|     4 |  --- | NULL |  null |
+-------+------+------+-------+

<?php
# create some variables...
$a = 10;
$b = "Hello";
$c = array(55.45, 98.65);
# Now look at map...
?>
+-------+-------+---------+--------+
| index |  $var |    type |  value |
+-------+-------+---------+--------+
|     1 |    $a | INTEGER |     10 |
|     2 |    $b |  STRING |  Hello |
|     3 | $c[0] |   FLOAT |  55.45 |
|     4 | $c[1] |   FLOAT |  98.65 |
+-------+-------+---------+--------+
<?php
# Now, change the variable types...
$a = "Bye";
$b = 2;
$c[0] = "Buy";
$c[1] = "Now!";
#Look at map...
?>
+-------+-------+---------+--------+
| index |  $var |    type |  value |
+-------+-------+---------+--------+
|     1 |    $a |  STRING |    Bye | <- used to be INTEGER
|     2 |    $b | INTEGER |      2 | <- used to be STRING
|     3 | $c[0] |  STRING |    Buy | <- used to be FLOAT
|     4 | $c[1] |  STRING |  Right | <- used to be FLOAT
+-------+-------+---------+--------+


Вернуться к: Типы

PHP не требует (и не поддерживает) явного типа при определении переменной;
тип переменной определяется по контексту, в котором она используется.
То есть, если вы присвоите значение типа string
переменной $var, то $var станет строкой.
Если вы затем присвоите $var целочисленное значение, она станет целым числом.

Примером автоматического преобразования типа является оператор
сложения ‘+’. Если какой-либо из операндов является float,
то все операнды интерпретируются как float,
и результатом также будет float. В
противном случае операнды будут интерпретироваться как целые числа
и результат также будет целочисленным. Обратите внимание, что это
НЕ меняет типы самих операндов;
меняется только то, как они вычисляются и сам тип выражения.


<?php
$foo 
"0";  // $foo это строка (ASCII 48)
$foo += 2;   // $foo теперь целое число (2)
$foo $foo 1.3;  // $foo теперь число с плавающей точкой (3.3)
$foo "10 Little Piggies"// $foo это целое число (15)
$foo "10 Small Pigs";     // $foo это целое число (15)
?>

Если последние два примера вам непонятны, смотрите
Преобразование строк в числа.

Если вы хотите, чтобы переменная принудительно вычислялась как
определенный тип, смотрите раздел приведение
типов. Если вы хотите изменить тип переменной, смотрите
settype().

Если вы хотите протестировать любой из примеров, приведенных в
данном разделе, вы можете использовать функцию
var_dump().

Замечание:

Поведение автоматического преобразования в массив в настоящий
момент не определено.

К тому же, так как PHP поддерживает индексирование в строках аналогично
смещениям элементов массивов, следующий пример будет верен для всех версий PHP:


<?php
$a    
'car'// $a - это строка
$a[0] = 'b';   // $a все еще строка
echo $a;       // bar
?>

Более подробно смотрите в разделе Доступ к символу
в строке.

Приведение типов

Приведение типов в PHP работает так же, как и в C: имя требуемого
типа записывается в круглых скобках перед приводимой переменной.


<?php
$foo 
10;   // $foo это целое число
$bar = (boolean) $foo;   // $bar это булев тип
?>

Допускаются следующие приведения типов:

  • (int), (integer) — приведение к integer
  • (bool), (boolean) — приведение к boolean
  • (float), (double), (real) — приведение к float
  • (string) — приведение к string
  • (array) — приведение к array
  • (object) — приведение к object
  • (unset) — приведение к NULL (PHP 5)

Приведение типа (binary) и поддержка префикса b были добавлены в PHP 5.2.1

Обратите внимание, что внутри скобок допускаются пробелы и
символы табуляции, поэтому следующие примеры равносильны по своему
действию:


<?php
$foo 
= (int) $bar;
$foo = ( int ) $bar;
?>

Приведение строковых литералов и переменных к бинарным строкам:


<?php
$binary 
= (binary) $string;
$binary b"binary string";
?>

Замечание:

Вместо использования приведения переменной к string, можно также заключить
ее в двойные кавычки.


<?php
$foo 
10;            // $foo - это целое число
$str "$foo";        // $str - это строка
$fst = (string) $foo// $fst - это тоже строка

// Это напечатает "они одинаковы"

if ($fst === $str) {
    echo 
"они одинаковы";
}
?>

Может быть не совсем ясно, что именно происходит при приведении между типами.
Для дополнительной информации смотрите разделы:


  • Преобразование в булев тип

  • Преобразование в целое число

  • Преобразование в число с плавающей точкой

  • Преобразование в строку

  • Преобразование в массив

  • Преобразование в объект

  • Преобразование в ресурс

  • Преобразование в NULL

  • Таблицы сравнения типов

Вернуться к: Типы

PHP: Приведение типов

  • Приведение к целому числу
  • Приведение к числу с плавающей точкой
  • Приведение к булеву типу
  • Приведение к строке
  • Приведение к NULL

Приведение типа — это преобразование значения одного типа в значение другого типа.

Есть два вида приведения типов:

  • явное
  • неявное

Неявное приведение типа выполняется интерпретатором автоматически, без непосредственного участия программиста. Например, значение будет автоматически преобразовано, если оператор ожидает, числовые операнды:

$sum = "3" + 4;  // Строка "3" будет неявно преобразована в число 3

Чтобы выполнить явное приведение, нужно указать в круглых скобках имя требуемого типа непосредственно перед приводимым значением или переменной:

<?php
$num = (int)"50";
echo gettype($num);
?>

Запись имени типа в круглых скобках называется оператором приведения типа. Допускаются следующие операторы приведения типов:

  • (int), (integer) — приведение к integer.
  • (bool), (boolean) — приведение к boolean.
  • (float), (double), (real) — приведение к float.
  • (string) — приведение к string.
  • (array) — приведение к array.
  • (object) — приведение к object.
  • (unset) — приведение к NULL.

Приведение к целому числу

При приведении bool в integer, FALSE преобразуется в 0 (нуль), а TRUE — в 1 (единицу). При приведении float в integer, дробная часть будет округлена в сторону нуля. Значение NULL преобразуется в 0:

echo (int)FALSE, "<br>";   // 0
echo (int)TRUE, "<br>";    // 1
echo (int)12.3, "<br>";    // 12
echo (int)NULL;            // 0

Строки преобразуются по следующим правилам:

  • Если первый символ строки является цифрой, знаком + или -, то интерпретатор переходит к анализу второго символа, если второй символ строки является цифрой, то интерпретатор переходит к анализу третьего символа и так до тех пор, пока не будет обнаружен символ отличный от цифры, после этого интерпретатор возвращает полученное целое число.
  • Если строка пустая или первый символ строки не является цифрой, знаком + или -, она преобразуется в 0.
echo (int)"12abc", "<br>";    // 12
echo (int)"a123bc", "<br>";   // 0
echo (int)"-12", "<br>";      // -12
echo (int)"12.3", "<br>";     // 12
echo (int)"";                 // 0

Для других типов поведение преобразования в integer не определено. Поэтому не нужно полагаться на любое наблюдаемое поведение, так как оно может измениться без предупреждения.

Приведение к числу с плавающей точкой

Строки преобразуются по следующим правилам:

  • Если первый символ строки является цифрой, точкой, знаком + или -, то интерпретатор переходит к анализу второго символа, если второй символ строки является цифрой, точкой (если перед этим была цифра), буквой e или E (если перед этим была цифра или точка), то интерпретатор переходит к анализу третьего символа и так до тех пор, пока не будет обнаружен символ, который не может быть преобразован в числовое значение, после этого интерпретатор возвращает полученное число с плавающей точкой.
  • Если строка пустая или первый символ строки не является цифрой, точкой, знаком + или -, она преобразуется в 0.
echo (float)"12abc", "<br>";    // 12
echo (float)"a123bc", "<br>";   // 0
echo (float)"-12", "<br>";      // -12
echo (float)"12.3", "<br>";     // 12.3
echo (float)".13", "<br>";      // 0.13
echo (float)"1.2e5", "<br>";    // 120000
echo (float)"1.e5";             // 100000

Значения других типов сначала преобразуются в integer, а затем уже из integer происходит преобразование в тип float.

Приведение к булеву типу

Следующие значения в результате преобразования дают значение FALSE:

  • само значение FALSE
  • 0 и 0.0 (нуль)
  • пустая строка, и строка «0»
  • массив без элементов
  • NULL
  • Объекты SimpleXML, созданные из пустых тегов

Все остальные значения при преобразовании дают в результате значение TRUE. Значение FALSE и шесть значений, которые при преобразовании приводятся к этому значению, обычно называют ложными значениями, а все остальные — истинными:

echo (bool)"", ": FALSE", "<br>";   // FALSE
echo (bool)1, ": TRUE", "<br>";     // TRUE
echo (boolean)[], ": FALSE";        // FALSE

В любом контексте, когда интерпретатор PHP ожидает получить булево значение, ложные значения интерпретируются как FALSE, а истинные значения — как TRUE.

Приведение к строке

Булево значение TRUE преобразуется в строку «1», а значение FALSE преобразуется в "" (пустую строку):

echo (string)TRUE;
echo (string)FALSE, "<br>: пустая строка";

Целое число или число с плавающей точкой преобразуется в строку, состоящую из цифр числа:

echo (string)-123, "<br>";
echo (string)12.4, "<br>";
echo (string)1.4e6;        // "1400000"

Массивы всегда преобразуются в строку "Array":

$arr = [];
echo (string)$arr;

NULL всегда преобразуется в пустую строку:

echo (string)NULL, "пустая строка";

Resource всегда преобразуется в строку вида "Resource id #1".

Для преобразования объекта в строку, объект должен иметь метод __toString():

class Obj {
  public function __toString() {
    return "Object";
  }
}

$obj = new Obj;
echo (string)$obj;

Если объект не имеет метод __toString(), то в результате преобразования будет вызвана фатальная ошибка:

class Obj {}

$obj = new Obj;
echo (string)$obj;   // Будет вызвана ошибка

Приведение к типу NULL не удаляет переменную и её значение, а лишь возвращает значение типа NULL:

$num = 10;
echo gettype((unset)$num), "<br>";
echo $num;

Получение и установка типа переменной. Преобразование типов

Последнее обновление: 12.03.2021

Получение типа переменной

Для получения типа переменной применяется функция gettype(), которая возвращает название типа переменной, например, integer (целое число),
double (число с плавающей точкой), string (строка), boolean (логическое значение),
null, array (массив), object (объект) или unknown type. Например:

<?php
$a = 10;
$b = "10";
echo gettype($a); // integer
echo "<br>";
echo gettype($b);  // string
?>

Также есть ряд специальных функций, которые возвращают true или false в зависимости от того, представляет ли переменная
определенный тип:

  • is_integer($a): возвращает значение true, если переменная $a хранит целое число

  • is_string($a): возвращает значение true, если переменная $a хранит строку

  • is_double($a): возвращает значение true, если переменная $a хранит действительное число

  • is_numeric($a): возвращает значение true, если переменная $a представляет целое или действительное число или
    является строковым представлением числа. Например:

    $a = 10;
    $b = "10";
    echo is_numeric($a);
    echo "<br>";
    echo is_numeric($b);
    

    Оба выражения is_numeric() возвратят true, так как переменная $a представляет число, а переменная $b является строковым представлением числа

  • is_bool($a): возвращает значение true, если переменная $a хранит значение true или FALSE

  • is_scalar($a): возвращает значение true, если переменная $a представляет один из простых типов: строку, целое число,
    действительное число, логическое значение.

  • is_null($a): возвращает значение true, если переменная $a хранит значение null

  • is_array($a): возвращает значение true, если переменная $a является массивом

  • is_object($a): возвращает значение true, если переменная $a содержит ссылку на объект

Установка типа. Функция settype()

С помощью функции settype() можно установить для переменной определенный тип. Она принимает два параметра:
settype("Переменная", "Тип"). В качестве первого параметра используется переменная, тип которой надо установить, а в качестве второго —
строковое описание типа, которое возвращается функцией gettype().

Если удалось установить тип, то функция возвращает true, если нет — то значение false.

Например, установим для переменной целочисленный тип:

<?php
$a = 10.7;
settype($a, "integer");
echo $a; // 10
?>

Поскольку переменная $a представляет действительное число 10.7, то его вполне можно преобразовать в целое число через отсечение дробной части.
Поэтому в данном случае функция settype() возвратит true.

Преобразование типов

По умолчанию PHP при необходимости автоматически преобразует значение переменной из одного типа в другой. По этой причине явные преобразования
в PHP не так часто требуются. Тем не менее мы можем их применять.

Для явного преобразования перед переменной в скобках указыется тип, в который надо выполнить преобразование:

$boolVar = false;
$intVar = (int)$boolVar; // 0
echo "boolVar = $boolVar<br>intVar = $intVar";

В данном случае значение «false» пробразуется в значение типа int, которое будет храниться в переменной $intVar.
А именно значение false преобразуется в число 0. После этого мы сможем использовать данное значение как число.

При использовании выражения echo для вывода на страницу передаваемые значения автоматически преобразуются в строку. И поскольку
переменная boolVar равна false, ее значение будет преобазовано в пустую строку. Тогда как значение 0 преобразуется в
строку «0».

В PHP могут применяться следующие преобразования:

  • (int), (integer): преобразование в int (в целое число)

  • (bool), (boolean): преобразование в bool

  • (float), (double), (real): преобразование в float

  • (string): преобразование в строку

  • (array): преобразование в массив

  • (object): преобразование в object

Преобразование типов PHP

Манипуляции с типами

⁡.⁡Замечание⁡bool или null⁡$b⁡в php, можно побороть ⁡что именно за безобразие, ⁡Любое строгое или нестрогое ⁡, а не ⁡⁢⁡- Возвращает тип переменной⁡⁢⁡0 (ноль)⁡⁢⁡и int, и float. ⁡⁢ ⁡. Единственным исключением из ⁡того же класса, то ⁡⁢⁡Тип union позволяет использовать ⁡⁢ ⁡PHP 7.1.0⁡.⁡⁢

⁡.⁡PHP не требует (и ⁡: Обратите внимание, что ⁡что угодно⁡.⁡функцией ⁡оформленное в виде кода-примера, ⁡сравнение этого значения с ⁡.⁡Приведение типов⁡float⁡⁢⁡В таком случае будет ⁡⁢ ⁡этого правила является передача ⁡выглядит как корректный объединённый ⁡несколько типов, а не ⁡object⁡⁢

<?php
$foo = "1"; // $foo - это строка (ASCII-код 49)
$foo *= 2; // $foo теперь целое число (2)
$foo = $foo * 1.3; // $foo теперь число с плавающей точкой (2.6)
$foo = 5 * "10 Little Piggies"; // $foo - это целое число (50)
$foo = 5 * "10 Small Pigs"; // $foo - это целое число (50)
?>

⁡Объявления типов могут использоваться ⁡Приведение типов в PHP ⁡не поддерживает) явного типа ⁡⁢⁡тернарный оператор является выражением ⁡⁢⁡Преобразуется в тип bool, ⁡$a <= $b⁡⁢

⁡:⁡чтобы можно петицию разработчикам ⁡каким-либо другим, включая его ⁡Если строка не являлась ⁡Манипуляции с типами⁡0.0 (ноль) и -0.0 ⁡⁢⁡выбран наиболее подходящий тип ⁡⁢⁡значения типа int туда, ⁡⁢

⁡тип, даже если фактически ⁡исключительно один. Для их ⁡Значение должно быть объектом ⁡для аргументов функций, возвращаемых ⁡⁢⁡работает так же, как ⁡⁢⁡при определении переменной; тип ⁡⁢

⁡и трактуется не как ⁡⁢⁡< ⁡⁢

⁡Меньше или равно⁡Источник: ⁡PHP отправить.⁡⁢

⁡самого, но исключая ⁡числовой, вызывалась ошибка уровня ⁡Источник: ⁡(минус ноль)⁡по правилу приведения «числовых ⁡где ожидается float.⁡⁢

<?php
$a = 'car'; // $a - это строка
$a[0] = 'b'; // $a всё ещё строка
echo $a; // bar
?>

⁡объявление может быть сокращено ⁡объявления используется следующий синтаксис: ⁡⁢⁡(тип object).⁡значений и, начиная с ⁡⁢⁡и в C: имя ⁡⁢

Приведение типов

⁡переменной определяется по контексту, ⁡переменная, а как результат ⁡object⁡если ⁡.⁡@ИванПшеницын | echo var_dump(intval($stemp)); ⁡⁢

<?php
$foo = 10; // $foo - это целое число
$bar = (boolean) $foo; // $bar - это булев тип
?>

⁡, вернёт ⁡⁢

  • ⁡, а сама строка ⁡.⁡⁢
  • ⁡пустая ⁡строк». К примеру, для ⁡⁢
  • ⁡Внимание⁡до ⁡⁢
  • ⁡. Тип union доступен, ⁡PHP 7.2.0⁡⁢
  • ⁡PHP 7.4.0, для свойств ⁡требуемого типа записывается в ⁡⁢
  • ⁡в котором она используется. ⁡выражения. Это важно знать, ⁡⁢
  • ⁡object⁡$a⁡⁢

⁡Операторы сравнения, как это ⁡//int(509) | echo var_dump($stemp); ⁡(т.е. ⁡приводилась к числу ⁡В PHP, строка (string) ⁡строка⁡будет выбран тип int, ⁡На вызовы из внутренних ⁡⁢

⁡или ⁡начиная с PHP 8.0.0.⁡mixed⁡класса. Они используются во ⁡круглых скобках перед приводимой ⁡То есть, если вы ⁡если вы хотите вернуть ⁡Встроенные классы могут определять ⁡⁢

⁡меньше или равно ⁡видно из их названия, ⁡//float(510)⁡и ⁡.⁡⁢

<?php
$foo = (int) $bar;
$foo = ( int ) $bar;
?>

⁡считается числовой, если её ⁡, и ⁡⁢

<?php
$binary = (binary) $string;
$binary = b"binary string";
?>

⁡а для ⁡⁢⁡функций, действие ⁡⁢

⁡. Аналогично, если ⁡Тип ⁡Значение может иметь любой ⁡время исполнения для проверки, ⁡⁢

<?php
$foo = 10; // $foo - это целое число
$str = "$foo"; // $str - это строка
$fst = (string) $foo; // $fst - это тоже строка

// Это напечатает "они одинаковы"
if ($fst === $str) {
echo "они одинаковы";
}
?>

⁡переменной.⁡присвоите значение типа string ⁡переменную по ссылке. Выражение ⁡свои собственные правила сравнения, ⁡$b⁡⁢

  • ⁡позволяют сравнивать между собой ⁡⁢
  • ⁡Выдержка из ⁡⁢
  • ⁡). Примерами операций, возвращающих ⁡До PHP 7.1.0 не ⁡⁢
  • ⁡можно интерпретировать как целое ⁡⁢
  • ⁡строка⁡⁢
  • ⁡- тип float.⁡⁢
  • ⁡не распространяется.⁡⁢
  • ⁡, то ⁡⁢
  • ⁡можно использовать как часть ⁡⁢

⁡тип.⁡⁢php.net⁡что значение имеет точно ⁡⁢

Преобразование типов PHP

Объявление типов

⁡Допускаются следующие приведения типов:⁡переменной ⁡не будет работать в ⁡объекты разных классов не ⁡.⁡два значения. Возможно вам ⁡мануалов⁡, являются ⁡вызывалась ошибка уровня ни ⁡(int) число или как ⁡⁢⁡»0″⁡⁢⁡Замечание⁡⁢

⁡Для включения строгой типизации ⁡⁢⁡тоже выглядит корректным типом, ⁡⁢

⁡объединений следующим образом: ⁡PHP 8.0.0⁡тот тип, который для ⁡(int), (integer) — приведение ⁡$var⁡функции, возвращающей значение по ⁡сравниваются, про сравнение объектов ⁡$a >= $b⁡⁢

Одиночные типы

⁡будет интересно также ознакомиться ⁡⁢ ⁡:⁡⁢ ⁡, ⁡⁢
⁡, ни ⁡⁢ ⁡число с плавающей точкой ⁡⁢instanceof ⁡массив⁡⁢
⁡:⁡⁢ ⁡используется оператор ⁡⁢instanceof ⁡несмотря на то, что ⁡. Существующая нотация ⁡Внимание⁡них указан. В противном ⁡⁢
⁡к int⁡⁢ ⁡, то ⁡⁢instanceof ⁡ссылке, а в более ⁡одного класса смотрите ⁡Больше или равно⁡⁢
⁡с разделом ⁡⁢ ⁡Точность чисел с плавающей ⁡и ⁡⁢
⁡. ⁡⁢ ⁡(float).⁡⁢⁡без элементов⁡⁢⁡Типы, не входящие в ⁡с объявлением ⁡он может быть сокращён ⁡⁢
⁡рассматривается как сокращение для ⁡⁢ ⁡Псевдонимы для указанных выше ⁡случае будет выброшено исключение ⁡⁢
⁡(bool), (boolean) — приведение ⁡⁢ ⁡$var⁡поздних версиях PHP также ⁡⁢
⁡Сравнение объекта⁡⁢ ⁡если ⁡Сравнение типов⁡⁢
⁡точкой⁡⁢ ⁡.⁡Источник: ⁡⁢
⁡Формально с PHP 8.0.0:⁡⁢ ⁡особый тип ⁡данный список, не подходят ⁡:⁡⁢instanceof ⁡до ⁡⁢⁡.⁡⁢ ⁡скалярных типов не поддерживаются. ⁡⁢
⁡TypeError⁡⁢ ⁡к bool⁡изменит тип на string. ⁡⁢ ⁡будет выдано предупреждение.⁡⁢
⁡string, resource, int или ⁡⁢ ⁡$a⁡, в котором приведено ⁡⁢ ⁡Числа с плавающей точкой ⁡⁢

⁡Сравнение типов ⁡⁢

⁡.⁡В PHP также присутствует ⁡NULL⁡для целей неявного приведения. ⁡Замечание⁡. ⁡Предостережение⁡⁢boolean⁡В случае использования они ⁡.⁡⁢instanceof ⁡(float), (double), (real) — ⁡⁢boolean⁡Если вы затем присвоите ⁡Замечание⁡⁢

<?php
function test(boolean $param) {}
test(true);
?>

⁡float⁡больше или равно ⁡⁢

Warning: "boolean" will be interpreted as a class name. Did you mean "bool"? Write "boolean" to suppress this warning in /in/9YrUX on line 2
Fatal error: Uncaught TypeError: test(): Argument #1 ($param) must be of type boolean, bool given, called in - on line 3 and defined in -:2
Stack trace:
#0 -(3): test(true)
#1 {main}
thrown in - on line 2
mixed

⁡большое количество соответствующих примеров.⁡имеют ограниченную точность. Хотя ⁡$x⁡⁢

Примеры

⁡Следующие таблицы демонстрируют работу ⁡концепция ⁡⁢

<?php
class C {}
class D extends C {}

// Не является наследником C.
class E {}

function f(C $c) {
echo get_class($c)."n";
}

f(new C);
f(new D);
f(new E);
?>

⁡(включая неустановленные переменные)⁡В частности, для ⁡⁢

C
D
Fatal error: Uncaught TypeError: f(): Argument #1 ($c) must be of type C, E given, called in /in/gLonb on line 14 and defined in /in/gLonb:8
Stack trace:
#0 -(14): f(Object(E))
#1 {main}
thrown in - on line 8

⁡:⁡Тип ⁡⁢

<?php
interface I { public function f(); }
class C implements I { public function f() {} }

// Не реализует интерфейс I.
class E {}

function f(I $i) {
echo get_class($i)."n";
}

f(new C);
f(new E);
?>

⁡не может использоваться как ⁡будут считаться за имя ⁡⁢

C
Fatal error: Uncaught TypeError: f(): Argument #1 ($i) must be of type I, E given, called in - on line 13 and defined in -:8
Stack trace:
#0 -(13): f(Object(E))
#1 {main}
thrown in - on line 8

⁡Замечание⁡приведение к float⁡⁢

<?php
function sum($a, $b): float {
return $a + $b;
}

// Обратите внимание, что будет возвращено число с плавающей точкой.
var_dump(sum(1, 2));
?>

⁡$var⁡⁢

float(3)

⁡:⁡⁢

<?php
class C {}

function getC(): C {
return new C;
}

var_dump(getC());
?>

⁡string, resource, int или ⁡⁢

object(C)#1 (0) {
}

Обнуляемые типы

⁡$b⁡Операторы сравнения⁡это зависит
от операционной ⁡и результатов функций PHP, ⁡⁢?⁡PHP с ⁡префиксной⁡объекты ⁡и ⁡⁢null⁡Строгая типизация применяется к ⁡⁢

⁡означает, что функция ничего ⁡отдельный тип.⁡⁢

<?php
class C {}

function f(?C $c) {
var_dump($c);
}

f(new C);
f(null);
?>

⁡класса или интерфейса. К ⁡⁢

object(C)#1 (0) {
}
NULL

⁡:⁡(string) — приведение к ⁡⁢

<?php
function get_item(): ?string {
if (isset($_GET['item'])) {
return $_GET['item'];
} else {
return null;
}
}
?>

⁡значение типа int, она ⁡⁢⁡Рекомендуется избегать «нагромождения» тернарных ⁡⁢

⁡float⁡.⁡Пример⁡системы, в PHP обычно ⁡⁢null⁡связанных с типами⁡типами переменных⁡числовой строки. Это строка, ⁡⁢

⁡SimpleXML⁡неявного приведения не случится.⁡вызовам функций, сделанным ⁡⁢

<?php
class C {}

function f(C $c = null) {
var_dump($c);
}

f(new C);
f(null);
?>

⁡не возвращает. Соответственно, он ⁡⁢

object(C)#1 (0) {
}
NULL

Тип union

⁡Псевдотип ⁡примеру, при использовании в ⁡При переопределении родительского метода, ⁡string⁡⁢T1|T2|...⁡станет целым числом (int).⁡выражений. Поведение PHP неочевидно ⁡⁢

Обнуляемый тип union

⁡Строки и ресурсы переводятся ⁡⁢null ⁡$a $b⁡Название⁡⁢T1|T2|null⁡используется формат двойной
точности ⁡⁢?T ⁡Выражение⁡⁢T|null⁡и ⁡⁢

⁡которая начинается как числовая ⁡⁢

null ⁡, созданные из пустых ⁡Пример #11 Пример приведения ⁡⁢

Псевдотип false

⁡изнутри⁡⁢false ⁡не может быть частью ⁡поддерживается как часть объединённых ⁡качестве типа ⁡тип возвращаемого значения дочернего ⁡⁢false ⁡(array) — приведение к ⁡⁢null ⁡Примером автоматического преобразования типа ⁡при использовании более чем ⁡⁢⁡в числа, обычная математика⁡⁢⁡Космический корабль (spaceship)⁡⁢

⁡Результат⁡⁢

false ⁡IEEE 754, дающий максимальную ⁡gettype()⁡операторами сравнения⁡и продолжается любыми другими ⁡⁢false⁡элементов без атрибутов, то ⁡⁢false|null ⁡для объединённых типов⁡⁢?false⁡файла с включённой строгой ⁡⁢

⁡объединения. Доступно с PHP ⁡⁢

⁡типов. Он добавлен по ⁡⁢true ⁡, он будет ожидать, ⁡⁢ ⁡метода должен соответствовать любому ⁡⁢

Дублирующиеся и повторяющиеся типы

⁡array⁡является оператор умножения ‘*’. ⁡одного тернарного оператора без ⁡array⁡Число типа int меньше, ⁡$a == $b⁡⁢

  • ⁡относительную ошибку округления
    порядка ⁡empty()⁡, как в случае ⁡⁢int|string|INT ⁡символами.⁡⁢
  • ⁡есть элементов, не имеющих ⁡Пример #12 Типизированные параметры, ⁡⁢
  • ⁡типизацией, а не к ⁡7.1.0.⁡историческим причинам, так как ⁡⁢
  • ⁡что значение представляет собой ⁡⁢⁡объявлению возвращаемого типа родительского. ⁡⁢⁡(object) — приведение к ⁡Если какой-либо из операндов ⁡⁢⁡скобок в одном выражении ⁡⁢⁡array⁡⁢

⁡больше или равное нулю, ⁡⁢⁡Равно⁡1.11e-16. Неэлементарные арифметические операции ⁡is_null()⁡свободного, так и в ⁡Когда строку необходимо использовать ⁡⁢

⁡ни дочерних элементов, ни ⁡⁢A ⁡передаваемые по ссылке⁡⁢B ⁡функциям, объявленным в этом ⁡Замечание⁡⁢A|B ⁡многие встроенные функции возвращают ⁡класса или интерфейса ⁡Если в родительском методе ⁡object⁡⁢A ⁡является float, то все ⁡⁢B⁡по сравнению с другими ⁡⁢B extends A {}⁡Массивы с меньшим числом ⁡⁢A|B ⁡когда ⁡если ⁡могут давать
большие ошибки, ⁡isset()⁡⁢A⁡случае строгого сравнения. Также ⁡⁢<?php
function foo(): int|INT {} // Запрещено
function foo(): bool|false {} // Запрещено

use A as B;
function foo(): A|B {} // Запрещено ("use" является частью разрешения имён)

class_alias('X', 'Y');
function foo(): X|Y {} // Допустимо (повторение будет определено только во время выполнения)
?>

Типы, подходящие только для возвращаемого значения

void

⁡в качестве числа (например ⁡⁢void ⁡атрибутов.⁡Объявление типов для параметров, ⁡файле. Если из файла ⁡:⁡вместо ⁡⁢

⁡, а не значение ⁡⁢⁡тип возвращаемого значения не ⁡⁢

⁡(unset) — приведение к ⁡операнды интерпретируются как float, ⁡языками. Действительно, до PHP ⁡элементов считаются меньше, если ⁡$a⁡$a⁡и, разумеется, необходимо принимать ⁡⁢E_NOTICE⁡bool : ⁡⁢Only variable references should be returned by reference⁡эта информация относится к ⁡⁢<?php
function &test(): void {}
?>

never

never ⁡арифметические операции, декларация целочисленного ⁡Все остальные значения рассматриваются ⁡передаваемых по ссылке, проверяется ⁡без включённой строгой типизации ⁡⁢⁡Возврат по ссылке из ⁡⁢⁡в случае ошибок. Классический ⁡типа bool:⁡объявлен, то это можно ⁡NULL⁡и результатом также будет ⁡8.0.0 троичные выражения оценивались ⁡⁢

⁡ключ из первого операнда ⁡соответственно меньше, больше или ⁡равно ⁡во внимание
распространение ошибок ⁡string⁡разделу документации по ⁡типа, и т.д.), используется ⁡⁢

static

⁡как ⁡⁢instanceof ⁡только на этапе вызова ⁡вызывается функция, которая была ⁡функции с возвращаемым типом ⁡⁢

Строгая типизация

⁡пример — функция ⁡Результат выполнения данного примера ⁡сделать в дочернем.⁡Приведение типа (binary) и ⁡float. В противном случае ⁡лево-ассоциативными, а не право-ассоциативными, ⁡не найден во втором ⁡равно ⁡⁢

⁡$b⁡при совместном использовании нескольких
⁡NULL⁡приведению типов⁡следующий алгоритм действий:⁡(включая любой ⁡⁢⁡функции. Нет никакой гарантии, ⁡⁢⁡определена в файле со ⁡void устарел с PHP ⁡strpos()⁡в PHP 8:⁡⁢

⁡Тип⁡⁢

⁡поддержка префикса b существует ⁡операнды будут интерпретироваться как ⁡⁢strict_types ⁡как в большинстве других ⁡⁢

⁡операнде — массивы не ⁡$b⁡⁢declare ⁡после преобразования типов.⁡⁢strict_types⁡операций.⁡⁢

⁡NULL⁡⁢⁡. Вдохновением на создание ⁡⁢

⁡Если строка числовая, представляет ⁡resource⁡⁢⁡что после выхода из ⁡⁢ ⁡строгой типизацией, то будут ⁡8.1.0, потому что такая ⁡.⁡mixed эквивалентен типу union ⁡Описание⁡для прямой поддержки. Обратите ⁡int, и результат также ⁡языков программирования. Использование лево-ассоциативности ⁡могут сравниваться, иначе идёт ⁡.⁡$a === $b⁡Кроме того, рациональные числа, ⁡$x⁡⁢

⁡этого раздела мы обязаны ⁡⁢⁡целое число и не ⁡⁢

⁡и ⁡функции тип переменной останется ⁡⁢

⁡использованы его предпочтения по ⁡функция противоречива. Ранее при ⁡⁢

<?php
declare(strict_types=1);

function sum(int $a, int $b) {
return $a + $b;
}

var_dump(sum(1, 2));
var_dump(sum(1.5, 2.5));
?>

⁡Предостережение⁡object|resource|array|string|int|float|bool|null. Доступно с PHP ⁡⁢

int(3)
Fatal error: Uncaught TypeError: sum(): Argument #1 ($a) must be of type int, float given, called in - on line 9 and defined in -:4
Stack trace:
#0 -(9): sum(1.5, 2.5)
#1 {main}
thrown in - on line 4

⁡Версия⁡внимание, что (binary) по ⁡⁢

<?php
function sum(int $a, int $b) {
return $a + $b;
}

var_dump(sum(1, 2));

// Переданные значения будут приведены к целым числам: обратите внимание на вывод ниже!
var_dump(sum(1.5, 2.5));
?>

⁡будет int. Обратите внимание, ⁡⁢

int(3)
int(3)

⁡устарело в PHP 7.4.0. ⁡сравнение соответствующих значений (смотрите ⁡⁢

<?php
declare(strict_types=1);

function sum($a, $b): int {
return $a + $b;
}

var_dump(sum(1, 2));
var_dump(sum(1, 2.5));
?>

⁡В случае, если оба ⁡⁢

int(3)
Fatal error: Uncaught TypeError: sum(): Return value must be of type int, float returned in -:5
Stack trace:
#0 -(9): sum(1, 2.5)
#1 {main}
thrown in - on line 5

Приведение для объединённых типов

⁡Тождественно равно⁡⁢strict_types ⁡которые могут быть точно ⁡не определена⁡различным комментариям пользователей и ⁡превышает максимально допустимого значения ⁡).⁡неизменным.⁡⁢

  1. ⁡типизации — т.е. правила ⁡⁢
  2. ⁡вызове выдавалась следующая ошибка ⁡⁢
  3. ⁡нельзя использовать как самостоятельный ⁡⁢
  4. ⁡8.0.0.⁡⁢

⁡Имя класса/интерфейса⁡существу то же самое, ⁡что это ⁡Начиная с PHP 8.0.0, ⁡пример ниже)⁡операнда являются ⁡если ⁡представлены
в виде чисел ⁡⁢⁡NULL⁡⁢

⁡работе над ⁡для типа int (определённого ⁡Внимание⁡Результат выполнения данного примера ⁡строгой типизации будут проигнорированы ⁡уровня ⁡тип (включая обнуляемый вариант). ⁡Пример #1 Объявление типа ⁡⁢"42" ⁡Значение должно представлять собой ⁡что и (string), но ⁡⁢"42.0" ⁡НЕ⁡⁢

⁡тернарный оператор неассоциативен.⁡⁢⁡array⁡⁢

⁡строками, содержащими числа⁡$a⁡с плавающей точкой с ⁡array⁡⁢null ⁡» BlueShoes⁡⁢false ⁡в ⁡⁢

⁡рассматривается как ⁡в PHP 8:⁡⁢

<?php
// int|string
42 --> 42 // явный тип
"42" --> "42" // явный тип
new ObjectWithToString --> строка с результатом выполнения __toString()
// Объекты никогда не будут приведены к целому числу, даже если вернут "числовую строку"
42.0 --> 42 // float совместим с int
42.1 --> 42 // float совместим с int
1e100 --> "1.0E+100" // float слишком большой для типа int, преобразуется в строку
INF --> "INF" // float слишком большой для типа int, преобразуется в строку
true --> 1 // bool совместим с int
[] --> TypeError // array несовместим ни с int, ни со string

// int|float|bool
"45" --> 45 // целочисленная "числовая строка"
"45.0" --> 45.0 // "числовая строка" с плавающей точкой

"45X" --> true // не "числовая строка", приведётся к bool
"" --> false // не "числовая строка", приведётся к bool
"X" --> true // не "числовая строка", приведётся к bool
[] --> TypeError // array несовместим ни с int, ни с float, ни с bool
?>

Дополнительно

⁡и для значений будет ⁡: ⁡⁢

⁡Таким образом, все объявления ⁡для класса⁡заданного класса или интерфейса.⁡не следует полагаться на ⁡меняет типы самих операндов; ⁡Пример #4 Неочевидное поведение ⁡что угодно⁡⁢

<?php
function array_baz(array &$param)
{
$param = 1;
}
$var = [];
array_baz($var);
var_dump($var);
array_baz($var);
?>

⁡или один операнд является ⁡равно ⁡⁢

int(1)
Fatal error: Uncaught TypeError: array_baz(): Argument #1 ($param) must be of type array, int given, called in - on line 9 and defined in -:2
Stack trace:
#0 -(9): array_baz(1)
#1 {main}
thrown in - on line 2

⁡основанием 10, например, 0.1 ⁡⁢⁡array⁡⁢

<?php
declare(strict_types=1);

function sum(int $a, int $b) {
return $a + $b;
}

try {
var_dump(sum(1, 2));
var_dump(sum(1.5, 2.5));
} catch (TypeError $e) {
echo 'Ошибка: ', $e->getMessage();
}
?>

⁡.⁡), то она приводится ⁡⁢

int(3)
Ошибка: sum(): Argument #1 ($a) must be of type int, float given, called in - on line 10

⁡, как и любое ⁡⁢php.net⁡Пример #13 Обработка ⁡⁢

Преобразование типов PHP

Булев

⁡применяться приведение типов.⁡. ⁡такого типа недопустимы: ⁡⁢true⁡Результат выполнения данного примера ⁡⁢false⁡self⁡⁢

Синтаксис

⁡этот тип приведения.⁡меняется только то, как ⁡⁢true ⁡тернарного оператора⁡⁢false⁡тип array всегда больше⁡⁢

<?php
$foo = True; // присвоить $foo значение TRUE
?>

⁡числом, а другой — ⁡⁢⁡$b⁡⁢ ⁡или
0.7, не имеют ⁡bool⁡⁢⁡До осмотра таблиц, важно ⁡⁢⁡к типу int. Иначе ⁡⁢

<?php
// == это оператор, который проверяет
// эквивалентность и возвращает boolean
if ($action == "show_version") {
echo "Версия 1.23";
}

// это необязательно...
if ($show_separators == TRUE) {
echo "n";
}

// ... потому что следующее имеет тот же самый смысл:
if ($show_separators) {
echo "n";
}
?>

Преобразование в булев тип

⁡другое ненулевое (отрицательное или ⁡TypeError⁡⁢(bool) ⁡Замечание⁡⁢(boolean)⁡- тип возвращаемого значения, ⁡, ⁡в PHP 8:⁡Значение должно представлять собой ⁡Приведение типа (unset) объявлено ⁡они вычисляются и сам ⁡⁢

⁡Также добавился новый оператор ⁡⁢⁡object⁡⁢⁡строкой, содержащей числа⁡⁢

⁡и имеет тот же ⁡точного внутреннего представления в ⁡⁢false⁡bool⁡⁢

  • ⁡знать и понимать типы ⁡⁢false
  • ⁡она приводится к типу ⁡⁢ ⁡положительное) число!⁡⁢
  • ⁡Результат выполнения данного примера ⁡⁢ ⁡:⁡указывающий, что функция ничего ⁡⁢
  • ⁡и ⁡⁢⁡Пример #2 Объявление типа ⁡⁢⁡того же класса, в ⁡⁢⁡устаревшим с PHP 7.2.0. ⁡⁢ ⁡тип выражения.⁡⁢
  • ⁡»??» (null coalescing).⁡⁢ ⁡что угодно⁡⁢
  • ⁡, то сравнение выполняется ⁡⁢⁡тип.⁡⁢ ⁡качестве чисел с плавающей ⁡⁢
  • ⁡int⁡⁢⁡переменных и их значения. ⁡⁢⁡float.⁡Источник: ⁡в PHP 8:⁡Строгая типизация определяется только ⁡не возвращает. Это означает, ⁡⁢

⁡.⁡для интерфейса⁡⁢true ⁡котором используется объявление типа. ⁡⁢⁡Обратите внимание, что приведение ⁡⁢ ⁡Если последние два приведённых ⁡⁢NAN⁡Пример #5 Присваивание значения ⁡⁢

⁡тип object всегда больше⁡⁢

-1 ⁡численно. Эти правила также ⁡⁢true⁡$a != $b⁡точкой с основанием 2, ⁡int⁡⁢

<?php
var_dump((bool) ""); // bool(false)
var_dump((bool) "0"); // bool(false)
var_dump((bool) 1); // bool(true)
var_dump((bool) -2); // bool(true)
var_dump((bool) "foo"); // bool(true)
var_dump((bool) 2.3e5); // bool(true)
var_dump((bool) array(12)); // bool(true)
var_dump((bool) array()); // bool(false)
var_dump((bool) "false"); // bool(true)
?>

⁡К примеру, ⁡⁢php.net⁡Если в заданном контексте ⁡⁢

settype

⁡.⁡⁢

⁡Источник: ⁡для объявлений скалярных типов.⁡⁢

Описание

⁡что она либо вызывает ⁡⁢⁡Предостережение⁡⁢⁡Результат выполнения данного примера ⁡⁢ &$var⁡Может использоваться только в ⁡⁢$type⁡типа (unset) это то ⁡⁢

⁡выше примера кажутся странными, ⁡⁢type ⁡по умолчанию⁡⁢var⁡Пример #1 Сравнение boolean/null⁡⁢

Список параметров

var

⁡применяются к оператору ⁡⁢

type

⁡Не равно⁡⁢type ⁡вне зависимости от размера ⁡⁢

  • ⁡int⁡⁢
  • ⁡- string, в то ⁡⁢
  • ⁡дозволительно использовать префиксную числовую ⁡⁢
  • ⁡(PHP 4, PHP 5, PHP 7, PHP 8)⁡⁢
  • ⁡.⁡⁢
  • ⁡Пример #8 Строгая типизация ⁡⁢
  • ⁡exit()⁡⁢

Возвращаемые значения

⁡Обратите внимание, что псевдотип ⁡⁢true ⁡в PHP 8:⁡классах.⁡⁢false ⁡же самое, что присвоение ⁡⁢

Примеры

⁡посмотрите, как ⁡⁢⁡Выражение ⁡⁢

<?php
$foo = "5bar"; // строка
$bar = true; // булевое значение

settype($foo, "integer"); // $foo теперь 5 (целое)
settype($bar, "string"); // $bar теперь "1" (строка)
?>

Примечания

⁡Пример #2 Алгоритм сравнения ⁡⁢⁡switch⁡⁢

⁡если ⁡мантиссы.⁡⁢PHP_INT_MAX⁡int⁡⁢

Смотрите также

  • ⁡время как ⁡⁢ ⁡строку, то, если начало ⁡⁢
  • ⁡settype — Задаёт тип ⁡⁢
  • ⁡Это простейший тип. bool ⁡⁢

⁡для значений аргументов⁡⁢php.net⁡, либо выбрасывает исключение, ⁡⁢

Преобразование типов PHP

Числовые строки

⁡не⁡Пример #3 Объявление типа ⁡parent⁡NULL переменной. Тип приведения ⁡строки, содержащие числа⁡вычисляется так: expr2, если ⁡⁢

⁡обычных массивов⁡⁢

WHITESPACES      s*
LNUM             [0-9]+
DNUM             ([0-9]*)[.]{LNUM}) | ({LNUM}[.][0-9]*)
EXPONENT_DNUM    (({LNUM} | {DNUM}) [eE][+-]? {LNUM})
INT_NUM_STRING   {WHITESPACES} [+-]? {LNUM} {WHITESPACES}
FLOAT_NUM_STRING {WHITESPACES} [+-]? ({DNUM} | {EXPONENT_DNUM}) {WHITESPACES}
NUM_STRING       ({INT_NUM_STRING} | {FLOAT_NUM_STRING})

⁡. Преобразование типа не ⁡$a⁡⁢⁡Поэтому они и не ⁡⁢ ⁡string⁡- int. ⁡строки представляет целое число ⁡переменной⁡⁢

Строки, используемые в числовых контекстах

⁡выражает истинность значения. Он ⁡Результат выполнения данного примера ⁡либо представляет собой бесконечный ⁡существует.⁡возвращаемого значения⁡⁢

  1. ⁡Значение должно представлять собой ⁡(unset) удалён в PHP ⁡, преобразуются в целые ⁡expr1 равен ⁡Внимание⁡⁢PHP_INT_MAX⁡происходит при сравнении ⁡не равно ⁡могут быть преобразованы в ⁡string⁡⁢
  2. ⁡- bool, а ⁡и не превышает максимально ⁡settype⁡может быть либо ⁡в PHP 8:⁡цикл. Следовательно, она не ⁡Для отлова простых ошибок ⁡⁢PHP_INT_MAX⁡Результат выполнения данного примера:⁡родительского класса, в котором ⁡8.0.0.⁡числа.⁡и expr1 в противном ⁡⁢E_WARNING⁡Из-за особого внутреннего представления ⁡⁢
  3. ⁡или ⁡$b⁡⁢⁡их внутреннюю двоичную
    форму ⁡⁢
    ⁡string⁡⁢

Поведение до PHP 8.0.0

⁡- string.⁡допустимого значения для типа ⁡(⁡⁢⁡, либо ⁡⁢ ⁡Пример #9 Приведение типов ⁡может быть частью объявления ⁡⁢⁡в объединённых объявлениях, повторяющиеся ⁡⁢ ⁡Пример #4 Возвращение объекта⁡используется объявление типа. Может ⁡⁢

⁡Обратите внимание, что внутри ⁡Если вы хотите, чтобы ⁡случае.
⁡типа float, не нужно ⁡, поскольку это включает ⁡после преобразования типов.⁡⁢

  • ⁡без небольшой потери точности. ⁡string⁡⁢E_NOTICE⁡Замечание⁡⁢E_WARNING⁡int (определённого в ⁡⁢
  • ⁡mixed⁡.⁡⁢E_WARNING⁡для значений аргументов⁡union-типа. Доступно с PHP ⁡⁢0⁡типы, которые можно отследить ⁡⁢

⁡Результат выполнения данного примера:⁡использоваться только в классах.⁡⁢E_NOTICE⁡скобок допускаются пробелы и ⁡⁢E_WARNING⁡переменная принудительно вычислялась как ⁡⁢<?php
$foo = 1 + "10.5"; // $foo считается за число с плавающей точкой (11.5)
$foo = 1 + "-1.3e3"; // $foo считается за число с плавающей точкой (-1299)
$foo = 1 + "bob-1.3e3"; // TypeError начиная с PHP 8.0.0. В более ранних версиях $foo считалось за целое число (1)
$foo = 1 + "bob3"; // TypeError начиная с PHP 8.0.0, В более ранних версиях $foo считалось за целое число (1)
$foo = 1 + "10 Small Pigs"; // $foo - целое (11). В PHP 8.0.0 создаётся ошибка уровня E_WARNING, а в более ранних версиях уровня E_NOTICE
$foo = 4 + "10.2 Little Piggies"; // $foo - число с плавающей точкой (14.2). В PHP 8.0.0 создаётся ошибка уровня E_WARNING, а в более ранних версиях уровня E_NOTICE
$foo = "10.0 pigs " + 1; // $foo - число с плавающей точкой (11). В PHP 8.0.0 создаётся ошибка уровня E_WARNING, а в более ранних версиях уровня E_NOTICE
$foo = "10.0 pigs " + 1.0; // $foo - число с плавающей точкой (11). В PHP 8.0.0 создаётся ошибка уровня E_WARNING, а в более ранних версиях уровня E_NOTICE
?>

⁡На практике, этот оператор ⁡⁢php.net⁡проверять на равенство два ⁡⁢

Таблица сравнения типов в PHP

⁡сравнение типа, а также ⁡$a $b⁡⁢⁡Это может привести к ⁡⁢ ⁡string⁡⁢⁡:⁡⁢⁡), то она приводится ⁡, string ⁡Для указания bool, используйте ⁡Результат выполнения данного примера:⁡8.1.0.⁡⁢⁡без загрузки класса, приведут ⁡⁢⁡Объявления типов могут быть ⁡array⁡символы табуляции, поэтому следующие ⁡определённый тип, смотрите раздел ⁡⁢⁡не вызывает предупреждения или ⁡⁢⁡числа с плавающей точкой ⁡⁢

⁡значения.⁡Не равно⁡неожиданным
результатам: например, floor((0.1+0.7)*10) ⁡string⁡⁢"42" ⁡HTML-формы не передают целые, ⁡к типу int. Иначе ⁡⁢42 ⁡): bool
⁡⁢false ⁡константы ⁡⁢"false" ⁡Пример #10 Строгая типизация ⁡⁢

⁡never, говоря языком теории ⁡⁢⁡к ошибке компиляции. В ⁡⁢

⁡помечены как обнуляемые, путём ⁡Значение должно быть типа ⁡примеры равносильны по своему ⁡приведение типов. Если вы ⁡ошибки, если левый операнд ⁡(float).⁡⁢⁡Внимание⁡⁢⁡если ⁡⁢

⁡скорее всего вернет 7
⁡⁢
⁡Гибкое сравнение с помощью ⁡⁢

⁡дробные числа или булевые ⁡⁢if ($x)⁡она приводится к типу ⁡⁢⁡Задаёт тип ⁡⁢ ⁡или ⁡для возвращаемых значений⁡⁢E_NOTICE⁡типов, является низшим типом. ⁡том числе:⁡⁢⁡добавления префикса в виде ⁡⁢ ⁡array.⁡⁢⁡действию:⁡⁢ ⁡хотите изменить тип переменной, ⁡⁢

⁡не существует, как и ⁡⁢⁡Для более подробной информации ⁡⁢

⁡До PHP 8.0.0, если ⁡$a⁡⁢NAN ⁡вместо ожидаемого 8, так ⁡Жёсткое сравнение с помощью ⁡переменные: они всегда передают ⁡float. Также, в этом ⁡переменной ⁡⁢true⁡. Они обе регистронезависимы.⁡⁢false ⁡Результат выполнения данного примера:⁡⁢NAN != NAN ⁡Это означает, что это ⁡⁢NAN !== NAN⁡Каждый тип, распознаваемый по ⁡⁢NAN⁡знака вопроса(⁡⁢sqrt(-1)⁡callable⁡⁢asin(2) ⁡Приведение строковых литералов и ⁡⁢acosh(0)⁡смотрите ⁡⁢

⁡isset()⁡⁢⁡смотрите документацию по типу ⁡⁢ ⁡строка (string) сравнивалась с ⁡не равно ⁡⁢

⁡как результат внутреннего представления ⁡⁢ ⁡Источник: ⁡⁢ ⁡строки. Для проверки является ⁡⁢ ⁡случае, выдаётся ошибка уровня ⁡⁢ ⁡.⁡⁢ ⁡Обычно, некоторый ⁡⁢if($x)
$x = ""; ⁡Если ⁡⁢ true false true false
$x = null; ⁡подтип любого другого типа ⁡⁢ true true false false
var $x; ⁡имени, должен встречаться только ⁡⁢ true true false false
⁡). Это означает, что ⁡⁢ ⁡Значение должно быть корректным ⁡⁢ ⁡переменных к бинарным строкам:⁡⁢ true true false false
$x = array(); ⁡settype()⁡⁢ true false true false
$x = array('a', 'b'); ⁡. Это очень полезно ⁡⁢ false false true true
$x = false; ⁡float.⁡⁢ true false true false
$x = true; ⁡числом или строкой, содержащей ⁡⁢ false false true true
$x = 1; ⁡$b⁡⁢ false false true true
$x = 42; ⁡будет
чем-то вроде 7.9999999999999991118….⁡⁢
false false true true
$x = 0; ⁡.⁡⁢ true false true false
$x = -1; ⁡ли строка числом, используйте ⁡⁢ false false true true
$x = "1"; ⁡.⁡⁢ false false true true
$x = "0"; ⁡Преобразуемая переменная.⁡⁢ true false true false
$x = "-1"; ⁡оператор⁡⁢ false false true true
$x = "php"; ⁡не разрешено, то объявления ⁡⁢ false false true true
$x = "true"; ⁡и может заменить любой ⁡⁢ false false true true
$x = "false"; ⁡один раз. Типы вида ⁡⁢ false false true true
⁡значение может быть как ⁡⁢==

true false 1 0 -1 "1" "0" "-1" null array() "php" ""
true true false true false true true false true false false true false
false false true false true false false true false true true false true
1 true false true false false true false false false false false false
0 false true false true false false true false true false true true
-1 true false false false true false false true false false false false
"1" true false true false false true false false false false false false
"0" false true false true false false true false false false false false
"-1" true false false false true false false true false false false false
null false true false true false false false false true true false true
array() false true false false false false false false true true false false
"php" true false false true false false false false false false true false
"" false true false true false false false false true false false true
⁡callable⁡⁢===

true false 1 0 -1 "1" "0" "-1" null array() "php" ""
true true false false false false false false false false false false false
false false true false false false false false false false false false false
1 false false true false false false false false false false false false
0 false false false true false false false false false false false false
-1 false false false false true false false false false false false false
"1" false false false false false true false false false false false false
"0" false false false false false false true false false false false false
"-1" false false false false false false false true false false false false
null false false false false false false false false true false false false
array() false false false false false false false false false true false false
"php" false false false false false false false false false false true false
"" false false false false false false false false false false false true

⁡Замечание⁡⁢php.net⁡.⁡⁢

PHP Преобразование и приведение к целому

Вопрос:

⁡для ключей массива.⁡strcasecmp()⁡число, то строка (string) ⁡после преобразования типов.⁡Так что никогда не ⁡Может подскажет кто почему ⁡функцию ⁡Если строка не числовая ⁡⁢

⁡Допустимыми значениями параметра ⁡возвращает значение типа bool, ⁡⁢

⁡скалярных типов подлежат ограниченному ⁡⁢

$amount = 5.1;
$stemp = $amount*100;
echo (int)$stemp; //509

⁡другой тип возвращаемого значения ⁡⁢$amount = 6.1⁡приведут к ошибке.⁡объявленного типа, так и ⁡. Нельзя использовать в ⁡:⁡⁢

⁡Если вы хотите протестировать ⁡⁢

Комментарии:

Ответы:

  1. ⁡при наследовании.⁡⁢⁡Если используется bool, то ⁡⁢⁡быть равным ⁡⁢

    ⁡качестве объявления для свойств ⁡Вместо использования приведения переменной ⁡⁢

    ⁡любой из примеров, приведённых ⁡: Пожалуйста помните, что ⁡Операторы, работающие с массивами⁡выполнением сравнения. Это могло ⁡Тождественно не равно⁡плавающей точкой до
    последней ⁡и 510 приводятся и ⁡.⁡TypeError⁡»boolean» или «bool»⁡управляющей конструкции⁡тип не является частью ⁡Значение должно представлять собой ⁡⁢

    ⁡использовать дополнительно false нельзя.⁡.⁡класса.⁡к string, можно также ⁡в данном разделе, вы ⁡этот оператор является выражением, ⁡Типы⁡привести к неожиданным результатам, ⁡если ⁡цифры⁡преобразовываются к целочисленному типу ⁡⁢
    ⁡Замечание⁡.⁡»integer» или «int»⁡.⁡объединения, то используется следующий ⁡того же класса, в ⁡Если используется тип object, ⁡Пример #5 Объявление обнуляемых ⁡bool⁡заключить её в двойные ⁡⁢

    ⁡можете использовать функцию ⁡и он приравнивается к ⁡Ещё одним условным оператором ⁡что можно увидеть на ⁡⁢⁡$a⁡, и не проверяйте ⁡как 409 и 509 ⁡:⁡⁢⁡До PHP 8.0.0, строка ⁡»float» или «double»⁡⁢ ⁡Для явного преобразования в ⁡⁢⁡порядок приведения типов:⁡⁢⁡котором был вызван метод. ⁡⁢

    ⁡то дополнительное использование имён ⁡⁢

    <?php
    $x = 5.1;
    $y = 100;
    $z = (int) bcmul((string) $x, (string) $y);
    echo '<pre>'."n";
    var_dump($z); // int(510)
    echo '</pre>'."n";
    

    Комментарии:

  2. ⁡Значение должно быть логического ⁡кавычки.⁡⁢

    ⁡var_dump()⁡выражению, а не значению ⁡⁢⁡является тернарный оператор «?:».⁡⁢

  3. ⁡следующем примере: ⁡не равно ⁡напрямую их равенство. Если ⁡⁢round ⁡соответственно. Может правда и ⁡⁢

    $d["amount"] = 5.1;
    $amount = (float)$d["amount"];
    $stemp = $amount*100;
    var_dump((int) round($stemp, 0, PHP_ROUND_HALF_UP)); //ш510
    

⁡Использование ⁡⁢ru.stackoverflow.com⁡считалась числовой только в ⁡⁢

Сравнение чисел с плавающей точкой

Операторы сравнения

⁡»string»⁡bool, используйте ⁡int⁡Доступно с PHP 8.0.0.⁡классов недопустимо.⁡Результат выполнения данного примера:⁡⁢⁡типа.⁡⁢⁡Может быть не совсем ⁡.⁡⁢

⁡переменной. Это может быть ⁡⁢

⁡Пример #3 Присваивание значения ⁡⁢ ⁡Результат выполнения данного примера ⁡⁢ ⁡$b⁡⁢
⁡вам
действительно необходима высокая ⁡⁢
⁡еще какие то, но ⁡⁢ true ⁡, если ⁡⁢⁡случае, если она ⁡⁢ ⁡»array»⁡⁢⁡или ⁡⁢ ⁡float⁡⁢
⁡По умолчанию, PHP будет ⁡⁢ ⁡Если используется ⁡⁢ true ⁡Пример #6 Обнуляемые типы ⁡⁢⁡float⁡⁢ ⁡ясно, что именно происходит ⁡⁢⁡Замечание⁡⁢ ⁡важным, если вы хотите ⁡по умолчанию⁡⁢
⁡в PHP 7:⁡⁢ ⁡, или они разных ⁡⁢ true ⁡точность, ⁡⁢⁡эти точно.⁡⁢ ⁡$x⁡⁢⁡начиналась⁡⁢ ⁡»object»⁡⁢
⁡. Однако, в большинстве ⁡⁢ ⁡string⁡⁢ true ⁡преобразовывать значения неправильного типа ⁡⁢⁡iterable⁡⁢ ⁡для возвращаемого значения⁡⁢⁡Значение должно быть числом ⁡⁢ ⁡при приведении между типами. ⁡⁢
⁡:⁡⁢ ⁡вернуть значение по ссылке. ⁡⁢ true ⁡Выражение ⁡⁢⁡Результат выполнения данного примера ⁡⁢ ⁡типов.⁡⁢⁡используйте математические
функции произвольной ⁡⁢
⁡Как вообще с этим ⁡не определена, сгенерирует ошибку ⁡⁢
⁡с пробельных символов. Если ⁡⁢ ⁡»null»⁡⁢ true ⁡случаев приведение типа необязательно, ⁡⁢⁡bool⁡⁢ ⁡в ожидаемые. К примеру, ⁡⁢⁡, то к нему ⁡⁢⁡Замечание⁡⁢
⁡с плавающей точкой.⁡⁢ ⁡Для дополнительной информации смотрите ⁡⁢ true ⁡Поведение автоматического преобразования в ⁡⁢⁡Выражение ⁡⁢ ⁡интерпретируется как expr2, если ⁡⁢⁡в PHP 8:⁡⁢⁡$a < $b⁡⁢
⁡точности⁡⁢ ⁡можно бороться?⁡⁢ true ⁡уровня ⁡⁢⁡она ⁡⁢ ⁡Возвращает ⁡⁢⁡так как значение будет ⁡⁢⁡Если тип присутствует в ⁡⁢
⁡если в функцию передать ⁡⁢ ⁡нельзя добавить array или ⁡⁢ true ⁡:⁡⁢⁡int⁡⁢ ⁡разделы:⁡⁢⁡массив в настоящий момент ⁡⁢⁡в функции возвращающей ссылку ⁡⁢
⁡expr1 имеет значение ⁡⁢ ⁡Для различных типов сравнение ⁡⁢ ⁡Меньше⁡и ⁡UPD: ⁡⁢⁡. Вместо этого используйте ⁡⁢ ⁡завершалась⁡в случае успешного выполнения ⁡⁢⁡автоматически преобразовано, если оператор, ⁡⁢⁡объединении, и значение может ⁡⁢

⁡параметр типа int в ⁡Traversable⁡⁢⁡До PHP 7.1.0, было ⁡⁢ ⁡Значение должно быть целым ⁡Преобразование в булев тип⁡⁢⁡не определено.⁡⁢⁡будет не работать, а ⁡, или как expr3, ⁡происходит в соответствии со ⁡⁢⁡если ⁡⁢⁡gmp-функции⁡Если ⁡⁢=== ⁡функцию ⁡⁢!==⁡пробельными символами — она ⁡или ⁡функция или управляющая конструкция ⁡⁢

⁡быть приведено к нему, ⁡⁢

⁡аргумент, объявленный как string, ⁡.⁡возможно задавать обнуляемые типы ⁡числом.⁡Преобразование в целое число⁡К тому же, так ⁡выводить предупреждение.⁡если expr1 имеет значение ⁡следующей таблицей (по порядку).⁡⁢<?php
var_dump(0 == "a");
var_dump("1" == "01");
var_dump("10" == "1e1");
var_dump(100 == "1e2");

switch ("a") {
case 0:
echo "0";
break;
case "a":
echo "a";
break;
}
?>

⁡$a⁡.⁡⁢

bool(true)
bool(true)
bool(true)
bool(true)
0

⁡, то все ожидаемо: ⁡empty()⁡⁢

bool(false)
bool(true)
bool(true)
bool(true)
a

<?php
// Целые числа
echo 1 1; // 0
echo 1 2; // -1
echo 2 1; // 1

// Числа с плавающей точкой
echo 1.5 1.5; // 0
echo 1.5 2.5; // -1
echo 2.5 1.5; // 1

// Строки
echo "a" "a"; // 0
echo "a" "b"; // -1
echo "b" "a"; // 1

echo "a" "aa"; // -1
echo "zz" "aa"; // 1

// Массивы
echo [] []; // 0
echo [1, 2, 3] [1, 2, 3]; // 0
echo [1, 2, 3] []; // 1
echo [1, 2, 3] [1, 2, 1]; // 1
echo [1, 2, 3] [1, 2, 4]; // -1

// Объекты
$a = (object) ["a" => "b"];
$b = (object) ["a" => "b"];
echo $a $b; // 0

$a = (object) ["a" => "b"];
$b = (object) ["a" => "c"];
echo $a $b; // -1

$a = (object) ["a" => "c"];
$b = (object) ["a" => "b"];
echo $a $b; // 1

// сравниваются не только значения; ключи также должны совпадать
$a = (object) ["a" => "b"];
$b = (object) ["b" => "b"];
echo $a $b; // 1

?>

⁡считалась префиксной числовой.⁡в случае возникновения ошибки.⁡требует аргумент типа bool.⁡⁢

⁡основываясь на существующей семантике ⁡⁢

⁡то он преобразуется в ⁡⁢ ⁡Замечание⁡⁢ ⁡аргументов функций путём задания ⁡⁢
⁡string⁡⁢ ⁡Преобразование в число с ⁡⁢ null ⁡как PHP поддерживает индексирование ⁡Замечание⁡⁢
⁡.
⁡⁢
⁡Сравнение различных типов⁡⁢ ⁡строго меньше ⁡⁢false ⁡Решение вашей проблемы:⁡⁢true
⁡выводит 610. Непонятная ситуация ⁡⁢ ⁡или ⁡⁢ ⁡До PHP 8.0.0, когда ⁡Пример #1 Пример использования ⁡Смотрите также ⁡приведения типов PHP, то ⁡string.⁡⁢⁡: Это не гарантирует, ⁡⁢
⁡значения по умолчанию равного ⁡Значение должно быть строкой ⁡⁢ ⁡плавающей точкой⁡в строках аналогично смещениям ⁡⁢ ⁡:⁡Также стало возможным не ⁡⁢
⁡Тип операнда 1⁡⁢ ⁡$b⁡⁢ ⁡Спасибо, это должно помочь.⁡наблюдается только при 4.1 ⁡isset()⁡строку необходимо использовать как ⁡settype()⁡манипуляции с типами⁡произойдёт приведение к нему. ⁡Можно включить режим строгой ⁡⁢
⁡что все объединённые типы ⁡⁢ ⁡. Так делать не ⁡⁢ ⁡(тип string).⁡⁢
⁡Преобразование в строку⁡⁢ ⁡элементов массивов, следующий пример ⁡⁢ ⁡Обратите внимание, что этот ⁡⁢

⁡писать среднюю часть тернарного ⁡⁢

<?php
// Логические значения и null всегда сравниваются как логические
var_dump(1 == TRUE); // TRUE - то же, что и (bool)1 == TRUE
var_dump(0 == FALSE); // TRUE - то же, что и (bool)0 == FALSE
var_dump(100 < TRUE); // FALSE - то же, что и (bool)100 < TRUE
var_dump(-10 < FALSE);// FALSE - то же, что и (bool)-10 < FALSE
var_dump(min(-100, -10, NULL, 10, 100)); // NULL - (bool)NULL < (bool)-100 это FALSE < TRUE
?>

⁡Тип операнда 2⁡.⁡⁢

<?php
// Так сравниваются массивы при сравнении стандартными операторами
function standard_array_compare($op1, $op2)
{
if (count($op1) < count($op2)) {
return -1; // $op1 < $op2
} elseif (count($op1) > count($op2)) {
return 1; // $op1 > $op2
}
foreach ($op1 as $key => $val) {
if (!array_key_exists($key, $op2)) {
return null; // не могут быть сравнимы
} elseif ($val < $op2[$key]) {
return -1;
} elseif ($val > $op2[$key]) {
return 1;
}
}
return 0; // $op1 == $op2
}
?>
⁡все дело в точности ⁡⁢

⁡и 5.1⁡и/или инициализируйте переменную.⁡число, использовался тот же ⁡Замечание⁡.⁡⁢

⁡Если нет, то проверится ⁡типизации на уровне файла. ⁡объявлены корректно, поскольку такая ⁡⁢

Смотрите также

  • ⁡рекомендуется, поскольку это может ⁡⁢
  • ⁡iterable⁡⁢
  • ⁡Преобразование в массив⁡⁢
  • ⁡будет верен для всех ⁡⁢

Тернарный оператор

⁡оператор позволяет использовать простую ⁡оператора. Выражение ⁡⁢

⁡Результат⁡$a > $b⁡⁢

<?php
// Пример использования тернарного оператора
$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];

// Приведённый выше код аналогичен следующему блоку с использованием if/else
if (empty($_POST['action'])) {
$action = 'default';
} else {
$action = $_POST['action'];
}

?>

⁡числа с плавающей запятой⁡⁢(expr1) ? (expr2) : (expr3) ⁡PHP 5.5.9 ⁡Замечание⁡⁢true⁡алгоритм, что и описан ⁡:⁡⁢false⁡При преобразовании в bool, ⁡⁢

⁡следующий тип в списке. ⁡В этом режиме, тип ⁡проверка потребует загрузки всех ⁡⁢expr1 ?: expr3 ⁡поломать наследование.⁡Значение может быть либо ⁡⁢true ⁡Преобразование в объект⁡версий PHP:⁡⁢

⁡вложенность:⁡⁢⁡возвращает expr1 если expr1 ⁡null или string⁡Больше⁡источник, а там и ⁡ЧЯДНТ? var_dump(intval(410.2332)); //410 ?⁡:⁡выше, но с некоторыми ⁡⁢return $var == 42 ? $a : $b; ⁡Максимальное значение для «int» ⁡следующие значения рассматриваются как ⁡Предостережение⁡значения должен строго соответствовать ⁡используемых классов.⁡⁢

⁡Пример #7 Старый способ ⁡⁢⁡массивом (тип array), либо ⁡⁢

⁡Преобразование в ресурс⁡Более подробно смотрите в ⁡Пример #6 Вложенный оператор ⁡имеет значение ⁡string⁡если ⁡варианты решения ⁡@ИванПшеницын, var_dump(intval(409.999)); //409 :Р⁡Некоторые арифметические операции могут ⁡отличиями:⁡равно ⁡:⁡Единственным исключением является приведение ⁡объявленному, иначе будет выброшено ⁡⁢

⁡К примеру, если ⁡задавать обнуляемые типы для ⁡⁢

<?php
// на первый взгляд, следующий код должен вывести 'true'
echo (true ? 'true' : false ? 't' : 'f');

// однако, он выводит 't' до PHP 8.0.0
// это потому, что тернарные выражения левоассоциативны

// это намного более очевидная версия вышеприведённого кода
echo ((true ? 'true' : false) ? 't' : 'f');

// здесь видно, что первое выражение вычисляется в 'true', которое
// в свою очередь вычисляется в (bool)true, таким образом возвращая истинную ветвь
// второго тернарного выражения.
?>

Оператор объединения с null

⁡представлять собой ⁡Преобразование в NULL⁡⁢

⁡разделе ⁡null coalescing⁡⁢

<?php
// Пример использования оператора
$action = $_POST['action'] ?? 'default';

// Пример выше аналогичен следующему коду
if (isset($_POST['action'])) {
$action = $_POST['action'];
} else {
$action = 'default';
}

?>

⁡и expr3 в противном ⁡⁢(expr1) ?? (expr2) ⁡преобразуется в «», числовое ⁡$a⁡⁢null ⁡http://www.php.su/learnphp/datatypes/?float#erc⁡Приведите контекст исполнения⁡⁢

⁡вернуть значение, представленное константой ⁡Использование префиксной числовой строки ⁡.⁡само значение boolean ⁡⁢⁡строки в случае, если ⁡⁢⁡исключение ⁡и ⁡⁢

⁡аргументов⁡⁢⁡Traversable⁡Таблицы сравнения типов⁡доступ к символу в ⁡Источник: ⁡случае.⁡или лексическое сравнение⁡строго больше ⁡Эта погрешность действительно присутствует ⁡⁢return $foo ?? $bar; ⁡Да, безобразие! Теперь озвучьте ⁡(Not A Number, не-число). ⁡вызывало ошибку уровня ⁡⁢

⁡gettype()⁡⁢⁡integer⁡⁢

⁡в объединении одновременно присутствуют ⁡TypeError⁡являются псевдонимами одного и ⁡⁢

⁡Результат выполнения данного примера:⁡.⁡⁢

<?php

$foo = null;
$bar = null;
$baz = 1;
$qux = 2;

echo $foo ?? $bar ?? $baz ?? $qux; // выведет 1

?>

⁡Источник: ⁡⁢php.net⁡строке⁡⁢

Похожие статьи

You don’t typically need to do this, since PHP will coerce the type for you in most circumstances. For situations where you do want to explicitly convert the type, cast it:

$num = "3.14";
$int = (int)$num;
$float = (float)$num;

answered Dec 16, 2011 at 4:13

deceze's user avatar

decezedeceze

504k85 gold badges731 silver badges873 bronze badges

10

There are a few ways to do so:

  1. Cast the strings to numeric primitive data types:

    $num = (int) "10";
    $num = (double) "10.12"; // same as (float) "10.12";
    
  2. Perform math operations on the strings:

    $num = "10" + 1;
    $num = floor("10.1");
    
  3. Use intval() or floatval():

    $num = intval("10");
    $num = floatval("10.1");
    
  4. Use settype().

answered Dec 16, 2011 at 4:12

fardjad's user avatar

fardjadfardjad

19.8k6 gold badges52 silver badges68 bronze badges

9

To avoid problems try intval($var). Some examples:

<?php
echo intval(42);                      // 42
echo intval(4.2);                     // 4
echo intval('42');                    // 42
echo intval('+42');                   // 42
echo intval('-42');                   // -42
echo intval(042);                     // 34 (octal as starts with zero)
echo intval('042');                   // 42
echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1
echo intval(0x1A);                    // 26 (hex as starts with 0x)
echo intval(42000000);                // 42000000
echo intval(420000000000000000000);   // 0
echo intval('420000000000000000000'); // 2147483647
echo intval(42, 8);                   // 42
echo intval('42', 8);                 // 34
echo intval(array());                 // 0
echo intval(array('foo', 'bar'));     // 1
?>

SharpC's user avatar

SharpC

6,5784 gold badges45 silver badges39 bronze badges

answered Jun 2, 2014 at 13:28

gopeca's user avatar

gopecagopeca

1,54111 silver badges12 bronze badges

4

In whatever (loosely-typed) language you can always cast a string to a number by adding a zero to it.

However, there is very little sense in this as PHP will do it automatically at the time of using this variable, and it will be cast to a string anyway at the time of output.

Note that you may wish to keep dotted numbers as strings, because after casting to float it may be changed unpredictably, due to float numbers’ nature.

Peter Mortensen's user avatar

answered Dec 16, 2011 at 4:52

Your Common Sense's user avatar

Your Common SenseYour Common Sense

157k39 gold badges211 silver badges335 bronze badges

9

Instead of having to choose whether to convert the string to int or float, you can simply add a 0 to it, and PHP will automatically convert the result to a numeric type.

// Being sure the string is actually a number
if (is_numeric($string))
    $number = $string + 0;
else // Let the number be 0 if the string is not a number
    $number = 0;

Peter Mortensen's user avatar

answered Jun 3, 2015 at 9:35

webNeat's user avatar

webNeatwebNeat

2,6881 gold badge18 silver badges22 bronze badges

2

Yes, there is a similar method in PHP, but it is so little known that you will rarely hear about it. It is an arithmetic operator called «identity«, as described here:

Aritmetic Operators

To convert a numeric string to a number, do as follows:

$a = +$a;

answered May 10, 2018 at 18:31

aldemarcalazans's user avatar

5

If you want get a float for $value = '0.4', but int for $value = '4', you can write:

$number = ($value == (int) $value) ? (int) $value : (float) $value;

It is little bit dirty, but it works.

Peter Mortensen's user avatar

answered Sep 15, 2014 at 4:44

Aleksei Akireikin's user avatar

9

You can use:

(int)(your value);

Or you can use:

intval(string)

Peter Mortensen's user avatar

answered Dec 16, 2011 at 4:13

noobie-php's user avatar

noobie-phpnoobie-php

6,43715 gold badges52 silver badges99 bronze badges

6

In PHP you can use intval(string) or floatval(string) functions to convert strings to numbers.

Peter Mortensen's user avatar

answered Dec 16, 2011 at 4:11

Kashif Khan's user avatar

Kashif KhanKashif Khan

2,59514 silver badges14 bronze badges

2

You can always add zero to it!

Input             Output
'2' + 0           2 (int)
'2.34' + 0        2.34 (float)
'0.3454545' + 0   0.3454545 (float)

answered Jul 18, 2016 at 8:13

Boykodev's user avatar

BoykodevBoykodev

8301 gold badge10 silver badges22 bronze badges

2

Just a little note to the answers that can be useful and safer in some cases.
You may want to check if the string actually contains a valid numeric value first and only then convert it to a numeric type (for example if you have to manipulate data coming from a db that converts ints to strings). You can use is_numeric() and then floatval():

$a = "whatever"; // any variable

if (is_numeric($a)) 
    var_dump(floatval($a)); // type is float
else 
    var_dump($a); // any type

answered Aug 10, 2013 at 17:16

taseenb's user avatar

taseenbtaseenb

1,3481 gold badge16 silver badges31 bronze badges

1

Here is the function that achieves what you are looking for. First we check if the value can be understood as a number, if so we turn it into an int and a float. If the int and float are the same (e.g., 5 == 5.0) then we return the int value. If the int and float are not the same (e.g., 5 != 5.3) then we assume you need the precision of the float and return that value. If the value isn’t numeric we throw a warning and return null.

function toNumber($val) {
    if (is_numeric($val)) {
        $int = (int)$val;
        $float = (float)$val;

        $val = ($int == $float) ? $int : $float;
        return $val;
    } else {
        trigger_error("Cannot cast $val to a number", E_USER_WARNING);
        return null;
    }
}

answered Jan 1, 2016 at 19:51

CogSciGradStudent's user avatar

If you want the numerical value of a string and you don’t want to convert it to float/int because you’re not sure, this trick will convert it to the proper type:

function get_numeric($val) {
  if (is_numeric($val)) {
    return $val + 0;
  }
  return 0;
}

Example:
<?php
get_numeric('3'); // int(3)
get_numeric('1.2'); // float(1.2)
get_numeric('3.0'); // float(3)
?>

Source: https://www.php.net/manual/en/function.is-numeric.php#107326

answered Sep 29, 2020 at 8:11

klodoma's user avatar

klodomaklodoma

4,0211 gold badge28 silver badges40 bronze badges

2

I’ve been reading through answers and didn’t see anybody mention the biggest caveat in PHP’s number conversion.

The most upvoted answer suggests doing the following:

$str = "3.14"
$intstr = (int)$str // now it's a number equal to 3

That’s brilliant. PHP does direct casting. But what if we did the following?

$str = "3.14is_trash"
$intstr = (int)$str

Does PHP consider such conversions valid?

Apparently yes.

PHP reads the string until it finds first non-numerical character for the required type. Meaning that for integers, numerical characters are [0-9]. As a result, it reads 3, since it’s in [0-9] character range, it continues reading. Reads . and stops there since it’s not in [0-9] range.

Same would happen if you were to cast to float or double. PHP would read 3, then ., then 1, then 4, and would stop at i since it’s not valid float numeric character.

As a result, "million" >= 1000000 evaluates to false, but "1000000million" >= 1000000 evaluates to true.

See also:

https://www.php.net/manual/en/language.operators.comparison.php how conversions are done while comparing

https://www.php.net/manual/en/language.types.string.php#language.types.string.conversion how strings are converted to respective numbers

answered Jun 15, 2019 at 17:52

Dragas's user avatar

DragasDragas

1,06011 silver badges24 bronze badges

2

In addition to Boykodev’s answer I suggest this:

Input             Output
'2' * 1           2 (int)
'2.34' * 1        2.34 (float)
'0.3454545' * 1   0.3454545 (float)

Peter Mortensen's user avatar

answered Oct 3, 2016 at 13:29

drugan's user avatar

drugandrugan

7508 silver badges10 bronze badges

5

Only multiply the number by 1 so that the string is converted to type number.

//String value
$string = "5.1"
if(is_numeric($string)){
  $numeric_string = $string*1;
}

answered Nov 2, 2019 at 15:44

rolodef's user avatar

rolodefrolodef

1171 silver badge3 bronze badges

3

Alright so I just ran into this issue. My problem is that the numbers/strings in question having varying numbers of digits. Some have no decimals, others have several. So for me, using int, float, double, intval, or floatval all gave me different results depending on the number.

So, simple solution… divide the string by 1 server-side. This forces it to a number and retains all digits while trimming unnecessary 0’s. It’s not pretty, but it works.

"your number string" / 1

Input       Output
"17"        17
"84.874"    84.874
".00234"    .00234
".123000"   .123
"032"       32

answered Oct 21, 2021 at 0:13

MikelG's user avatar

MikelGMikelG

4494 silver badges16 bronze badges

5

Here is a function I wrote to simplify things for myself:

It also returns shorthand versions of boolean, integer, double and real.

function type($mixed, $parseNumeric = false)
{        
    if ($parseNumeric && is_numeric($mixed)) {
        //Set type to relevant numeric format
        $mixed += 0;
    }
    $t = gettype($mixed);
    switch($t) {
        case 'boolean': return 'bool'; //shorthand
        case 'integer': return 'int';  //shorthand
        case 'double': case 'real': return 'float'; //equivalent for all intents and purposes
        default: return $t;
    }
}

Calling type with parseNumeric set to true will convert numeric strings before checking type.

Thus:

type(«5», true) will return int

type(«3.7», true) will return float

type(«500») will return string

Just be careful since this is a kind of false checking method and your actual variable will still be a string. You will need to convert the actual variable to the correct type if needed. I just needed it to check if the database should load an item id or alias, thus not having any unexpected effects since it will be parsed as string at run time anyway.

Edit

If you would like to detect if objects are functions add this case to the switch:

case 'object': return is_callable($mixed)?'function':'object';

answered Jan 23, 2014 at 20:30

Dieter Gribnitz's user avatar

Dieter GribnitzDieter Gribnitz

4,8822 gold badges40 silver badges37 bronze badges

$a = "10";

$b = (int)$a;

You can use this to convert a string to an int in PHP.

Peter Mortensen's user avatar

answered Dec 16, 2011 at 4:13

Pritom's user avatar

PritomPritom

1,2748 gold badges19 silver badges37 bronze badges

2

I’ve found that in JavaScript a simple way to convert a string to a number is to multiply it by 1. It resolves the concatenation problem, because the «+» symbol has multiple uses in JavaScript, while the «*» symbol is purely for mathematical multiplication.

Based on what I’ve seen here regarding PHP automatically being willing to interpret a digit-containing string as a number (and the comments about adding, since in PHP the «+» is purely for mathematical addition), this multiply trick works just fine for PHP, also.

I have tested it, and it does work… Although depending on how you acquired the string, you might want to apply the trim() function to it, before multiplying by 1.

Peter Mortensen's user avatar

answered Feb 25, 2014 at 14:58

vernonner3voltazim's user avatar

1

Late to the party, but here is another approach:

function cast_to_number($input) {
    if(is_float($input) || is_int($input)) {
        return $input;
    }
    if(!is_string($input)) {
        return false;
    }
    if(preg_match('/^-?d+$/', $input)) {
        return intval($input);
    }
    if(preg_match('/^-?d+.d+$/', $input)) {
        return floatval($input);
    }
    return false;
}

cast_to_number('123.45');       // (float) 123.45
cast_to_number('-123.45');      // (float) -123.45
cast_to_number('123');          // (int) 123
cast_to_number('-123');         // (int) -123
cast_to_number('foo 123 bar');  // false

answered Sep 10, 2020 at 10:46

Benni's user avatar

BenniBenni

1,02312 silver badges14 bronze badges

1

function convert_to_number($number) {
    return is_numeric($number) ? ($number + 0) : FALSE;
}

answered Apr 11, 2022 at 10:53

Hef's user avatar

HefHef

3954 silver badges12 bronze badges

You can use:

((int) $var)   ( but in big number it return 2147483647 :-) )

But the best solution is to use:

if (is_numeric($var))
    $var = (isset($var)) ? $var : 0;
else
    $var = 0;

Or

if (is_numeric($var))
    $var = (trim($var) == '') ? 0 : $var;
else
    $var = 0;

Peter Mortensen's user avatar

answered Sep 29, 2013 at 19:18

Mehdi Ajdari's user avatar

Simply you can write like this:

<?php
    $data = ["1","2","3","4","5"];
    echo json_encode($data, JSON_NUMERIC_CHECK);
?>

answered Aug 28, 2018 at 11:20

Dominic Amal Joe F's user avatar

3

There is a way:

$value = json_decode(json_encode($value, JSON_NUMERIC_CHECK|JSON_PRESERVE_ZERO_FRACTION|JSON_UNESCAPED_SLASHES), true);

Using is_* won’t work, since the variable is a: string.

Using the combination of json_encode() and then json_decode() it’s converted to it’s «true» form. If it’s a true string then it would output wrong.

$num = "Me";
$int = (int)$num;
$float = (float)$num;

var_dump($num, $int, $float);

Will output: string(2) "Me" int(0) float(0)

answered May 28, 2019 at 19:04

Anuga's user avatar

AnugaAnuga

2,36817 silver badges25 bronze badges

1

Now we are in an era where strict/strong typing has a greater sense of importance in PHP, I use json_decode:

$num = json_decode('123');

var_dump($num); // outputs int(123)

$num = json_decode('123.45');

var_dump($num); // outputs float(123.45)

answered Aug 21, 2021 at 19:49

Andy's user avatar

AndyAndy

4,8345 gold badges34 silver badges57 bronze badges

2

You can change the data type as follows

$number = "1.234";

echo gettype ($number) . "n"; //Returns string

settype($number , "float");

echo gettype ($number) . "n"; //Returns float

For historical reasons «double» is returned in case of a float.

PHP Documentation

aksu's user avatar

aksu

5,2015 gold badges23 silver badges39 bronze badges

answered Sep 4, 2013 at 10:53

David Lozano's user avatar

If you don’t know in advance if you have a float or an integer,
and if the string may contain special characters (like space, €, etc),
and if it may contain more than 1 dot or comma,
you may use this function:

// This function strip spaces and other characters from a string and return a number.
// It works for integer and float.
// It expect decimal delimiter to be either a '.' or ','
// Note: everything after an eventual 2nd decimal delimiter will be removed.
function stringToNumber($string) {
    // return 0 if the string contains no number at all or is not a string:
    if (!is_string($string) || !preg_match('/d/', $string)) {
        return 0;
    } 

    // Replace all ',' with '.':
    $workingString = str_replace(',', '.', $string);

    // Keep only number and '.':
    $workingString = preg_replace("/[^0-9.]+/", "", $workingString);

    // Split the integer part and the decimal part,
    // (and eventually a third part if there are more 
    //     than 1 decimal delimiter in the string):
    $explodedString = explode('.', $workingString, 3);

    if ($explodedString[0] === '') {
        // No number was present before the first decimal delimiter, 
        // so we assume it was meant to be a 0:
        $explodedString[0] = '0';
    } 

    if (sizeof($explodedString) === 1) {
        // No decimal delimiter was present in the string,
        // create a string representing an integer:
        $workingString = $explodedString[0];
    } else {
        // A decimal delimiter was present,
        // create a string representing a float:
        $workingString = $explodedString[0] . '.' .  $explodedString[1];
    }

    // Create a number from this now non-ambiguous string:
    $number = $workingString * 1;

    return $number;
}

answered Feb 12, 2020 at 17:44

user1657853's user avatar

4

All suggestions lose the numeric type.

This seems to me a best practice:

function str2num($s){
// Returns a num or FALSE
    $return_value =  !is_numeric($s) ? false :               (intval($s)==floatval($s)) ? intval($s) :floatval($s);
    print "nret=$return_value type=".gettype($return_value)."n";
}

Peter Mortensen's user avatar

answered Apr 29, 2015 at 20:34

Rocco Galasso's user avatar

//Get Only number from string
$string = "123 Hello Zahid";
$res = preg_replace("/[^0-9]/", "", $string);
echo $res."<br>";
//Result 123

answered Sep 9, 2020 at 18:54

Zahid Gani's user avatar

Манипуляции с типами

PHP не требует (и не поддерживает) явного определения типа при объявлении переменной;
тип переменной определяется по контексту, в котором она используется.
То есть, если вы присвоите строковое значение переменной $var, $var станет строкой.
Если вы затем присвоите $var целочисленное значение, она станет целым числом.

Примером автоматического преобразования типа является оператор сложения ‘+’.
Если любой из операндов является числом с плавающей точкой, то все операнды интерпретируются как числа с плавающей точкой,
результатом будет также число с плавающей точкой. В противном случае операнды будут интерпретироваться как целые числа и результат также будет целочисленным.
Обратите внимание, что это НЕ меняет типы самих операндов; меняется только то, как они вычисляются.

$foo = "0"; // $foo это строка (ASCII 48)
$foo += 2; // $foo теперь целое число (2)
$foo = $foo + 1.3; // $foo теперь число с плавающей точкой (3.3)
$foo = 5 + "10 Little Piggies"; // $foo это целое число (15)
$foo = 5 + "10 Small Pigs"; // $foo это целое число (15)

Если последние два примера вам непонятны, смотрите Преобразование строк в числа.

Если вы хотите, чтобы переменная принудительно вычислялась как определенный тип, смотрите раздел приведение типов.
Если вы хотите изменить тип переменной, смотрите settype().

Если вы хотите протестировать любой из примеров, приведенных в данном разделе, вы можете использовать функцию var_dump().

Замечание: Поведение автоматического преобразования в массив в настоящий момент не определено.

$a = "1"; // $a это строка
 $a[0] = "f"; // А как же смещение строки? Что произойдет?

Поскольку PHP поддерживает индексирование в строках с использованием такого же синтаксиса,
как и при индексировании массива, вышеприведенный пример приводит к проблеме:
следует ли $a стать массивом, первым элементом которого будет «f» или «f» должна стать первым символом строки $a?

Текущая версия PHP воспринимает второе присваивание как определение смещения строки, поэтому $a станет «f»,
результат же этого автоматического преобразования следует, однако, рассматривать как неопределенный.
В PHP 4 для доступа к символам строки был введен новый синтаксис фигурных скобок, используйте этот синтаксис вместо вышеприведенного:

$a = "abc"; // $a это строка
 $a{1} = "f"; // $a теперь содержит "afc"

Для дополнительной информации смотрите раздел Доступ к символу в строке.

Приведение типов

Приведение типов в PHP работает так же, как и в C: имя требуемого типа записывается в круглых скобках перед приводимой переменной.

$foo = 10; // $foo это целое число
$bar = (boolean) $foo; // $bar это булев тип
    Допускаются следующие приведения типов:

  • (int), (integer) — приведение к целому числу
  • (bool), (boolean) — приведение к булеву типу
  • (float), (double), (real) — приведение к числу с плавающей точкой (float)
  • (string) — приведение к строке
  • (array) — приведение к массиву
  • (object) — приведение к объекту

Обратите внимание, что внутри скобок допускаются пробелы и символы табуляции, поэтому следующее равносильно по своему действию:

$foo = (int) $bar;
$foo = ( int ) $bar;

Замечание: Вместо приведения переменной к строке, вы можете заключить ее в двойные кавычки.

$foo = 10; // $foo это целое число
 $str = "$foo"; // $str это строка
 $fst = (string) $foo; // $fst это также строка

 // Это напечатает "они одинаковы"
 if ($fst === $str) {
 echo "они одинаковы";
 }

Возможно, вам не совсем ясно, что происходит при приведении между типами. Для дополнительной информации смотрите разделы:

  • Преобразование в булев тип
  • Преобразование в целое число
  • Преобразование в число с плавающей точкой
  • Преобразование в строку
  • Преобразование в массив
  • Преобразование в объект

Смотрите также:
Описание на ru2.php.net
Описание на php.ru

There is no need to type cast in php.


Edit: Since this topic seems to cause some confusion, I thought I’d elaborate a little.

In languages such as Java, there are two things that may carry type. The compiler has a notion about type, and the run time has another idea about types. The compilers types are tied to variables, whereas the run time engine tracks the type of values (Which are assigned to variables). The variable types are known at compile time, whereas the value types are only known at run time.

If a piece of input code violates the compilers type system, the compiler will barf and halt compilation. In other words, it’s impossible to compile a piece of code that violates the static type system. This catches a certain class of errors. For example, take the following piece of (simplified) Java code:

class Alpha {}

class Beta extends Alpha {
  public void sayHello() {
    System.out.println("Hello");
  }
}

If we now did this:

Alpha a = new Beta();

we would be fine, since Beta is a subclass of Alpha, and therefore a valid value for the variable a of type Alpha. However, if we proceed to do:

a.sayHello();

The compiler would give an error, since the method sayHello isn’t a valid method for Alpha — Regardless that we know that a is actually a Beta.

Enter type casting:

((Beta) a).sayHello();

Here we tell the compiler that the variable a should — in this case — be treated as a Beta. This is known as type casting. This loophole is very useful, because it allows polymorphism in the language, but obviously it is also a back door for all sorts of violations of the type system. In order to maintain some type safety, there are therefore some restrictions; You can only cast to types that are related. Eg. up or down a hierarchy. In other words, you wouldn’t be able to cast to a completely unrelated class Charlie.

It’s important to note that all this happens in the compiler — That is, it happens before the code even runs. Java can still get in to run time type errors. For example, if you did this:

class Alpha {}

class Beta extends Alpha {
  public void sayHello() {
    System.out.println("Hello");
  }
}

class Charlie extends Alpha {}

Alpha a = new Charlie();
((Beta) a).sayHello();

The above code is valid for the compiler, but at run time, you’ll get an exception, since the cast from Beta to Charlie is incompatible.

Meanwhile, back at the PHP-farm.

The following is valid to the PHP-compiler — It’ll happily turn this into executable byte code, but you’ll get a run time error:

class Alpha {}

class Beta extends Alpha {
  function sayHello() {
    print "Hello";
  }
}
$a = new Alpha();
$a->sayHello();

This is because PHP variables don’t have type. The compiler has no idea about what run time types are valid for a variable, so it doesn’t try to enforce it. You don’t specify the type explicitly as in Java either. There are type hints, yes, but these are simply run time contracts. The following is still valid:

// reuse the classes from above
function tellToSayHello(Alpha $a) {
  $a->sayHello();
}
tellToSayHello(new Beta());

Even though PHP variables don’t have types, the values still do. A particular interesting aspect of PHP, is that it is possible to change the type of a value. For example:

// The variable $foo holds a value with the type of string
$foo = "42";
echo gettype($foo); // Yields "string"
// Here we change the type from string -> integer
settype($foo, "integer");
echo gettype($foo); // Yields "integer"

This feature some times confused with type casting, but that is a misnomer. The type is still a property of the value, and the type-change happens in runtime — not at compile time.

The ability to change type is also quite limited in PHP. It is only possible to change type between simple types — not objects. Thus, it isn’t possible to change the type from one class to another. You can create a new object and copy the state, but changing the type isn’t possible. PHP is a bit of an outsider in this respect; Other similar languages treat classes as a much more dynamic concept than PHP does.

Another similar feature of PHP is that you can clone a value as a new type, like this:

// The variable $foo holds a value with the type of string
$foo = "42";
echo gettype($foo); // Yields "string"
// Here we change the type from string -> integer
$bar = (integer) $foo;
echo gettype($bar); // Yields "integer"

Syntactically this looks a lot like how a typecast is written in statically typed languages. It’s therefore also often confused with type casting, even though it is still a runtime type-conversion.

To summarise: Type casting is an operation that changes the type of a variable (not the value). Since variables are without type in PHP, it is not only impossible to do, but a nonsensical thing to ask in the first place.

There is no need to type cast in php.


Edit: Since this topic seems to cause some confusion, I thought I’d elaborate a little.

In languages such as Java, there are two things that may carry type. The compiler has a notion about type, and the run time has another idea about types. The compilers types are tied to variables, whereas the run time engine tracks the type of values (Which are assigned to variables). The variable types are known at compile time, whereas the value types are only known at run time.

If a piece of input code violates the compilers type system, the compiler will barf and halt compilation. In other words, it’s impossible to compile a piece of code that violates the static type system. This catches a certain class of errors. For example, take the following piece of (simplified) Java code:

class Alpha {}

class Beta extends Alpha {
  public void sayHello() {
    System.out.println("Hello");
  }
}

If we now did this:

Alpha a = new Beta();

we would be fine, since Beta is a subclass of Alpha, and therefore a valid value for the variable a of type Alpha. However, if we proceed to do:

a.sayHello();

The compiler would give an error, since the method sayHello isn’t a valid method for Alpha — Regardless that we know that a is actually a Beta.

Enter type casting:

((Beta) a).sayHello();

Here we tell the compiler that the variable a should — in this case — be treated as a Beta. This is known as type casting. This loophole is very useful, because it allows polymorphism in the language, but obviously it is also a back door for all sorts of violations of the type system. In order to maintain some type safety, there are therefore some restrictions; You can only cast to types that are related. Eg. up or down a hierarchy. In other words, you wouldn’t be able to cast to a completely unrelated class Charlie.

It’s important to note that all this happens in the compiler — That is, it happens before the code even runs. Java can still get in to run time type errors. For example, if you did this:

class Alpha {}

class Beta extends Alpha {
  public void sayHello() {
    System.out.println("Hello");
  }
}

class Charlie extends Alpha {}

Alpha a = new Charlie();
((Beta) a).sayHello();

The above code is valid for the compiler, but at run time, you’ll get an exception, since the cast from Beta to Charlie is incompatible.

Meanwhile, back at the PHP-farm.

The following is valid to the PHP-compiler — It’ll happily turn this into executable byte code, but you’ll get a run time error:

class Alpha {}

class Beta extends Alpha {
  function sayHello() {
    print "Hello";
  }
}
$a = new Alpha();
$a->sayHello();

This is because PHP variables don’t have type. The compiler has no idea about what run time types are valid for a variable, so it doesn’t try to enforce it. You don’t specify the type explicitly as in Java either. There are type hints, yes, but these are simply run time contracts. The following is still valid:

// reuse the classes from above
function tellToSayHello(Alpha $a) {
  $a->sayHello();
}
tellToSayHello(new Beta());

Even though PHP variables don’t have types, the values still do. A particular interesting aspect of PHP, is that it is possible to change the type of a value. For example:

// The variable $foo holds a value with the type of string
$foo = "42";
echo gettype($foo); // Yields "string"
// Here we change the type from string -> integer
settype($foo, "integer");
echo gettype($foo); // Yields "integer"

This feature some times confused with type casting, but that is a misnomer. The type is still a property of the value, and the type-change happens in runtime — not at compile time.

The ability to change type is also quite limited in PHP. It is only possible to change type between simple types — not objects. Thus, it isn’t possible to change the type from one class to another. You can create a new object and copy the state, but changing the type isn’t possible. PHP is a bit of an outsider in this respect; Other similar languages treat classes as a much more dynamic concept than PHP does.

Another similar feature of PHP is that you can clone a value as a new type, like this:

// The variable $foo holds a value with the type of string
$foo = "42";
echo gettype($foo); // Yields "string"
// Here we change the type from string -> integer
$bar = (integer) $foo;
echo gettype($bar); // Yields "integer"

Syntactically this looks a lot like how a typecast is written in statically typed languages. It’s therefore also often confused with type casting, even though it is still a runtime type-conversion.

To summarise: Type casting is an operation that changes the type of a variable (not the value). Since variables are without type in PHP, it is not only impossible to do, but a nonsensical thing to ask in the first place.

Манипуляции с типами

PHP не требует (и не поддерживает) явного типа при определении переменной;
тип переменной определяется по контексту, в котором она используется.
То есть, если вы присвоите значение типа string
переменной $var, то $var изменит тип
на string.
Если вы затем присвоите $var значение типа int,
она станет целым числом (int).

Примером автоматического преобразования типа является оператор
умножения ‘*’. Если какой-либо из операндов является float,
то все операнды интерпретируются как float,
и результатом также будет float. В
противном случае операнды будут интерпретироваться как int
и результат также будет int. Обратите внимание, что это
НЕ меняет типы самих операндов;
меняется только то, как они вычисляются и сам тип выражения.


<?php
$foo 
"1";  // $foo - это строка (ASCII-код 49)
$foo *= 2;   // $foo теперь целое число (2)
$foo $foo 1.3;  // $foo теперь число с плавающей точкой (2.6)
$foo "10 Little Piggies"// $foo - это целое число (50)
$foo "10 Small Pigs";     // $foo - это целое число (50)
?>

Если последние два приведенных выше примера кажутся странными, посмотрите, как
строки, содержащие числа
преобразуются в целые числа.

Если вы хотите, чтобы переменная принудительно вычислялась как
определенный тип, смотрите раздел приведение
типов. Если вы хотите изменить тип переменной, смотрите
settype().

Если вы хотите протестировать любой из примеров, приведенных в
данном разделе, вы можете использовать функцию
var_dump().

Замечание:

Поведение автоматического преобразования в массив в настоящий
момент не определено.

К тому же, так как PHP поддерживает индексирование в строках аналогично
смещениям элементов массивов, следующий пример будет верен для всех версий PHP:


<?php
$a    
'car'// $a - это строка
$a[0] = 'b';   // $a все еще строка
echo $a;       // bar
?>

Более подробно смотрите в разделе Доступ к символу
в строке.

Приведение типов

Приведение типов в PHP работает так же, как и в C: имя требуемого
типа записывается в круглых скобках перед приводимой переменной.


<?php
$foo 
10;   // $foo - это целое число
$bar = (boolean) $foo;   // $bar - это булев тип
?>

Допускаются следующие приведения типов:

  • (int), (integer) — приведение к int
  • (bool), (boolean) — приведение к bool
  • (float), (double), (real) — приведение к float
  • (string) — приведение к string
  • (array) — приведение к array
  • (object) — приведение к object
  • (unset) — приведение к NULL

Приведение типа (binary) и поддержка префикса b существует для прямой поддержки.
Обратите внимание, что (binary) по существу то же самое, что и (string), но не
следует полагаться на этот тип приведения.

Приведение типа (unset) объявлено устаревшим с PHP 7.2.0. Обратите внимание, что приведение типа (unset)
это то же самое, что присвоение NULL переменной. Тип приведения
(unset) удален в PHP 8.0.0.

Обратите внимание, что внутри скобок допускаются пробелы и
символы табуляции, поэтому следующие примеры равносильны по своему
действию:


<?php
$foo 
= (int) $bar;
$foo = ( int ) $bar;
?>

Приведение строковых литералов и переменных к бинарным строкам:


<?php
$binary 
= (binary) $string;
$binary b"binary string";
?>

Замечание:

Вместо использования приведения переменной к string, можно также заключить
ее в двойные кавычки.


<?php
$foo 
10;            // $foo - это целое число
$str "$foo";        // $str - это строка
$fst = (string) $foo// $fst - это тоже строка

// Это напечатает "они одинаковы"

if ($fst === $str) {
    echo 
"они одинаковы";
}
?>

Может быть не совсем ясно, что именно происходит при приведении между типами.
Для дополнительной информации смотрите разделы:


  • Преобразование в булев тип

  • Преобразование в целое число

  • Преобразование в число с плавающей точкой

  • Преобразование в строку

  • Преобразование в массив

  • Преобразование в объект

  • Преобразование в ресурс

  • Преобразование в NULL

  • Таблицы сравнения типов

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Как изменить тип вставляемого объекта внедренный связанный
  • Как изменить тип волос на голове у мужчин
  • Как изменить тип волос на голове женщины
  • Как изменить тип волос мужчине
  • Как изменить тип видеофайла на компьютере

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии