首页 > 解决方案 > 从 PHP5 更改 PHP7

问题描述

在 PHP7 上,我们知道变量必须使用其类型进行初始化,这与我们在 php5 上所做的不同,即根据设置的值更改类型。

如果我们测试这段代码

  <?php

  /* EAMPLE A */
  $tLisTim="";
  $i=0;
  $tLisTim[$i]=100;
  $i=$i+1;
  $tLisTim[$i]=200;

  var_dump("A");
  var_dump($tLisTim);

  /* EAMPLE B */
  $tLisTim=[];
  $i=0;
  $tLisTim[$i]=100;
  $i=$i+1;
  $tLisTim[$i]=200;

  var_dump("B");
  var_dump($tLisTim);

  ?>  

我们会得到这样的结果:

  PHP 5.6

  string 'A' (length=1)
  array (size=2)
    0 => int 100
    1 => int 200

  string 'B' (length=1)
  array (size=2)
    0 => int 100
    1 => int 200


  PHP 7.1

  string 'A' (length=1)
  string '12' (length=2)

  string 'B' (length=1)
  array (size=2)
    0 => int 100
    1 => int 200

问题是在 PHP7 中没有警告可以帮助我们正确迁移所有这些差异。

我如何检测我们何时尝试使用类型不正确的变量?

谢谢,

标签: phpmigrationphp-7

解决方案


没有警告是因为 PHP 7.1 没有删除对您的代码结构的支持:

空字符串上的字符修改现在与非空字符串一样工作,即写入超出范围的偏移量用空格填充字符串,其中非整数类型转换为整数,并且仅分配字符串的第一个字符用来。以前,空字符串被视为空数组。

http://php.net/manual/en/migration71.incompatible.php#migration71.incompatible.empty-string-modifcation-by-character

这仍然是完全有效的:

$tLisTim="";
$tLisTim[0]=100;
$tLisTim[1]=200;

但它的行为与以前不同。

它不是默默地转换为数组,而是将字符串的第一个位置设置为1,将第二个位置设置为2

这将引发错误:

$tLisTim="";
$tLisTim[]=100;

这将引发警告:

$tLisTim="";
$tLisTim['g']=100;

推荐阅读