php isset 问题

WBOY
WBOYOriginal
2016-06-06 20:48:251784Durchsuche

$a = 'link';
$b = 'module';
var_dump( isset( $a[ $b ] ) );

怎么是true,这是怎么算的

回复内容:

$a = 'link';
$b = 'module';
var_dump( isset( $a[ $b ] ) );

怎么是true,这是怎么算的

你加两行代码:

<code>echo $a[$b];//输出: l

echo intval($b);//输出: 0
</code>

原因:

  1. $a 是一个字符串,字符串本质上是byte array,当你用方括号访问它时,PHP就当它是byte array处理
  2. byte array的下标只能是数字,所以你用$b做下标时,PHP会做一次隐式的类型自动转换,把$b这个字符串转换成整形,就转换成0了

如果你希望它返回false,你应该这么写:

<code><?php if (is_array($a) && isset($a[$b]))
</code></code>

参考资料:

  1. 字符串本质上是数组(注意啊,是C层面的数组,下标只能是整数,不是PHP层面的HashTable,下标不能是字符串)
    > Internally, PHP strings are byte arrays. As a result, accessing or modifying a string using array brackets is not multi-byte safe, and should only be done with strings that are in a single-byte encoding such as ISO-8859-1.

来源:http://www.php.net/manual/en/language.types.string.php#language.types.string.substr

  1. 字符串转换成整数时,如果字符串不是以数字开头,会被转换成0
    > If the string starts with valid numeric data, this will be the value used. Otherwise, the value will be 0 (zero)

来源:http://www.php.net/manual/en/language.types.string.php#language.types.string.conversion

不同版本的 PHP 下是不一样的,参见 http://3v4l.org/VgOpW

<code>Output for 5.0.0 - 5.0.2, 5.4.0 - 5.5.6
bool(false)

Output for 4.3.0 - 4.4.9, 5.0.3 - 5.3.27
bool(true)
</code>

所以,还是不要这么用吧。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn