“超出范围偏移量”的含义是什么,“何时只使用指定字符串的第一个字符”?

时间:2018-03-15 15:51:01

标签: php string null byte offset

我正在使用 PHP 7.2.2

我无法理解PHP Manual

中的以下段落
  

警告写入超出范围的偏移量会填充带有空格的字符串。   非整数类型转换为整数。非法偏移类型发出   的 E_NOTICE 即可。仅使用指定字符串的第一个字符。如   在PHP 7.1.0中,分配一个空字符串会引发致命错误。   以前,它分配了一个NULL字节。

我在上面的段落中一直存在疑问/问题:

  1. 这里的'超出范围偏移'究竟是什么意思?
  2. 将非整数类型转换为整数。它是正在考虑的字符串中的偏移量或字符,其类型转换将会发生吗?
  3. '非法抵消类型'究竟是什么意思?
  4. 何时'只使用指定字符串的第一个字符'?
  5. 最后一句话是什么意思'以前'它分配了一个空字节。'?具体来说,NULL字节是什么意思?
  6. 有人可以通过合适的工作代码示例以易于理解的语言回答我的所有疑问/问题吗?

2 个答案:

答案 0 :(得分:3)

这是一个字符串,例如:$string = 'word';

在PHP中,字符串是一个字节数组。您可以通过数字索引引用字符串中的特定字符(字节)。如果偏移量介于0(第一个字符)和strlen($string) - 1(最后一个字符)之间,则偏移量在范围内。

此示例使用索引0到3迭代字符串中的字符。

$len = strlen($string);

for ($i=0; $i < $len; $i++) {
    $char = $string[$i];
    var_dump($i, $char);
}

超出范围偏移量是超出strlen的任何索引 - 1.此代码将生成通知:

$char = $string[4];
var_dump($char);    // string ''
  

注意:未初始化的字符串偏移量:4

使用非整数类型作为索引会将类型转换为整数。此示例中的字符串foo(非法偏移类型)将转换为0,因此字符串的第一个字符将被替换。

$string['foo'] = 'c';
var_dump($string); // string 'cord'

如果您尝试分配一个包含多个字符的字符串,则仅使用其第一个字符,如果您尝试分配超出该字词结尾的索引,则间隔索引将填充空格。< / p>

$string[5] = 'something';
var_dump($string);         // string 'cord s'

答案 1 :(得分:3)

本手册的这一部分是指将字符串视为一个字符数组。

  • &#34;超出范围&#34; offset指的是一个整数索引,它位于比当前字符串本身更长的位置,例如$x = "foo"; $x[10] = 'o';会导致$x成为foo o

  • 如果使用非整数索引值,则在访问字符串的索引之前将索引值转换为整数,例如, $x = "foo"; $y = $x[true];导致$y获得$x[1] - o

  • 的值
  • 非法偏移类型是指通常不能用作数组偏移的任何内容,例如: class Foo() {} - 使用$x[new Foo()];索引字符串会引发警告

  • 第一个字符表示如果您尝试将字符串分配给现有字符串的索引,则仅使用指定字符串的第一个字符,例如, $x = "foo"; $x[0] = "hi";会导致$x成为hoo;

  • 在索引处为字符串指定空字符串值现在会导致错误,而不是分配&#34; null&#34;字节\0,例如$x[0] = '' 将致命。