php7.0和php7.2的变量类型转换问题?

代码001 7.0版本

<?php
$a='';
$a['1']="哈哈哈";
$a['0']="zzz";
var_dump($a);
echo "PHP版本:".phpversion();
?>

结果001 7.0版本

array(2) {
  [1]=>
  string(9) "哈哈哈"
  [0]=>
  string(3) "zzz"
}
PHP版本:7.0.0-dev

代码002 5.6版本

<?php
$a='';
$a['1']="哈哈哈";
$a['0']="zzz";
var_dump($a);
echo "PHP版本:".phpversion();
?>

结果002 5.6版本

array(2) {
  [1]=>
  string(9) "哈哈哈"
  [0]=>
  string(3) "zzz"
}
PHP版本:5.6.9-0+deb8u1

代码003 7.2版本

<?php

echo PHP_VERSION;

try {
    $a = '';
    // $a->a();
    $a['1'] = "哈哈哈";
    $a['0'] = "zzz";
    var_dump($a);
} catch (Exception $e) {

    var_dump($e->getMessage());

} catch (Error $Error) {

    var_dump($Error->getMessage());
    return;
} catch (ParseError $e) {
    echo 123;
    var_dump($Error->getMessage());
} finally {
    echo 'end';

}

7.2.3结果

7.2.3string(2) "z�" end

问题

7.2内部为啥不支持这种类型转换了,从哪里可以看到具体的变化呢?内核代码也行。.

测试地址 :

在线执行php多版本

阅读 3.6k
4 个回答

你在代码之后加个debug_zval_dump($a), 就能看到比较详细的变化.

<?php
$a='';
$a['1']="哈哈哈";
debug_zval_dump($a);
$a['0']="zzz";
debug_zval_dump($a);
var_dump($a);
?>

虽然我也不知道哪里可以看到具体的变化,但是我觉得这样才是比较严谨的

PHP的包容性太强了,都是给惯的坏毛病,以后接触别的语言,满头的包

我猜下, >=7.1的时候

$a = ''; // 这时候 $a[0]还不存在;
$a[0] = "hello world"; // 相当于给字符串 $a的索引0的位置赋值
echo $a; // 'h'  输出为这个大概是string索引这个位置只能存一个字符 

类型应该还是弱类型

$a[] = "hello world";
var_dump($a); // array(1) { [0]=> string(11) "hello world" } 
$a = "";
var_dump($a); // string(0) ""
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题