从PHP5更改PHP7

时间:2019-02-11 17:08:18

标签: php migration php-7

在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中没有警告可以帮助我们正确迁移所有这些差异。

如何检测何时尝试使用类型错误的变量?

谢谢

1 个答案:

答案 0 :(得分:1)

没有警告,因为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;