PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

Seznam tokenů parseru> <Unixová oblast: Unix a UDG
Last updated: Sat, 24 Mar 2007

view this page in

Příloha Q. Tabulky porovnání datových typů v PHP

Následující tabulky ukazují chování PHP typů a porovnávacích operatorů, jak pro volné, tak pro striktní porovnávání. Tento doplněk se také vztahuje k manuálové sekci o manipulaci s typy. Inspirace byla čerpána z různých uživatelských komentářů a z práce na » BlueShoes.

Před použitím těchto tabulek je důležité pochopit typy a jejich významy. Například "42" je string (řetězec), kdežto 42 je integer (celé číslo). FALSE je boolean, kdežto "false" je string.

Poznámka: HTML formuláře nepředávají celá čísla, čísla v plovoucí řádové čárce ani pravdivostní hodnoty; předávají řetězce. Ke zjištění, zda se jedná o číselný řetězec, můžete použít funkci is_numeric().

Poznámka: Jednoduché if ($x), když $x není definováno, vygeneruje chybu úrovně E_NOTICE. Namísto toho zvolte použití empty() nebo isset() a/nebo své proměnné inicializujte.

Tabulka Q.1. Porovnání $x v PHP funkcích

Výrazgettype()empty()is_null()isset()boolean : if($x)
$x = "";stringTRUEFALSETRUEFALSE
$x = NULLNULLTRUETRUEFALSEFALSE
var $x;NULLTRUETRUEFALSEFALSE
$x není definovánoNULLTRUETRUEFALSEFALSE
$x = array();arrayTRUEFALSETRUEFALSE
$x = false;booleanTRUEFALSETRUEFALSE
$x = true;booleanFALSEFALSETRUETRUE
$x = 1;integerFALSEFALSETRUETRUE
$x = 42;integerFALSEFALSETRUETRUE
$x = 0;integerTRUEFALSETRUEFALSE
$x = -1;integerFALSEFALSETRUETRUE
$x = "1";stringFALSEFALSETRUETRUE
$x = "0";stringTRUEFALSETRUEFALSE
$x = "-1";stringFALSEFALSETRUETRUE
$x = "php";stringFALSEFALSETRUETRUE
$x = "true";stringFALSEFALSETRUETRUE
$x = "false";stringFALSEFALSETRUETRUE

Tabulka Q.2. Volné porovnání pomocí ==

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

Tabulka Q.3. Striktní porovnání pomocí ===

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

Poznámka pro PHP 3.0: Hodnota řetězce "0" se v PHP 3 považuje za neprázdnou. V PHP 4 se toto chování změnilo a řetězec je nyní považován za prázdný.



Seznam tokenů parseru> <Unixová oblast: Unix a UDG
Last updated: Sat, 24 Mar 2007
 
add a note add a note User Contributed Notes
Tabulky porovnání datových typů v PHP
rich
08-May-2008 04:20
The note about object comparison should be corrected. Cloning objects does not imply instances are the same, so === would return FALSE.

Compare object
<?php
$o
= new stdClass();
$o->we = 12;

$o2 = new stdClass();
$o2->we = 12;

$o3 = clone $o2;
var_dump($o == $o2); //true
var_dump($o === $o2); //false
var_dump($o3 === $o2); //false
?>
gernovich at ya dot ru
08-May-2008 09:48
Universal comparison test.

<?php

$tests
= array();
$tests['==']  = create_function('$a, $b', 'return $a==$b;');
$tests['==='] = create_function('$a, $b', 'return $a===$b;');
$tests['!='] = create_function('$a, $b', 'return $a!=$b;');
$tests['<>'] = create_function('$a, $b', 'return $a<>$b;');
$tests['!=='] = create_function('$a, $b', 'return $a!==$b;');
$tests['<']   = create_function('$a, $b', 'return $a<$b;');
$tests['>']   = create_function('$a, $b', 'return $a>$b;');
$tests['<=']  = create_function('$a, $b', 'return $a<=$b;');
$tests['>=']  = create_function('$a, $b', 'return $a>=$b;');

$comparison = array();
$comparison['TRUE'] = true;
$comparison['FALSE'] = false;
$comparison['1'] = 1;
$comparison['0'] = 0;
$comparison['-1'] = -1;
$comparison['3,14'] = pi();
$comparison['"1"'] = '1';
$comparison['"0"'] = '0';
$comparison['"-1"'] = '-1';
$comparison['NULL'] = null;
$comparison['array()'] = array();
$comparison['"php"'] = 'php';
       
print
'<h1>PHP version '.PHP_VERSION.' type comparison tables</h1>';
       
foreach (
$tests as $test=>$function) {
    print
"<h2>Comparisons with $test</h2>";
    print
"<table border='1'>";
    print
"<tr>";
    print
"<th>&nbsp;</th>";
    foreach (
array_keys($comparison) as $name) {
        print
"<th>$name</th>";
    }
    print
"</tr>";
    foreach (
$comparison as $arg_1_name => $arg_1_value) {
        print
'<tr>';
        print
"<th>$arg_1_name</th>";
        foreach (
$comparison as $arg_2_value) {
            print
'<td>';
            print
$function($arg_1_value, $arg_2_value)==true ?
                       
'<span style="color:#00F;">TRUE</span>' : '<span style="color:#F00;">FALSE</span>';
            print
'</td>';
        }
        print
"</tr>";
    }
    print
"</table>";
}

?>
info at shaelf dot ru
06-Jan-2008 10:51
Compare object
<?php
$o
= new stdClass();
$o->we = 12;

$o2 = new stdClass();
$o2->we = 12;

$o3 = clone $o2;
var_dump($o == $o2); //true
var_dump($o === $o2); //false
var_dump($o3 === $o2); //true
?>
frank
15-Aug-2007 12:06
A comparison table for <=,<,=>,> would be nice...
Following are TRUE (tested PHP4&5):
NULL <= -1
NULL <= 0
NULL <= 1
!(NULL >= -1)
NULL >= 0
!(NULL >= 1)
That was a surprise for me (and it is not like SQL, I would like to have the option to have SQL semantics with NULL...).
15-Mar-2007 11:06
Re: omit's comment

The note omit quotes is referring to the VALUE returned, not its name. If you put 42 into a text field, the corresponding array value will be the string "42". The note makes no comment on the array's keys.
omit
23-Aug-2006 08:32
the manual said "HTML Forms do not pass integers, floats, or booleans; they pass strings"

while this is true, php will sometimes change the type to either type array, or possibly type integer(no, not a numeric string) if it was used as an array key. php seems to do this when it parses the request data into the predefined variable arrays.

example:

<input type="text" name="foo[5]">
<input type="text" name="foo[7]">

now obviously the browser will send those names as a string. but php will change thier type.

<?php

// $_POST['foo'] is an array
var_dump($_POST['foo']);

foreach (
$_POST['foo'] as $key => $val) {
   
// the keys 5 and 7 will be type integer
   
var_dump($key);
}

?>

because of this, its also a good idea to check the types of your variables.
Jan
29-Dec-2005 08:23
Note that php comparison is not transitive:

"php" == 0 => true
0 == null => true
null == "php" => false
php [at] barryhunter [.] co [.] uk
07-Sep-2005 09:44
In case it helps someone, here's a table to compare different Variable tests (created before I found this page!)

http://www.deformedweb.co.uk/php_variable_tests.php
jerryschwartz at comfortable dot com
26-Jul-2005 10:04
In some languages, a boolean is promoted to an integer (with a value of 1 or -1, typically) if used in an expression with an integer. I found that PHP has it both ways:

If you add a boolean with a value of true to an integer with a value of 3, the result will be 4 (because the boolean is cast as an integer).

On the other hand, if you test a boolean with a value of true for equality with an integer with a value of three, the result will be true (because the integer is cast as a boolean).

Surprisingly, at first glance, if you use either < or > as the comparison operator the result is always false (again, because the integer as cast as a boolean, and true is neither greater nor less than true).
tom
17-Jun-2005 11:27
<?php
if (strlen($_POST['var']) > 0) {
   
// form value is ok
}
?>

When working with HTML forms this a good way to:

(A) let "0" post values through like select or radio values that correspond to array keys or checkbox booleans that would return FALSE with empty(), and;
(B) screen out $x = "" values, that would return TRUE with isset()!

Because HTML forms post values as strings, this is a good way to test variables!

[[Editor Note: This will create a PHP Error of level E_NOTICE if the checked variable (in this case $_POST['var']) is undefined. It may be used after (in conjuection with) isset() to prevent this.]]
aidan at php dot net
24-Jan-2005 04: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.

Seznam tokenů parseru> <Unixová oblast: Unix a UDG
Last updated: Sat, 24 Mar 2007
 
 
show source | credits | sitemap | contact | advertising | mirror sites