summaryrefslogtreecommitdiff
path: root/UPGRADING
blob: 65c8ac2720689e67e91c56d2d6fb32b75799f7f6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
PHP 8.0 UPGRADE NOTES

1. Backward Incompatible Changes
2. New Features
3. Changes in SAPI modules
4. Deprecated Functionality
5. Changed Functions
6. New Functions
7. New Classes and Interfaces
8. Removed Extensions and SAPIs
9. Other Changes to Extensions
10. New Global Constants
11. Changes to INI File Handling
12. Windows Support
13. Other Changes
14. Performance Improvements


========================================
1. Backward Incompatible Changes
========================================

- Core:
  . Methods with the same name as the class are no longer interpreted as
    constructors. The __construct() method should be used instead.
  . Removed ability to call non-static methods statically.
  . Removed (unset) cast.
  . Removed track_errors ini directive. This means that $php_errormsg is no
    longer available. The error_get_last() function may be used instead.
  . Removed the ability to define case-insensitive constants. The third
    argument to define() may no longer be true.
  . Access to undefined constants now always results in an Error exception.
    Previously, unqualified constant accesses resulted in a warning and were
    interpreted as strings.
  . Removed ability to specify an autoloader using an __autoload() function.
    spl_autoload_register() should be used instead.
  . Removed the $errcontext argument for custom error handlers.
  . Removed create_function(). Anonymous functions may be used instead.
  . Removed each(). foreach or ArrayIterator should be used instead.
  . Removed ability to unbind $this from closures that were created from a
    method, using Closure::fromCallable() or ReflectionMethod::getClosure().
  . Also removed ability to unbind $this from proper closures that contain uses
    of $this.
  . Removed ability to use array_key_exists() with objects. Use one of isset()
    or property_exists() instead.
  . Any array that has a number n as its first numeric key will use n+1 for
    its next implicit key. Even if n is negative.
    RFC: https://wiki.php.net/rfc/negative_array_index
  . The default error_reporting level is now E_ALL. Previously it excluded
    E_NOTICE and E_DEPRECATED.
  . display_startup_errors is now enabled by default.
  . Using "parent" inside a class that has no parent will now result in a
    fatal compile-time error.
  . The @ operator will no longer silence fatal errors (E_ERROR, E_CORE_ERROR,
    E_COMPILE_ERROR, E_USER_ERROR, E_RECOVERABLE_ERROR, E_PARSE). Error handlers
    that expect error_reporting to be 0 when @ is used, should be adjusted to
    use a mask check instead:

        // Replace
        function my_error_handler($err_no, $err_msg, $filename, $linenum) {
            if (error_reporting() == 0) {
                return; // Silenced
            }
            // ...
        }

        // With
        function my_error_handler($err_no, $err_msg, $filename, $linenum) {
            if (!(error_reporting() & $err_no)) {
                return; // Silenced
            }
            // ...
        }

    Additionally, care should be taken that error messages are not displayed in
    production environments, which can result in information leaks. Please
    ensure that display_errors=Off is used in conjunction with error logging.
  . Inheritance errors due to incompatible method signatures (LSP violations)
    will now always generate a fatal error. Previously a warning was generated
    in some cases.
    RFC: https://wiki.php.net/rfc/lsp_errors
  . The precedence of the concatenation operator has changed relative to
    bitshifts and addition as well as subtraction.
    RFC: https://wiki.php.net/rfc/concatenation_precedence
  . Arguments with a default-value that resolves to null at run-time will no
    longer implicitly mark the argument type as nullable. Either use an explicit
    nullable type, or an explicit null default value instead.

        // Replace
        function test(int $arg = CONST_RESOLVING_TO_NULL) {}
        // With
        function test(?int $arg = CONST_RESOLVING_TO_NULL) {}
        // Or
        function test(int $arg = null) {}
  . A number of warnings have been converted into Error exceptions:

    * Attempting to write to a property of a non-object. Previously this
      implicitly created an stdClass object for null, false and empty strings.
    * Attempting to append an element to an array for which the PHP_INT_MAX key
      is already used.
    * Attempting to use an invalid type (array or object) as an array key or
      string offset.
    * Attempting to write to an array index of a scalar value.
    * Attempting to unpack a non-array/Traversable.

    A number of notices have been converted into warnings:

    * Attempting to read an undefined variable.
    * Attempting to read an undefined property.
    * Attempting to read a property of a non-object.
    * Attempting to access an array index of a non-array.
    * Attempting to convert an array to string.
    * Attempting to use a resource as an array key.
    * Attempting to use null, a boolean or a float as a string offset.
    * Attempting to read an out-of-bounds string offset.
    * Attempting to assign an empty string to a string offset.

    RFC: https://wiki.php.net/rfc/engine_warnings
  . Attempting to assign multiple bytes to a string offset will now emit a warning.
  . Unexpected characters in source files (such as null bytes outside of
    strings) will now result in a ParseError exception instead of a compile
    warning.
  . Uncaught exceptions now go through "clean shutdown", which means that
    destructors will be called after an uncaught exception.

- COM:
  . Removed the ability to import case-insensitive constants from type
    libraries. The second argument to com_load_typelib() may no longer be false;
    com.autoregister_casesensitive may no longer be disabled; case-insensitive
    markers in com.typelib_file are ignored.

- Date:
  . mktime() and gmmktime() now require at least one argument. time() can be
    used to get the current timestamp.

- dom:
  . Remove unimplemented classes from ext/dom that had no behavior and contained
    test data. These classes have also been removed in the latest version of DOM
	standard:

     * DOMNameList
     * DomImplementationList
     * DOMConfiguration
     * DomError
     * DomErrorHandler
     * DOMImplementationSource
     * DOMLocator
     * DOMUserDataHandler
     * DOMTypeInfo

- Exif:
  . Removed read_exif_data(). exif_read_data() should be used instead.

- Filter:
  . The FILTER_FLAG_SCHEME_REQUIRED and FILTER_FLAG_HOST_REQUIRED flags for the
    FILTER_VALIDATE_URL filter have been removed. The scheme and host are (and
    have been) always required.
  . The INPUT_REQUEST and INPUT_SESSION source for filter_input() etc have been
    removed. These were never implemented and their use always generated a
    warning.

- GD:
  . The GD extension now uses objects as the underlying data structure for
    images, rather than resources. These objects are completely opaque, i.e.
    they don't have any methods.
  . The deprecated function image2wbmp() has been removed.
    RFC: https://wiki.php.net/rfc/image2wbmp
  . The deprecated functions png2wbmp() and jpeg2wbmp() have been removed.
    RFC: https://wiki.php.net/rfc/deprecate-png-jpeg-2wbmp
  . The default $mode parameter of imagecropauto() no longer accepts -1.
    IMG_CROP_DEFAULT should be used instead.

- GMP:
  . gmp_random() has been removed. One of gmp_random_range() or
    gmp_random_bits() should be used instead.

- Intl:
  . The deprecated constant INTL_IDNA_VARIANT_2003 has been removed.
    RFC: https://wiki.php.net/rfc/deprecate-and-remove-intl_idna_variant_2003
  . The deprecated Normalizer::NONE constant has been removed.

- LDAP:
  . The deprecated function ldap_sort has been removed.

- Mbstring:
  . The mbstring.func_overload directive has been removed. The related
    MB_OVERLOAD_MAIL, MB_OVERLOAD_STRING, and MB_OVERLOAD_REGEX constants have
    also been removed. Finally, the "func_overload" and "func_overload_list"
    entries in mb_get_info() have been removed.
  . mb_parse_str() can no longer be used without specifying a result array.
  . A number of deprecated mbregex aliases have been removed. See the following
    list for which functions should be used instead:

     * mbregex_encoding()      -> mb_regex_encoding()
     * mbereg()                -> mb_ereg()
     * mberegi()               -> mb_eregi()
     * mbereg_replace()        -> mb_ereg_replace()
     * mberegi_replace()       -> mb_eregi_replace()
     * mbsplit()               -> mb_split()
     * mbereg_match()          -> mb_ereg_match()
     * mbereg_search()         -> mb_ereg_search()
     * mbereg_search_pos()     -> mb_ereg_search_pos()
     * mbereg_search_regs()    -> mb_ereg_search_regs()
     * mbereg_search_init()    -> mb_ereg_search_init()
     * mbereg_search_getregs() -> mb_ereg_search_getregs()
     * mbereg_search_getpos()  -> mb_ereg_search_getpos()
     * mbereg_search_setpos()  -> mb_ereg_search_setpos()

  . The 'e' modifier for mb_ereg_replace() has been removed.
    mb_ereg_replace_callback() should be used instead.
  . A non-string pattern argument to mb_ereg_replace() will now be interpreted
    as a string instead of an ASCII codepoint. The previous behavior may be
    restored with an explicit call to chr().
  . The needle argument for mb_strpos(), mb_strrpos(), mb_stripos(), mb_strripos(), mb_strstr() and mb_stristr()
    can now be empty.
  . The $is_hex parameter, which was not used internally, has been removed from
    mb_decode_numericentity().
  . The legacy behaviour of passing the encoding as the third argument instead of an offset for the mb_strrpos
    function has been removed, provide an explicit 0 offset with the encoding as the fourth argument.

- PCRE:
  . When passing invalid escape sequences they are no longer interpreted as
    literals. This behaviour previously required the X modifier - which is
    now ignored.

- PDO:
  . The method PDOStatement::setFetchMode() now accepts the following signature:

        PDOStatement::setFetchMode($mode, $classname, $params)

- PDO_ODBC:
  . The php.ini directive pdo_odbc.db2_instance_name has been removed

- Reflection:
  . The method signatures

        ReflectionClass::newInstance($args)
        ReflectionFunction::invoke($args)
        ReflectionMethod::invoke($object, $args)

    have been changed to:

        ReflectionClass::newInstance(...$args)
        ReflectionFunction::invoke(...$args)
        ReflectionMethod::invoke($object, ...$args)

    Code that must be compatible with both PHP 7 and PHP 8 can use the following
    signatures to be compatible with both versions:

        ReflectionClass::newInstance($arg = null, ...$args)
        ReflectionFunction::invoke($arg = null, ...$args)
        ReflectionMethod::invoke($object, $arg = null, ...$args)

  . The ReflectionType::__toString() method will now return a complete debug
    representation of the type, and is no longer deprecated. In particular the
    result will include a nullability indicator for nullable types. The format
    of the return value is not stable and may change between PHP versions.

- Socket:
  . The deprecated AI_IDN_ALLOW_UNASSIGNED and AI_IDN_USE_STD3_ASCII_RULES
    flags for socket_addrinfo_lookup() have been removed.

- SPL:
  . SplFileObject::fgetss() has been removed.
  . SplHeap::compare($a, $b) now specifies a method signature. Inheriting
    classes implementing this method will now have to use a compatible
    method signature.

- Standard:
  . assert() will no longer evaluate string arguments, instead they will be
    treated like any other argument. assert($a == $b) should be used instead of
    assert('$a == $b'). The assert.quiet_eval ini directive and
    ASSERT_QUIET_EVAL constants have also been removed, as they would no longer
    have any effect.
  . parse_str() can no longer be used without specifying a result array.
  . fgetss() has been removed.
  . The string.strip_tags filter has been removed.
  . The needle argument of strpos(), strrpos(), stripos(), strripos(), strstr(),
    strchr(), strrchr(), and stristr() will now always be interpreted as a
    string. Previously non-string needles were interpreted as an ASCII code
    point. An explicit call to chr() can be used to restore the previous
    behavior.
  . The needle argument for strpos(), strrpos(), stripos(), strripos(), strstr() and stristr() can now be empty.
  . The length argument for substr(), substr_count(), substr_compare(), and
    iconv_substr() can now be null. Null values will behave as if no length
    argument was provided and will therefore return the remainder of the string
    instead of an empty string.
  . The length argument for array_splice() can now be null. Null values will
    behave identically to omitting the argument, thus removing everything from
    the 'offset' to the end of the array.
  . The 'salt' option of password_hash() is no longer supported. If the 'salt'
    option is used a warning is generated, the provided salt is ignored, and a
    generated salt is used instead.
  . The quotemeta() function will now return an empty string if an empty string
    was passed. Previously false was returned.
  . hebrevc() has been removed.
  . convert_cyr_string() has been removed.
  . money_format() has been removed.
  . ezmlm_hash() has been removed.
  . get_magic_quotes_gpc() and get_magic_quotes_gpc_runtime() has been removed.
  . FILTER_SANITIZE_MAGIC_QUOTES has been removed.
  . Calling implode() with parameters in a reverse order ($pieces, $glue) is no
    longer supported.

- tidy:
  . The $use_include_path parameter, which was not used internally, has been
    removed from tidy_repair_string().

- XML:
  . xml_parser_create(_ns) will now return an XmlParser object rather than a
    resource. Return value checks using is_resource() should be replaced with
    checks for `false`. The xml_parser_free() function no longer has an effect,
    instead the XmlParser instance is automatically destroyed if it is no longer
    referenced.

- XMLWriter:
  . The XMLWriter functions now accept and return, respectively, XMLWriter
    objects instead of resources.

- Zip:
  . The remove_path option of ZipArchive::addGlob() and ::addPattern() is now
    treated as arbitrary string prefix (for consistency with the add_path
    option), whereas formerly it was treated as directory name. This means that
    if no trailing directory separator is given, the following character is
    no longer stripped from the filename.

- Zlib:
  . gzgetss() has been removed.

========================================
2. New Features
========================================

- Core:
  . Added support for union types.
    RFC: https://wiki.php.net/rfc/union_types_v2
  . Added WeakMap.
    RFC: https://wiki.php.net/rfc/weak_maps
  . Added ValueError class.

- Date:
  . Added DateTime::createFromInterface() and
    DateTimeImmutable::createFromInterface().

========================================
3. Changes in SAPI modules
========================================

========================================
4. Deprecated Functionality
========================================

========================================
5. Changed Functions
========================================

========================================
6. New Functions
========================================

- SQLite3:
  . Add SQLite3::setAuthorizer() and respective class constants to set a
    userland callback that will be used to authorize or not an action on the
    database.
    PR: https://github.com/php/php-src/pull/4797

- Standard:
  . Added fdiv() method, which performs a floating-point division under
    IEEE 754 semantics. Division by zero is considered well-defined and
    will return one of Inf, -Inf or NaN.

========================================
7. New Classes and Interfaces
========================================

========================================
8. Removed Extensions and SAPIs
========================================

========================================
9. Other Changes to Extensions
========================================

- GD:
  . The $num_points parameter of imagepolygon(), imageopenpolygon() and
    imagefilledpolygon() is now optional, i.e. these functions may be called
    with either 3 or 4 arguments. If the arguments is omitted, it is calculated
    as count($points)/2.

========================================
10. New Global Constants
========================================

- Filter:
  . FILTER_VALIDATE_BOOL has been added as an alias for FILTER_VALIDATE_BOOLEAN.
    The new name is preferred, as it uses the canonical type name.

========================================
11. Changes to INI File Handling
========================================

========================================
12. Windows Support
========================================

========================================
13. Other Changes
========================================

========================================
14. Performance Improvements
========================================

- array_slice() on an array without gaps will no longer scan the whole array to find
  the start offset. This may significantly reduce the runtime of the function
  with large offsets and small lengths.