Negative string offsets read from the end

Reading the last character of a string has been $s[strlen($s) - 1] for two decades, which computes the length to throw it away and reads badly next to the array syntax it borrows.

$sku = 'FR-100-XL';

$sku[-1];              // 'L'
$sku[-2];              // 'X'
substr($sku, -2);      // 'XL'
strpos($sku, '-', -4); // negative offset now accepted here too

The change extends to strpos, substr_count and several others that previously rejected a negative offset, which is the part that removes real code rather than shortening it. Reading past the start still emits a notice and returns an empty string, so it is not a bounds check — a negative offset on a shorter string than expected fails the same quiet way a positive one does.