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

Следующие таблицы демонстрируют работу PHP с типами переменных и операторами сравнения, как в случае свободного, так и в случае строгого сравнения. Также эта информация относится к разделу документации по приведению типов. Вдохновением на создание этого раздела мы обязаны различным комментариям пользователей и работе над BlueShoes.

До осмотра таблиц, важно знать и понимать типы переменных и их значения. К примеру, "42" -- строка, в то время как 42 -- целое. FALSE -- логическое, а "false" -- строка.

Замечание: HTML-формы не передают тип переменной: они всегда передают строки. Для проверки является ли строка числом, используйте функцию is_numeric().

Замечание: Использование if ($x) пока $x не определена сгенерирует ошибку E_NOTICE. Вместо этого используйте функцию empty() или isset() и/или инициализируйте переменную.

Таблица O-1. Сравнение типов $x и результатов функций PHP, связанных с типами

Выражениеgettype()empty()is_null()isset()логическое : if($x)
$x = "";строкаTRUEFALSETRUEFALSE
$x = NULLNULLTRUETRUEFALSEFALSE
var $x;NULLTRUETRUEFALSEFALSE
$x неопределенаNULLTRUETRUEFALSEFALSE
$x = array();массивTRUEFALSETRUEFALSE
$x = false;логическоеTRUEFALSETRUEFALSE
$x = true;логическоеFALSEFALSETRUETRUE
$x = 1;целоеFALSEFALSETRUETRUE
$x = 42;целоеFALSEFALSETRUETRUE
$x = 0;целоеTRUEFALSETRUEFALSE
$x = -1;целоеFALSEFALSETRUETRUE
$x = "1";строкаFALSEFALSETRUETRUE
$x = "0";строкаTRUEFALSETRUEFALSE
$x = "-1";строкаFALSEFALSETRUETRUE
$x = "php";строкаFALSEFALSETRUETRUE
$x = "true";строкаFALSEFALSETRUETRUE
$x = "false";строкаFALSEFALSETRUETRUE

Таблица O-2. Гибкое сравнение с помощью ==

 TRUEFALSE10-1"1""0""-1"NULLarray()"php"
TRUETRUEFALSETRUEFALSETRUETRUEFALSETRUEFALSEFALSETRUE
FALSEFALSETRUEFALSETRUEFALSEFALSETRUEFALSETRUETRUEFALSE
1TRUEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSE
0FALSETRUEFALSETRUEFALSEFALSETRUEFALSETRUEFALSETRUE
-1TRUEFALSEFALSEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSE
"1"TRUEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSE
"0"FALSETRUEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSEFALSE
"-1"TRUEFALSEFALSEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSE
NULLFALSETRUEFALSETRUEFALSEFALSEFALSEFALSETRUETRUEFALSE
array()FALSETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSE
"php"TRUEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSETRUE

Таблица O-3. Жёсткое сравнение с помощью ===

 TRUEFALSE10-1"1""0""-1"NULLarray()"php"
TRUETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
FALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
1FALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
0FALSEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
-1FALSEFALSEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSE
"1"FALSEFALSEFALSEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSE
"0"FALSEFALSEFALSEFALSEFALSEFALSETRUEFALSEFALSEFALSEFALSE
"-1"FALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSEFALSEFALSE
NULLFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSEFALSE
array()FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSE
"php"FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUE

Заметка о PHP 3.0: Строка "0" считалась не пустой, в PHP4 ситуация изменилась: строка трактуется как пустая.



add a note add a note User Contributed Notes
Таблица сравнения типов в PHP
Edgar dot Miller at gmail dot com
20-Apr-2005 07:55
Hi out there,

after not reading this part of the manual in past 5 years ;) ,  I found this great information about testing types for variables.

I could not stop until i wrote a method to get all information from the 'Tabelle O-1'.

so I put a number infront of every line of 'Tabelle O-1' and the method gives back the linenumber as result as it would be in 'Tabelle O-1'.

   define('TYPE_EMPTYSTRING',1);
   define('TYPE_UNDEFINED',2);
   define('TYPE_ARRAY',5);
   define('TYPE_BOOLEAN',6);
   define('TYPE_INTEGER',8);
   define('TYPE_INTEGER_ZERO',10);
   define('TYPE_STRING_INTEGER',12);
   define('TYPE_STRING_INTEGER_ZERO',13);
   define('TYPE_STRING',15);

 private function getTheType($var)
 {
 if ( gettype($var) == 'string' ) // 1 && 12 && 13 && 14 && 15 && 16 && 17
 {
 if ( is_null($var) === false && isset($var) === true )
 {

 if ( empty($var) === true && ((bool)($var)) === false ) // 1 && 13
 {
 if ( $var == '' )
 {
 $type = 1;
 }
 else
 {
 $type = 13;
 }

 }
 elseif ( is_numeric($var) === true) // 12 && 15
 {
 $type = 12; // && 14
 }
 else
 {
 $type = 15; // && 16 && 17
 }
 }
 else
 {
 $type = 99 ;
 }
 }
 elseif ( gettype($var) == 'integer' )
 {
 if ( empty($var) === false )
 {
 $type = 8; // && 9 && 11
 }
 else
 {
 $type = 10;
 }

 }
 elseif ( gettype($var) == 'boolean' )
 {
 $type = 6; // && 7
 }
 elseif ( gettype($var) == 'NULL' )
 {
 $type = 2; // && 3 && 4
 }
 elseif ( gettype($var) == 'array' )
 {
 $type = 5;
 }
 else
 {
 $type = 99;
 }

print "'".$var .' .. '. $type."'";
 return $type;
 }

now you can write small wrapper methods like this:

   function isNumberZero($var)
   {
       if ( getTheType($var) == TYPE_INTEGER_ZERO )
       {
           return true;
       }
       else
       {
           return false;
       }
   }

regards
Erdal

thanks to blueshoes and php for stating this information.
aidan at php dot net
24-Jan-2005 10:00
The way PHP handles comparisons when multiple types are concerned is quite confusing.

For example:
"php" == 0

This is true, because the string is casted interally to an integer. Any string (that does not start with a number), when casted to an integer, will be 0.