PHP 7.4 compatibility fix / accessing arrays/string using curly brace syntax

PHP used to allow both square brackets and curly braces to be used interchangeably for accessing array elements and string offsets. The curly bracket syntax is only allowed in a limited set of cases and can be confusing for people not used to it.
PHP 7.4 will deprecate the curly brace syntax for accessing array elements and string offsets and it is expected that support will be completely removed in PHP 8.0.
Ref: https://wiki.php.net/rfc/deprecate_curly_braces_array_access

See #47751.
Props jrf.


Built from https://develop.svn.wordpress.org/trunk@45730


git-svn-id: http://core.svn.wordpress.org/trunk@45541 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
Aaron Jorbin 2019-08-03 20:21:55 +00:00
parent b853e21bf9
commit c377191858
8 changed files with 49 additions and 49 deletions

View File

@ -185,8 +185,8 @@ class ftp_base {
$lcount=count($lucifer); $lcount=count($lucifer);
if ($lcount<8) return ''; if ($lcount<8) return '';
$b = array(); $b = array();
$b['isdir'] = $lucifer[0]{0} === "d"; $b['isdir'] = $lucifer[0][0] === "d";
$b['islink'] = $lucifer[0]{0} === "l"; $b['islink'] = $lucifer[0][0] === "l";
if ( $b['isdir'] ) if ( $b['isdir'] )
$b['type'] = 'd'; $b['type'] = 'd';
elseif ( $b['islink'] ) elseif ( $b['islink'] )

View File

@ -599,8 +599,8 @@ class WP_Filesystem_FTPext extends WP_Filesystem_Base {
return ''; return '';
} }
$b = array(); $b = array();
$b['isdir'] = $lucifer[0]{0} === 'd'; $b['isdir'] = $lucifer[0][0] === 'd';
$b['islink'] = $lucifer[0]{0} === 'l'; $b['islink'] = $lucifer[0][0] === 'l';
if ( $b['isdir'] ) { if ( $b['isdir'] ) {
$b['type'] = 'd'; $b['type'] = 'd';
} elseif ( $b['islink'] ) { } elseif ( $b['islink'] ) {

View File

@ -307,7 +307,7 @@ function get_cli_args( $param, $required = false ) {
$last_arg = $key; $last_arg = $key;
} elseif ( (bool) preg_match( '/^-([a-zA-Z0-9]+)/', $args[ $i ], $match ) ) { } elseif ( (bool) preg_match( '/^-([a-zA-Z0-9]+)/', $args[ $i ], $match ) ) {
for ( $j = 0, $jl = strlen( $match[1] ); $j < $jl; $j++ ) { for ( $j = 0, $jl = strlen( $match[1] ); $j < $jl; $j++ ) {
$key = $match[1]{$j}; $key = $match[1][ $j ];
$out[ $key ] = true; $out[ $key ] = true;
} }

View File

@ -177,7 +177,7 @@ class Services_JSON
return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16');
} }
$bytes = (ord($utf16{0}) << 8) | ord($utf16{1}); $bytes = (ord($utf16[0]) << 8) | ord($utf16[1]);
switch(true) { switch(true) {
case ((0x7F & $bytes) == $bytes): case ((0x7F & $bytes) == $bytes):
@ -230,17 +230,17 @@ class Services_JSON
case 2: case 2:
// return a UTF-16 character from a 2-byte UTF-8 char // return a UTF-16 character from a 2-byte UTF-8 char
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
return chr(0x07 & (ord($utf8{0}) >> 2)) return chr(0x07 & (ord($utf8[0]) >> 2))
. chr((0xC0 & (ord($utf8{0}) << 6)) . chr((0xC0 & (ord($utf8[0]) << 6))
| (0x3F & ord($utf8{1}))); | (0x3F & ord($utf8[1])));
case 3: case 3:
// return a UTF-16 character from a 3-byte UTF-8 char // return a UTF-16 character from a 3-byte UTF-8 char
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
return chr((0xF0 & (ord($utf8{0}) << 4)) return chr((0xF0 & (ord($utf8[0]) << 4))
| (0x0F & (ord($utf8{1}) >> 2))) | (0x0F & (ord($utf8[1]) >> 2)))
. chr((0xC0 & (ord($utf8{1}) << 6)) . chr((0xC0 & (ord($utf8[1]) << 6))
| (0x7F & ord($utf8{2}))); | (0x7F & ord($utf8[2])));
} }
// ignoring UTF-32 for now, sorry // ignoring UTF-32 for now, sorry
@ -323,7 +323,7 @@ class Services_JSON
*/ */
for ($c = 0; $c < $strlen_var; ++$c) { for ($c = 0; $c < $strlen_var; ++$c) {
$ord_var_c = ord($var{$c}); $ord_var_c = ord($var[$c]);
switch (true) { switch (true) {
case $ord_var_c == 0x08: case $ord_var_c == 0x08:
@ -346,12 +346,12 @@ class Services_JSON
case $ord_var_c == 0x2F: case $ord_var_c == 0x2F:
case $ord_var_c == 0x5C: case $ord_var_c == 0x5C:
// double quote, slash, slosh // double quote, slash, slosh
$ascii .= '\\'.$var{$c}; $ascii .= '\\'.$var[$c];
break; break;
case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
// characters U-00000000 - U-0000007F (same as ASCII) // characters U-00000000 - U-0000007F (same as ASCII)
$ascii .= $var{$c}; $ascii .= $var[$c];
break; break;
case (($ord_var_c & 0xE0) == 0xC0): case (($ord_var_c & 0xE0) == 0xC0):
@ -363,7 +363,7 @@ class Services_JSON
break; break;
} }
$char = pack('C*', $ord_var_c, ord($var{$c + 1})); $char = pack('C*', $ord_var_c, ord($var[$c + 1]));
$c += 1; $c += 1;
$utf16 = $this->utf82utf16($char); $utf16 = $this->utf82utf16($char);
$ascii .= sprintf('\u%04s', bin2hex($utf16)); $ascii .= sprintf('\u%04s', bin2hex($utf16));
@ -378,8 +378,8 @@ class Services_JSON
// characters U-00000800 - U-0000FFFF, mask 1110XXXX // characters U-00000800 - U-0000FFFF, mask 1110XXXX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char = pack('C*', $ord_var_c, $char = pack('C*', $ord_var_c,
@ord($var{$c + 1}), @ord($var[$c + 1]),
@ord($var{$c + 2})); @ord($var[$c + 2]));
$c += 2; $c += 2;
$utf16 = $this->utf82utf16($char); $utf16 = $this->utf82utf16($char);
$ascii .= sprintf('\u%04s', bin2hex($utf16)); $ascii .= sprintf('\u%04s', bin2hex($utf16));
@ -394,9 +394,9 @@ class Services_JSON
// characters U-00010000 - U-001FFFFF, mask 11110XXX // characters U-00010000 - U-001FFFFF, mask 11110XXX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char = pack('C*', $ord_var_c, $char = pack('C*', $ord_var_c,
ord($var{$c + 1}), ord($var[$c + 1]),
ord($var{$c + 2}), ord($var[$c + 2]),
ord($var{$c + 3})); ord($var[$c + 3]));
$c += 3; $c += 3;
$utf16 = $this->utf82utf16($char); $utf16 = $this->utf82utf16($char);
$ascii .= sprintf('\u%04s', bin2hex($utf16)); $ascii .= sprintf('\u%04s', bin2hex($utf16));
@ -411,10 +411,10 @@ class Services_JSON
break; break;
} }
$char = pack('C*', $ord_var_c, $char = pack('C*', $ord_var_c,
ord($var{$c + 1}), ord($var[$c + 1]),
ord($var{$c + 2}), ord($var[$c + 2]),
ord($var{$c + 3}), ord($var[$c + 3]),
ord($var{$c + 4})); ord($var[$c + 4]));
$c += 4; $c += 4;
$utf16 = $this->utf82utf16($char); $utf16 = $this->utf82utf16($char);
$ascii .= sprintf('\u%04s', bin2hex($utf16)); $ascii .= sprintf('\u%04s', bin2hex($utf16));
@ -429,11 +429,11 @@ class Services_JSON
// characters U-04000000 - U-7FFFFFFF, mask 1111110X // characters U-04000000 - U-7FFFFFFF, mask 1111110X
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char = pack('C*', $ord_var_c, $char = pack('C*', $ord_var_c,
ord($var{$c + 1}), ord($var[$c + 1]),
ord($var{$c + 2}), ord($var[$c + 2]),
ord($var{$c + 3}), ord($var[$c + 3]),
ord($var{$c + 4}), ord($var[$c + 4]),
ord($var{$c + 5})); ord($var[$c + 5]));
$c += 5; $c += 5;
$utf16 = $this->utf82utf16($char); $utf16 = $this->utf82utf16($char);
$ascii .= sprintf('\u%04s', bin2hex($utf16)); $ascii .= sprintf('\u%04s', bin2hex($utf16));
@ -626,7 +626,7 @@ class Services_JSON
for ($c = 0; $c < $strlen_chrs; ++$c) { for ($c = 0; $c < $strlen_chrs; ++$c) {
$substr_chrs_c_2 = $this->substr8($chrs, $c, 2); $substr_chrs_c_2 = $this->substr8($chrs, $c, 2);
$ord_chrs_c = ord($chrs{$c}); $ord_chrs_c = ord($chrs[$c]);
switch (true) { switch (true) {
case $substr_chrs_c_2 == '\b': case $substr_chrs_c_2 == '\b':
@ -656,7 +656,7 @@ class Services_JSON
case $substr_chrs_c_2 == '\\/': case $substr_chrs_c_2 == '\\/':
if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || if (($delim == '"' && $substr_chrs_c_2 != '\\\'') ||
($delim == "'" && $substr_chrs_c_2 != '\\"')) { ($delim == "'" && $substr_chrs_c_2 != '\\"')) {
$utf8 .= $chrs{++$c}; $utf8 .= $chrs[++$c];
} }
break; break;
@ -669,7 +669,7 @@ class Services_JSON
break; break;
case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F):
$utf8 .= $chrs{$c}; $utf8 .= $chrs[$c];
break; break;
case ($ord_chrs_c & 0xE0) == 0xC0: case ($ord_chrs_c & 0xE0) == 0xC0:
@ -716,7 +716,7 @@ class Services_JSON
} elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) {
// array, or object notation // array, or object notation
if ($str{0} == '[') { if ($str[0] == '[') {
$stk = array(SERVICES_JSON_IN_ARR); $stk = array(SERVICES_JSON_IN_ARR);
$arr = array(); $arr = array();
} else { } else {
@ -755,7 +755,7 @@ class Services_JSON
$top = end($stk); $top = end($stk);
$substr_chrs_c_2 = $this->substr8($chrs, $c, 2); $substr_chrs_c_2 = $this->substr8($chrs, $c, 2);
if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) { if (($c == $strlen_chrs) || (($chrs[$c] == ',') && ($top['what'] == SERVICES_JSON_SLICE))) {
// found a comma that is not inside a string, array, etc., // found a comma that is not inside a string, array, etc.,
// OR we've reached the end of the character list // OR we've reached the end of the character list
$slice = $this->substr8($chrs, $top['where'], ($c - $top['where'])); $slice = $this->substr8($chrs, $top['where'], ($c - $top['where']));
@ -796,12 +796,12 @@ class Services_JSON
} }
} elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) { } elseif ((($chrs[$c] == '"') || ($chrs[$c] == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) {
// found a quote, and we are not inside a string // found a quote, and we are not inside a string
array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c})); array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs[$c]));
//print("Found start of string at {$c}\n"); //print("Found start of string at {$c}\n");
} elseif (($chrs{$c} == $top['delim']) && } elseif (($chrs[$c] == $top['delim']) &&
($top['what'] == SERVICES_JSON_IN_STR) && ($top['what'] == SERVICES_JSON_IN_STR) &&
(($this->strlen8($this->substr8($chrs, 0, $c)) - $this->strlen8(rtrim($this->substr8($chrs, 0, $c), '\\'))) % 2 != 1)) { (($this->strlen8($this->substr8($chrs, 0, $c)) - $this->strlen8(rtrim($this->substr8($chrs, 0, $c), '\\'))) % 2 != 1)) {
// found a quote, we're in a string, and it's not escaped // found a quote, we're in a string, and it's not escaped
@ -810,24 +810,24 @@ class Services_JSON
array_pop($stk); array_pop($stk);
//print("Found end of string at {$c}: ".$this->substr8($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n"); //print("Found end of string at {$c}: ".$this->substr8($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n");
} elseif (($chrs{$c} == '[') && } elseif (($chrs[$c] == '[') &&
in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
// found a left-bracket, and we are in an array, object, or slice // found a left-bracket, and we are in an array, object, or slice
array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false));
//print("Found start of array at {$c}\n"); //print("Found start of array at {$c}\n");
} elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) { } elseif (($chrs[$c] == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) {
// found a right-bracket, and we're in an array // found a right-bracket, and we're in an array
array_pop($stk); array_pop($stk);
//print("Found end of array at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); //print("Found end of array at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n");
} elseif (($chrs{$c} == '{') && } elseif (($chrs[$c] == '{') &&
in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
// found a left-brace, and we are in an array, object, or slice // found a left-brace, and we are in an array, object, or slice
array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false));
//print("Found start of object at {$c}\n"); //print("Found start of object at {$c}\n");
} elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) { } elseif (($chrs[$c] == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) {
// found a right-brace, and we're in an object // found a right-brace, and we're in an object
array_pop($stk); array_pop($stk);
//print("Found end of object at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); //print("Found end of object at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n");

View File

@ -376,7 +376,7 @@ class POP3 {
$line = fgets($fp,$buffer); $line = fgets($fp,$buffer);
while ( !preg_match('/^\.\r\n/',$line)) while ( !preg_match('/^\.\r\n/',$line))
{ {
if ( $line{0} == '.' ) { $line = substr($line,1); } if ( $line[0] == '.' ) { $line = substr($line,1); }
$MsgArray[$count] = $line; $MsgArray[$count] = $line;
$count++; $count++;
$line = fgets($fp,$buffer); $line = fgets($fp,$buffer);

View File

@ -757,8 +757,8 @@ final class _WP_Editors {
$options .= $key . ':' . $val . ','; $options .= $key . ':' . $val . ',';
continue; continue;
} elseif ( ! empty( $value ) && is_string( $value ) && ( } elseif ( ! empty( $value ) && is_string( $value ) && (
( '{' == $value{0} && '}' == $value{strlen( $value ) - 1} ) || ( '{' == $value[0] && '}' == $value[ strlen( $value ) - 1 ] ) ||
( '[' == $value{0} && ']' == $value{strlen( $value ) - 1} ) || ( '[' == $value[0] && ']' == $value[ strlen( $value ) - 1 ] ) ||
preg_match( '/^\(?function ?\(/', $value ) ) ) { preg_match( '/^\(?function ?\(/', $value ) ) ) {
$options .= $key . ':' . $value . ','; $options .= $key . ':' . $value . ',';

View File

@ -754,8 +754,8 @@ function wp_tinymce_inline_scripts() {
$init_obj .= $key . ':' . $val . ','; $init_obj .= $key . ':' . $val . ',';
continue; continue;
} elseif ( ! empty( $value ) && is_string( $value ) && ( } elseif ( ! empty( $value ) && is_string( $value ) && (
( '{' === $value{0} && '}' === $value{strlen( $value ) - 1} ) || ( '{' === $value[0] && '}' === $value[ strlen( $value ) - 1 ] ) ||
( '[' === $value{0} && ']' === $value{strlen( $value ) - 1} ) || ( '[' === $value[0] && ']' === $value[ strlen( $value ) - 1 ] ) ||
preg_match( '/^\(?function ?\(/', $value ) ) ) { preg_match( '/^\(?function ?\(/', $value ) ) ) {
$init_obj .= $key . ':' . $value . ','; $init_obj .= $key . ':' . $value . ',';
continue; continue;

View File

@ -13,7 +13,7 @@
* *
* @global string $wp_version * @global string $wp_version
*/ */
$wp_version = '5.3-alpha-45729'; $wp_version = '5.3-alpha-45730';
/** /**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema. * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.