Skip to content

Commit beee92a

Browse files
committed
Remove support for mixing parameter order in implode()
1 parent 37c1171 commit beee92a

File tree

11 files changed

+72
-102
lines changed

11 files changed

+72
-102
lines changed

Zend/tests/unexpected_ref_bug.phpt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,11 @@ class Test {
99
return ",";
1010
}
1111
}
12-
$my_var = str_repeat("A",64);
13-
$data = call_user_func_array("explode",array(new Test(), &$my_var));
14-
$my_var=array(1,2,3);
15-
$data = call_user_func_array("implode",array(&$my_var, new Test()));
12+
$my_var = str_repeat("A", 64);
13+
$data = call_user_func_array("explode", array(new Test(), &$my_var));
14+
$my_var = str_repeat("A", 64);
15+
$data = call_user_func_array("str_replace", array(&$my_var, new Test(), "foo"));
1616
echo "Done.\n";
1717
?>
1818
--EXPECTF--
19-
Deprecated: implode(): Passing glue string after array is deprecated. Swap the parameters in %s on line %d
2019
Done.

ext/spl/tests/bug75717.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ function flatten(array $nestedArraysAndStrings){
88
$iter = new RecursiveIteratorIterator(
99
new RecursiveArrayIterator($nestedArraysAndStrings));
1010
foreach($iter as $leaf){ $flat[] = $leaf; }
11-
return join(NULL, $flat);
11+
return join(null, $flat);
1212
}
1313

1414
$noRefs = [[[['some']]],[' nested '],"items"];

ext/standard/basic_functions.stub.php

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -535,11 +535,7 @@ function wordwrap(string $str, int $width = 75, string $break = "\n", bool $cut
535535

536536
function explode(string $separator, string $str, int $limit = PHP_INT_MAX): array {}
537537

538-
/**
539-
* @param string $glue Optional - defaults to empty string
540-
* @param array $pieces
541-
*/
542-
function implode($glue, $pieces = UNKNOWN): string {}
538+
function implode(string|array $glue, array $pieces = UNKNOWN): string {}
543539

544540
function strtok(string $str, string $token = UNKNOWN): string|false {}
545541

ext/standard/basic_functions_arginfo.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -841,8 +841,8 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_explode, 0, 2, IS_ARRAY, 0)
841841
ZEND_END_ARG_INFO()
842842

843843
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_implode, 0, 1, IS_STRING, 0)
844-
ZEND_ARG_INFO(0, glue)
845-
ZEND_ARG_INFO(0, pieces)
844+
ZEND_ARG_TYPE_MASK(0, glue, MAY_BE_STRING|MAY_BE_ARRAY)
845+
ZEND_ARG_TYPE_INFO(0, pieces, IS_ARRAY, 0)
846846
ZEND_END_ARG_INFO()
847847

848848
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_strtok, 0, 1, MAY_BE_STRING|MAY_BE_FALSE)

ext/standard/php_string.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ PHPAPI zend_string *php_str_to_str(const char *haystack, size_t length, const ch
125125
PHPAPI zend_string *php_trim(zend_string *str, char *what, size_t what_len, int mode);
126126
PHPAPI size_t php_strip_tags(char *rbuf, size_t len, uint8_t *state, const char *allow, size_t allow_len);
127127
PHPAPI size_t php_strip_tags_ex(char *rbuf, size_t len, uint8_t *stateptr, const char *allow, size_t allow_len, zend_bool allow_tag_spaces);
128-
PHPAPI void php_implode(const zend_string *delim, zval *arr, zval *return_value);
128+
PHPAPI void php_implode(const zend_string *delim, HashTable *arr, zval *return_value);
129129
PHPAPI void php_explode(const zend_string *delim, zend_string *str, zval *return_value, zend_long limit);
130130

131131
PHPAPI size_t php_strspn(char *s1, char *s2, char *s1_end, char *s2_end);

ext/standard/string.c

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1168,13 +1168,13 @@ PHP_FUNCTION(explode)
11681168
}
11691169
/* }}} */
11701170

1171-
/* {{{ proto string join(array src, string glue)
1171+
/* {{{ proto string join([string glue,] array pieces)
11721172
An alias for implode */
11731173
/* }}} */
11741174

11751175
/* {{{ php_implode
11761176
*/
1177-
PHPAPI void php_implode(const zend_string *glue, zval *pieces, zval *return_value)
1177+
PHPAPI void php_implode(const zend_string *glue, HashTable *pieces, zval *return_value)
11781178
{
11791179
zval *tmp;
11801180
int numelems;
@@ -1187,20 +1187,20 @@ PHPAPI void php_implode(const zend_string *glue, zval *pieces, zval *return_valu
11871187
} *strings, *ptr;
11881188
ALLOCA_FLAG(use_heap)
11891189

1190-
numelems = zend_hash_num_elements(Z_ARRVAL_P(pieces));
1190+
numelems = zend_hash_num_elements(pieces);
11911191

11921192
if (numelems == 0) {
11931193
RETURN_EMPTY_STRING();
11941194
} else if (numelems == 1) {
11951195
/* loop to search the first not undefined element... */
1196-
ZEND_HASH_FOREACH_VAL_IND(Z_ARRVAL_P(pieces), tmp) {
1196+
ZEND_HASH_FOREACH_VAL_IND(pieces, tmp) {
11971197
RETURN_STR(zval_get_string(tmp));
11981198
} ZEND_HASH_FOREACH_END();
11991199
}
12001200

12011201
ptr = strings = do_alloca((sizeof(*strings)) * numelems, use_heap);
12021202

1203-
ZEND_HASH_FOREACH_VAL_IND(Z_ARRVAL_P(pieces), tmp) {
1203+
ZEND_HASH_FOREACH_VAL_IND(pieces, tmp) {
12041204
if (EXPECTED(Z_TYPE_P(tmp) == IS_STRING)) {
12051205
ptr->str = Z_STR_P(tmp);
12061206
len += ZSTR_LEN(ptr->str);
@@ -1264,41 +1264,32 @@ PHPAPI void php_implode(const zend_string *glue, zval *pieces, zval *return_valu
12641264
Joins array elements placing glue string between items and return one string */
12651265
PHP_FUNCTION(implode)
12661266
{
1267-
zval *arg1, *arg2 = NULL, *pieces;
1268-
zend_string *glue, *tmp_glue;
1267+
zend_string *arg1_str = NULL;
1268+
HashTable *arg1_array = NULL;
1269+
zend_array *pieces = NULL;
12691270

12701271
ZEND_PARSE_PARAMETERS_START(1, 2)
1271-
Z_PARAM_ZVAL(arg1)
1272+
Z_PARAM_STR_OR_ARRAY_HT(arg1_str, arg1_array)
12721273
Z_PARAM_OPTIONAL
1273-
Z_PARAM_ZVAL(arg2)
1274+
Z_PARAM_ARRAY_HT(pieces)
12741275
ZEND_PARSE_PARAMETERS_END();
12751276

1276-
if (arg2 == NULL) {
1277-
if (Z_TYPE_P(arg1) != IS_ARRAY) {
1277+
if (pieces == NULL) {
1278+
if (arg1_array == NULL) {
12781279
zend_type_error("Argument must be an array");
12791280
return;
12801281
}
12811282

1282-
glue = ZSTR_EMPTY_ALLOC();
1283-
tmp_glue = NULL;
1284-
pieces = arg1;
1283+
arg1_str = ZSTR_EMPTY_ALLOC();
1284+
pieces = arg1_array;
12851285
} else {
1286-
if (Z_TYPE_P(arg1) == IS_ARRAY) {
1287-
glue = zval_get_tmp_string(arg2, &tmp_glue);
1288-
pieces = arg1;
1289-
php_error_docref(NULL, E_DEPRECATED,
1290-
"Passing glue string after array is deprecated. Swap the parameters");
1291-
} else if (Z_TYPE_P(arg2) == IS_ARRAY) {
1292-
glue = zval_get_tmp_string(arg1, &tmp_glue);
1293-
pieces = arg2;
1294-
} else {
1295-
zend_type_error("Invalid arguments passed");
1286+
if (arg1_str == NULL) {
1287+
zend_type_error("The first argument must be string");
12961288
return;
12971289
}
12981290
}
12991291

1300-
php_implode(glue, pieces, return_value);
1301-
zend_tmp_string_release(tmp_glue);
1292+
php_implode(arg1_str, pieces, return_value);
13021293
}
13031294
/* }}} */
13041295

27 Bytes
Binary file not shown.

ext/standard/tests/strings/join_variation1.phpt

Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,13 @@ for($index = 0; $index < count($values); $index ++) {
9191
echo "-- Iteration $counter --\n";
9292
$glue = $values [$index];
9393

94-
var_dump( join($glue, $pieces) );
94+
try {
95+
var_dump(join($glue, $pieces));
96+
} catch (TypeError $exception) {
97+
echo $exception->getMessage() . "\n";
98+
}
9599

96-
$counter ++;
100+
$counter++;
97101
}
98102

99103
echo "Done\n";
@@ -121,35 +125,15 @@ string(29) "element11.07654321E-9element2"
121125
-- Iteration 9 --
122126
string(19) "element10.5element2"
123127
-- Iteration 10 --
124-
125-
Warning: Array to string conversion in %s on line %d
126-
127-
Deprecated: join(): Passing glue string after array is deprecated. Swap the parameters in %s on line %d
128-
string(0) ""
128+
The first argument must be string
129129
-- Iteration 11 --
130-
131-
Warning: Array to string conversion in %s on line %d
132-
133-
Deprecated: join(): Passing glue string after array is deprecated. Swap the parameters in %s on line %d
134-
string(1) "0"
130+
The first argument must be string
135131
-- Iteration 12 --
136-
137-
Warning: Array to string conversion in %s on line %d
138-
139-
Deprecated: join(): Passing glue string after array is deprecated. Swap the parameters in %s on line %d
140-
string(1) "1"
132+
The first argument must be string
141133
-- Iteration 13 --
142-
143-
Warning: Array to string conversion in %s on line %d
144-
145-
Deprecated: join(): Passing glue string after array is deprecated. Swap the parameters in %s on line %d
146-
string(7) "1Array2"
134+
The first argument must be string
147135
-- Iteration 14 --
148-
149-
Warning: Array to string conversion in %s on line %d
150-
151-
Deprecated: join(): Passing glue string after array is deprecated. Swap the parameters in %s on line %d
152-
string(11) "redArraypen"
136+
The first argument must be string
153137
-- Iteration 15 --
154138
string(17) "element11element2"
155139
-- Iteration 16 --
@@ -169,7 +153,7 @@ string(16) "element1element2"
169153
-- Iteration 23 --
170154
string(16) "element1element2"
171155
-- Iteration 24 --
172-
string(%d) "element1Resource id #%delement2"
156+
join() expects parameter 1 to be string or array, resource given
173157
-- Iteration 25 --
174158
string(16) "element1element2"
175159
-- Iteration 26 --

ext/standard/tests/strings/join_variation2.phpt

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -108,49 +108,49 @@ echo "Done\n";
108108

109109
--- Testing join() by supplying different values for 'pieces' argument ---
110110
-- Iteration 1 --
111-
Invalid arguments passed
111+
join() expects parameter 2 to be array, int given
112112
-- Iteration 2 --
113-
Invalid arguments passed
113+
join() expects parameter 2 to be array, int given
114114
-- Iteration 3 --
115-
Invalid arguments passed
115+
join() expects parameter 2 to be array, int given
116116
-- Iteration 4 --
117-
Invalid arguments passed
117+
join() expects parameter 2 to be array, int given
118118
-- Iteration 5 --
119-
Invalid arguments passed
119+
join() expects parameter 2 to be array, float given
120120
-- Iteration 6 --
121-
Invalid arguments passed
121+
join() expects parameter 2 to be array, float given
122122
-- Iteration 7 --
123-
Invalid arguments passed
123+
join() expects parameter 2 to be array, float given
124124
-- Iteration 8 --
125-
Invalid arguments passed
125+
join() expects parameter 2 to be array, float given
126126
-- Iteration 9 --
127-
Invalid arguments passed
127+
join() expects parameter 2 to be array, float given
128128
-- Iteration 10 --
129-
Invalid arguments passed
129+
join() expects parameter 2 to be array, bool given
130130
-- Iteration 11 --
131-
Invalid arguments passed
131+
join() expects parameter 2 to be array, bool given
132132
-- Iteration 12 --
133-
Invalid arguments passed
133+
join() expects parameter 2 to be array, bool given
134134
-- Iteration 13 --
135-
Invalid arguments passed
135+
join() expects parameter 2 to be array, bool given
136136
-- Iteration 14 --
137-
Invalid arguments passed
137+
join() expects parameter 2 to be array, string given
138138
-- Iteration 15 --
139-
Invalid arguments passed
139+
join() expects parameter 2 to be array, string given
140140
-- Iteration 16 --
141-
Invalid arguments passed
141+
join() expects parameter 2 to be array, object given
142142
-- Iteration 17 --
143-
Invalid arguments passed
143+
join() expects parameter 2 to be array, string given
144144
-- Iteration 18 --
145-
Invalid arguments passed
145+
join() expects parameter 2 to be array, string given
146146
-- Iteration 19 --
147-
Invalid arguments passed
147+
join() expects parameter 2 to be array, null given
148148
-- Iteration 20 --
149-
Invalid arguments passed
149+
join() expects parameter 2 to be array, null given
150150
-- Iteration 21 --
151-
Invalid arguments passed
151+
join() expects parameter 2 to be array, resource given
152152
-- Iteration 22 --
153-
Invalid arguments passed
153+
join() expects parameter 2 to be array, null given
154154
-- Iteration 23 --
155-
Invalid arguments passed
155+
join() expects parameter 2 to be array, null given
156156
Done
-63 Bytes
Binary file not shown.

ext/standard/tests/strings/join_variation5.phpt

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,21 @@ echo "*** Testing implode() : usage variations - sub arrays ***\n";
1616
$sub_array = array(array(1,2,3,4), array(1 => "one", 2 => "two"), "PHP", 50);
1717

1818
// pieces as array containing sub array
19-
var_dump( join("TEST", $sub_array) );
19+
var_dump(join("TEST", $sub_array));
2020

2121
// glue as array & pieces as array containing sub array
22-
var_dump( join(array(1, 2, 3, 4), $sub_array) );
22+
try {
23+
var_dump(join(array(1, 2, 3, 4), $sub_array));
24+
} catch (TypeError $exception) {
25+
echo $exception->getMessage() . "\n";
26+
}
2327

24-
// numeric value as glue, pieces as array containg sub array
25-
var_dump( join(2, $sub_array) );
28+
// numeric value as glue, pieces as array containing sub array
29+
var_dump(join(2, $sub_array));
2630

2731
// using directly the sub_array as pieces
28-
var_dump( join(", ", $sub_array[0]) );
29-
var_dump( join(", ", $sub_array[1]) );
32+
var_dump(join(", ", $sub_array[0]));
33+
var_dump(join(", ", $sub_array[1]));
3034

3135
echo "Done\n";
3236
?>
@@ -37,11 +41,7 @@ Warning: Array to string conversion in %s on line %d
3741

3842
Warning: Array to string conversion in %s on line %d
3943
string(27) "ArrayTESTArrayTESTPHPTEST50"
40-
41-
Warning: Array to string conversion in %s on line %d
42-
43-
Deprecated: join(): Passing glue string after array is deprecated. Swap the parameters in %s on line %d
44-
string(19) "1Array2Array3Array4"
44+
The first argument must be string
4545

4646
Warning: Array to string conversion in %s on line %d
4747

0 commit comments

Comments
 (0)