Reputation: 1643
$a = 'a';
echo isset($a['b']);
This code returns 1. Why?
Upvotes: 3
Views: 1530
Reputation: 2044
Only for php 5.3:
so lets do it slowly:
$a['b'];
returns 'a' because b is converted to 0 and $a[0] (the first char of 0 = a)
isset($a['b']);
return true because $a['b'] is 'a' not null
echo true;
outputs "1" because true is converted to a string and this to "1".
Upvotes: 2
Reputation: 212412
String characters can be referenced by their offset using syntax like $a[0] for the first character, e.g.
$string = 'Hello';
echo $string[1]; // echoes 'e'
so PHP is recognising that $a is a string; casting your 'b' to a numeric (which casts to a 0), and trying to test isset on $a[0], which is the first character a
Though it should also throw an illegal offset 'b' warning if you have errors enabled
EDIT
$a = 'a';
echo isset($a['b']), PHP_EOL;
echo $a['b'];
PHP 5.3
1
a
PHP 5.4
Warning: Illegal string offset 'b' in /Projects/test/a10.php on line 6
a
PHP 5.5
PHP Warning: Illegal string offset 'b' in /Projects/test/a10.php on line 6
Warning: Illegal string offset 'b' in /Projects/test/a10.php on line 6
a
Upvotes: 7
Reputation: 133
<?php
$a = 'a';
var_dump($a);
?>
it will gives output string(1) "a"
if you will echo $a['b'] it will give you output as a so $a['b'] also has value
hence
<?php
$a = 'a';
echo isset($a['b']);
?>
outputs value 1
Upvotes: 0
Reputation: 21531
For the same reason as this...
echo true;
PHP cannot echo a non-string/non-integer so it converts the true into 1 and 0 for false.
Upvotes: 0