Skip to content

Commit e8b0163

Browse files
committed
Promote write "use scalar as array" warning to Error
1 parent 32c20d5 commit e8b0163

8 files changed

+91
-79
lines changed

UPGRADING

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -86,18 +86,16 @@ PHP 8.0 UPGRADE NOTES
8686
function test(?int $arg = CONST_RESOLVING_TO_NULL) {}
8787
// Or
8888
function test(int $arg = null) {}
89-
. Attempting to write to a property of a non-object will now result in an
90-
Error exception. Previously this resulted in a warning and either converted
91-
the value into an object (if it was null, false or an empty string) or
92-
ignored the write altogether (in all other cases).
93-
RFC: Part of https://wiki.php.net/rfc/engine_warnings
94-
. Attempting to append an element to an array for which the PHP_INT_MAX key
95-
is already used will now result in an Error exception. Previously this was
96-
a warning.
97-
RFC: Part of https://wiki.php.net/rfc/engine_warnings
98-
. Attempting to use an invalid type (array or object) as an array key or
99-
string offset will now result in a TypeError exception. Previously this was
100-
a warning.
89+
. A number of warnings have been converted into Error exceptions:
90+
91+
* Attempting to write to a property of a non-object. Previously this
92+
implicitly created an stdClass object for null, false and empty strings.
93+
* Attempting to append an element to an array for which the PHP_INT_MAX key
94+
is already used.
95+
* Attempting to use an invalid type (array or object) as an array key or
96+
string offset.
97+
* Attempting to write to an index of a scalar value.
98+
10199
RFC: Part of https://wiki.php.net/rfc/engine_warnings
102100

103101
- COM:

Zend/tests/assign_dim_obj_null_return.phpt

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,12 @@ function test() {
2424
} catch (Error $e) {
2525
echo $e->getMessage(), "\n";
2626
}
27-
var_dump($true[123] = 456);
27+
28+
try {
29+
var_dump($true[123] = 456);
30+
} catch (Error $e) {
31+
echo $e->getMessage(), "\n";
32+
}
2833

2934
try {
3035
var_dump($array[] += 123);
@@ -43,7 +48,12 @@ function test() {
4348
} catch (Error $e) {
4449
echo $e->getMessage(), "\n";
4550
}
46-
var_dump($true[123] += 456);
51+
52+
try {
53+
var_dump($true[123] += 456);
54+
} catch (Error $e) {
55+
echo $e->getMessage(), "\n";
56+
}
4757

4858
try {
4959
var_dump($true->foo = 123);
@@ -60,18 +70,14 @@ function test() {
6070
test();
6171

6272
?>
63-
--EXPECTF--
73+
--EXPECT--
6474
Cannot add element to the array as the next element is already occupied
6575
Illegal offset type
6676
Illegal offset type
67-
68-
Warning: Cannot use a scalar value as an array in %s on line %d
69-
NULL
77+
Cannot use a scalar value as an array
7078
Cannot add element to the array as the next element is already occupied
7179
Illegal offset type
7280
Illegal offset type
73-
74-
Warning: Cannot use a scalar value as an array in %s on line %d
75-
NULL
81+
Cannot use a scalar value as an array
7682
Attempt to assign property 'foo' of non-object
7783
Attempt to assign property 'foo' of non-object

Zend/tests/indexing_001.phpt

Lines changed: 40 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -7,32 +7,48 @@ $array=array(1);
77
$testvalues=array(null, 0, 1, true, false,'',' ',0.1,array());
88

99
foreach ($testvalues as $testvalue) {
10-
$testvalue['foo']=$array;
11-
var_dump ($testvalue);
10+
try {
11+
$testvalue['foo']=$array;
12+
} catch (Error $e) {
13+
echo $e->getMessage(), "\n";
14+
}
15+
var_dump($testvalue);
1216
}
1317
echo "\n*** Indexing - Testing reference assignment with key ***\n";
1418

1519
$testvalues=array(null, 0, 1, true, false,0.1,array());
1620

1721
foreach ($testvalues as $testvalue) {
18-
$testvalue['foo']=&$array;
19-
var_dump ($testvalue);
22+
try {
23+
$testvalue['foo']=&$array;
24+
} catch (Error $e) {
25+
echo $e->getMessage(), "\n";
26+
}
27+
var_dump($testvalue);
2028
}
2129
echo "*** Indexing - Testing value assignment no key ***\n";
2230
$array=array(1);
2331
$testvalues=array(null, 0, 1, true, false,0.1,array());
2432

2533
foreach ($testvalues as $testvalue) {
26-
$testvalue[]=$array;
27-
var_dump ($testvalue);
34+
try {
35+
$testvalue[]=$array;
36+
} catch (Error $e) {
37+
echo $e->getMessage(), "\n";
38+
}
39+
var_dump ($testvalue);
2840
}
2941
echo "\n*** Indexing - Testing reference assignment no key ***\n";
3042

3143
$testvalues=array(null, 0, 1, true, false,0.1,array());
3244

3345
foreach ($testvalues as $testvalue) {
34-
$testvalue[]=&$array;
35-
var_dump ($testvalue);
46+
try {
47+
$testvalue[]=&$array;
48+
} catch (Error $e) {
49+
echo $e->getMessage(), "\n";
50+
}
51+
var_dump ($testvalue);
3652
}
3753

3854

@@ -47,14 +63,11 @@ array(1) {
4763
int(1)
4864
}
4965
}
50-
51-
Warning: Cannot use a scalar value as an array in %s on line %d
66+
Cannot use a scalar value as an array
5267
int(0)
53-
54-
Warning: Cannot use a scalar value as an array in %s on line %d
68+
Cannot use a scalar value as an array
5569
int(1)
56-
57-
Warning: Cannot use a scalar value as an array in %s on line %d
70+
Cannot use a scalar value as an array
5871
bool(true)
5972
array(1) {
6073
["foo"]=>
@@ -73,8 +86,7 @@ Warning: Illegal string offset 'foo' in %s on line %d
7386

7487
Notice: Array to string conversion in %s on line %d
7588
string(1) "A"
76-
77-
Warning: Cannot use a scalar value as an array in %s on line %d
89+
Cannot use a scalar value as an array
7890
float(0.1)
7991
array(1) {
8092
["foo"]=>
@@ -92,14 +104,11 @@ array(1) {
92104
int(1)
93105
}
94106
}
95-
96-
Warning: Cannot use a scalar value as an array in %s on line %d
107+
Cannot use a scalar value as an array
97108
int(0)
98-
99-
Warning: Cannot use a scalar value as an array in %s on line %d
109+
Cannot use a scalar value as an array
100110
int(1)
101-
102-
Warning: Cannot use a scalar value as an array in %s on line %d
111+
Cannot use a scalar value as an array
103112
bool(true)
104113
array(1) {
105114
["foo"]=>
@@ -108,8 +117,7 @@ array(1) {
108117
int(1)
109118
}
110119
}
111-
112-
Warning: Cannot use a scalar value as an array in %s on line %d
120+
Cannot use a scalar value as an array
113121
float(0.1)
114122
array(1) {
115123
["foo"]=>
@@ -126,14 +134,11 @@ array(1) {
126134
int(1)
127135
}
128136
}
129-
130-
Warning: Cannot use a scalar value as an array in %s on line %d
137+
Cannot use a scalar value as an array
131138
int(0)
132-
133-
Warning: Cannot use a scalar value as an array in %s on line %d
139+
Cannot use a scalar value as an array
134140
int(1)
135-
136-
Warning: Cannot use a scalar value as an array in %s on line %d
141+
Cannot use a scalar value as an array
137142
bool(true)
138143
array(1) {
139144
[0]=>
@@ -142,8 +147,7 @@ array(1) {
142147
int(1)
143148
}
144149
}
145-
146-
Warning: Cannot use a scalar value as an array in %s on line %d
150+
Cannot use a scalar value as an array
147151
float(0.1)
148152
array(1) {
149153
[0]=>
@@ -161,14 +165,11 @@ array(1) {
161165
int(1)
162166
}
163167
}
164-
165-
Warning: Cannot use a scalar value as an array in %s on line %d
168+
Cannot use a scalar value as an array
166169
int(0)
167-
168-
Warning: Cannot use a scalar value as an array in %s on line %d
170+
Cannot use a scalar value as an array
169171
int(1)
170-
171-
Warning: Cannot use a scalar value as an array in %s on line %d
172+
Cannot use a scalar value as an array
172173
bool(true)
173174
array(1) {
174175
[0]=>
@@ -177,8 +178,7 @@ array(1) {
177178
int(1)
178179
}
179180
}
180-
181-
Warning: Cannot use a scalar value as an array in %s on line %d
181+
Cannot use a scalar value as an array
182182
float(0.1)
183183
array(1) {
184184
[0]=>

Zend/zend_execute.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1887,7 +1887,7 @@ static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_param_must_be_ref(con
18871887

18881888
static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_use_scalar_as_array(void)
18891889
{
1890-
zend_error(E_WARNING, "Cannot use a scalar value as an array");
1890+
zend_throw_error(NULL, "Cannot use a scalar value as an array");
18911891
}
18921892

18931893
static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_cannot_add_element(void)
@@ -2172,7 +2172,7 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval *
21722172
ZVAL_ERROR(result);
21732173
} else {
21742174
if (type == BP_VAR_UNSET) {
2175-
zend_error(E_WARNING, "Cannot unset offset in a non-array variable");
2175+
zend_throw_error(NULL, "Cannot unset offset in a non-array variable");
21762176
ZVAL_NULL(result);
21772177
} else {
21782178
zend_use_scalar_as_array();

ext/opcache/jit/zend_jit_helpers.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -931,10 +931,10 @@ static void ZEND_FASTCALL zend_jit_assign_dim_helper(zval *object_ptr, zval *dim
931931
}
932932
} else {
933933
//??? if (OP1_TYPE != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
934-
zend_error(E_WARNING, "Cannot use a scalar value as an array");
934+
zend_throw_error(NULL, "Cannot use a scalar value as an array");
935935
//??? }
936936
if (result) {
937-
ZVAL_NULL(result);
937+
ZVAL_UNDEF(result);
938938
}
939939
}
940940
}
@@ -978,7 +978,7 @@ static void ZEND_FASTCALL zend_jit_assign_dim_op_helper(zval *container, zval *d
978978
//??? ZEND_VM_C_GOTO(assign_dim_op_convert_to_array);
979979
} else {
980980
//??? if (UNEXPECTED(OP1_TYPE != IS_VAR || EXPECTED(!Z_ISERROR_P(container)))) {
981-
zend_error(E_WARNING, "Cannot use a scalar value as an array");
981+
zend_throw_error(NULL, "Cannot use a scalar value as an array");
982982
//??? }
983983
//??? if (retval) {
984984
//??? ZVAL_NULL(retval);

ext/opcache/tests/jit/assign_dim_002.phpt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,13 @@ function foo4() {
7171
foo4();
7272

7373
function foo5() {
74-
$a = 1;
75-
$a[2] = 1;
76-
return $a;
74+
$a = 1;
75+
try {
76+
$a[2] = 1;
77+
} catch (Error $e) {
78+
echo $e->getMessage(), "\n";
79+
}
80+
return $a;
7781
}
7882
var_dump(foo5());
7983

@@ -129,6 +133,5 @@ array(1) {
129133
int(1)
130134
}
131135
}
132-
133-
Warning: Cannot use a scalar value as an array in %sassign_dim_002.php on line 65
136+
Cannot use a scalar value as an array
134137
int(1)

tests/lang/bug29893.phpt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ Bug #29893 (segfault when using array as index)
33
--FILE--
44
<?php
55
$base = 50;
6-
$base[$base] -= 0;
6+
try {
7+
$base[$base] -= 0;
8+
} catch (Error $e) {
9+
echo $e->getMessage(), "\n";
10+
}
711
?>
8-
===DONE===
9-
--EXPECTF--
10-
Warning: Cannot use a scalar value as an array in %sbug29893.php on line %d
11-
===DONE===
12+
--EXPECT--
13+
Cannot use a scalar value as an array

tests/lang/engine_assignExecutionOrder_002.phpt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@ echo "A=$a B=$b\n";
1010

1111

1212
// Warning: Cannot use a scalar value as an array in %s on line %d
13-
$c[$c=1] = 1;
13+
try {
14+
$c[$c=1] = 1;
15+
} catch (Error $e) {
16+
echo $e->getMessage(), "\n";
17+
}
1418

1519
// i++ evaluated first, so $d[0] is 10
1620
$d = array(0,10);
@@ -90,8 +94,7 @@ print_r($ee);
9094
?>
9195
--EXPECTF--
9296
A=hello B=bye
93-
94-
Warning: Cannot use a scalar value as an array in %s on line %d
97+
Cannot use a scalar value as an array
9598
array(2) {
9699
[0]=>
97100
int(10)

0 commit comments

Comments
 (0)