====== PHP RFC: Remove deprecated functionality in PHP 7 ====== * Date: 2014-09-11 * Author: Nikita Popov * Status: Implemented (PHP 7.0) * Targeting: PHP 7 * Discussion: http://markmail.org/message/vcladdh5sciqjpvg ===== Introduction ===== This RFC proposes to remove functionality which has been deprecated during the 5.x cycle. The following extensions are deprecated: * ext/ereg (since PHP 5.3; use ext/pcre instead) [[https://github.com/php/php-src/commit/fea9a6fc7702c53df5e9f4c16857dc921d8b5997|REMOVED]] ([[http://pecl.php.net/package/ereg|PECL extension]]) * ext/mysql (since PHP 5.5; use ext/mysqli or ext/pdo_mysql instead) [[https://github.com/php/php-src/commit/fd1578c196575c7e120a84ee030bb87c14a199b0|REMOVED]] ([[http://pecl.php.net/package/mysql|PECL extension]]) The following language features are deprecated: * Assignment of ''new'' by reference (since PHP 5.3; use normal assignment instead) [[https://github.com/php/php-src/commit/4d3e4d3bf994739681613f9061d056e10f731b65|REMOVED]] * Scoped calls of non-static methods from incompatible ''$this'' context (since PHP 5.6) [[https://github.com/php/php-src/commit/085774997b591c2babbb623fe7102ce2c77bc9fb|REMOVED]] The following functions are deprecated: * ''dl'' on fpm-fcgi (since PHP 5.3) [[https://github.com/php/php-src/commit/e05993dfa20e934ba99ccd5b2b944a7759126f58|REMOVED]] * ''set_magic_quotes_runtime'' and ''magic_quotes_runtime'' (since PHP 5.4) [[https://github.com/php/php-src/commit/a60efc5e11b65083ef4cc8a132df620e1642dd76|REMOVED]] * ''set_socket_blocking'' (since PHP 5.4; use ''stream_set_blocking'' instead) [[https://github.com/php/php-src/commit/ca11bc0325496bef94d4417f300e323040fb11db|REMOVED]] * ''mcrypt_generic_end'' (since PHP 5.4; use ''mcrypt_generic_deinit'' instead) [[https://github.com/php/php-src/commit/c488a4570197240af8e05eaab95c0b308c2246d8|REMOVED]] * ''mcrypt_ecb'', ''mcrypt_cbc'', ''mcrypt_cfb'' and ''mcrypt_ofb'' (since PHP 5.5, but documented as deprecated earlier; use ''mcrypt_encrypt'' and ''mcrypt_decrypt'' instead) [[https://github.com/php/php-src/commit/7810659cc372b17d48a7f0a799cc1509471916a1|REMOVED]] * ''datefmt_set_timezone_id'' and ''IntlDateFormatter::setTimeZoneID'' (since PHP 5.5; use ''datefmt_set_timezone'' or ''IntlDateFormatter::setTimeZone'' instead) [[https://github.com/php/php-src/commit/cf0ffa8e4c0bb92bfae60963a6e4c0dea00bd003|REMOVED]] The following ini options are deprecated: * ''xsl.security_prefs'' (since PHP 5.4; use ''XsltProcessor::setSecurityPrefs'' instead) [[https://github.com/php/php-src/commit/a81e65a5018a04379914c605f7a9c69ac8941600|REMOVED]] * ''iconv.input_encoding'', ''iconv.output_encoding'', ''iconv.internal_encoding'', ''mbstring.http_input'', ''mbstring.http_output'' and ''mbstring.internal_encoding'' (since PHP 5.6; use ''php.input_encoding'', ''php.internal_encoding'' and ''php.output_encoding'' instead) [TODO] The following miscellaneous functionality is deprecated: * The ''$is_dst'' parameter of the ''mktime()'' and ''gmmktime()'' functions (since PHP 5.1) [[https://github.com/php/php-src/commit/9c5eaac18b65038cc377c7335b32889b892cf1fc|REMOVED]] * ''#'' style comments in ini files (since PHP 5.3; use '';'' style comments instead) [[https://github.com/php/php-src/commit/83391b5518619cce7d2a1baf5a4434b1690a33d1|REMOVED]] * String category names in ''setlocale()'' (since PHP 5.3; use ''LC_*'' constants instead) [[https://github.com/php/php-src/commit/4c115b6b71e31a289d84f72f8664943497b9ee31|REMOVED]] * Unsafe curl file uploads (since PHP 5.5; use ''CurlFile'' instead) [[https://github.com/php/php-src/commit/b5184ef33606c808b66c4b2738c80376c95de65b|REMOVED]] * ''preg_replace()'' eval modifier (since PHP 5.5; use ''preg_replace_callback'' instead) [[https://github.com/php/php-src/commit/cb9c99ebd075d1d4fae0cbf5df54ca14c4071584|REMOVED]] * ''PDO::PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT'' driver option (since PHP 5.6; use ''PDO::ATTR_EMULATE_PREPARES'' instead) [[https://github.com/php/php-src/commit/4694e1c02039114915704f0206f1ffb7a0efe4ad|REMOVED]] * ''CN_match'' and ''SNI_server_name'' stream context option (since PHP 5.6; use ''peer_name'' instead) [[https://github.com/php/php-src/commit/2a87a42cd431ea8008ce24db6e57948052ff805d|REMOVED]] ===== Patches and Tests ===== Note: Patches are very outdated. I'll update them after the votes. * Removal of ext/ereg: https://github.com/php/php-src/pull/816 * Removal of everything else not marked with ''[TODO]'': https://github.com/php/php-src/pull/815 ===== Votes ===== Voting started on 2015-01-02 and ended on 2015-01-16. All votes refer to PHP 7. All removals have been accepted. ==== ext/ereg ==== The ereg extension has been deprecated since PHP 5.3. The PCRE extension should be used instead. PCRE provides better Unicode support and many more features in general. The ereg extension is effectively unmaintained currently. If ext/ereg is removed as a bundled extension, it can still be made available as a PECL extension. Vote: Requires simple majority. * Yes * No ==== ext/mysql ==== The mysql extension has been deprecated since PHP 5.5. The mysqli or PDO extension should be used instead. The deprecation has been decided in [[rfc/mysql_deprecation]], where a discussion of the reasons behind this decision can be found. If ext/mysql is removed as a bundled extension, it can still be made available as a PECL extension. Vote: Requires simple majority. * Yes * No ==== Assignment of new by reference ==== Since PHP 5.3 assignment of ''new'' expressions by references is deprecated. It can be replaced with a normal assignment ((reference-breaking notwithstanding)): // Instead of $obj =& new ClassName; // Write $obj = new ClassName; Assigning the return value by reference is no longer necessary since PHP 5.0. Vote: Requires 2/3 majority. * Yes * No ==== Scoped calls of non-static methods from incompatible $this context ==== Since PHP 5.5 scoped calls of non-static methods from incompatible ''$this'' contexts are deprecated, while they already generated an ''E_STRICT'' level error previously. The deprecation has been decided in [[rfc/incompat_ctx]], where examples of this functionality can be found. The RFC already specified that the functionality will be removed in the next version after deprecation, as such this vote may dropped. Vote: Requires 2/3 majority. * Yes * No ==== dl() on fpm-fcgi ==== Use of ''dl()'' in the fpm-fcgi SAPI is deprecated since PHP 5.3. Using the ''dl()'' function in SAPIs that run more than one request has stability concerns. As such it has already been removed from other multi-request SAPIs, fpm-fcgi is the last one left. Vote: Requires simple majority. * Yes * No ==== set_magic_quotes_runtime() and magic_quotes_runtime() ==== Support for magic quotes has been removed in PHP 5.4. To facilitate backwards compatibility the ''set_magic_quotes_runtime()'' and ''magic_quotes_runtime()'' functions have been retained, but deprecated. Attempting to enable magic quotes using them will result in a fatal error. Vote: Requires simple majority. * Yes * No ==== Other deprecated functions ==== The following functions are deprecated: * ''set_socket_blocking'' (since PHP 5.4; use ''stream_set_blocking'' instead) * ''mcrypt_generic_end'' (since PHP 5.4; use ''mcrypt_generic_deinit'' instead) * ''mcrypt_ecb'', ''mcrypt_cbc'', ''mcrypt_cfb'' and ''mcrypt_ofb'' (since PHP 5.5, but documented as deprecated earlier; use ''mcrypt_encrypt'' and ''mcrypt_decrypt'' instead) * ''datefmt_set_timezone_id'' and ''IntlDateFormatter::setTimeZoneID'' (since PHP 5.5; use ''datefmt_set_timezone'' or ''IntlDateFormatter::setTimeZone'' instead) These functions are just legacy aliases or quasi-aliases. Vote: Requires simple majority. * Yes * No ==== xsl.security_prefs ini directive ==== As a fix for CVE 2012-0057 ([[https://bugs.php.net/bug.php?id=54446|Bug #54446]]), which concerns reading and writing files using XSLT, the ''XsltProcessor::setSecurityPrefs()'' method and ''xsl.security_prefs'' ini directive have been added. The latter has been deprecated in PHP 5.4 to discourage global disabling of security features. Instead the ''setSecurityPrefs()'' method should be used on individual ''XsltProcessor'' instances where reading/writing files is necessary. Vote: Requires simple majority. * Yes * No ==== iconv and mbstring encoding ini directives ==== The ''iconv.input_encoding'', ''iconv.output_encoding'', ''iconv.internal_encoding'', ''mbstring.http_input'', ''mbstring.http_output'' and ''mbstring.internal_encoding'' ini directives have been deprecated in PHP 5.6 by the [[rfc/default_encoding]] RFC. Instead the use of the more general ''php.input_encoding'', ''php.internal_encoding'' and ''php.output_encoding'' ini directives is suggested. Vote: Requires simple majority. * Yes * No ==== $is_dst parameter of the mktime() and gmmktime() functions ==== The ''$is_dst'' parameter of the ''mktime()'' and ''gmmktime()'' functions has been deprecated in PHP 5.1. Instead the timezone handling functions should be used. Vote: Requires simple majority. * Yes * No ==== #-style comments in ini files ==== The standard ini file format uses '';'' to denote comments. However PHP [[http://markmail.org/message/xsvd3eyrijlpnfl2|accidentially (?)]] also supported comments starting with ''#'' in some circumstances. When this was discovered in PHP 5.3, they were deprecated. Vote: Requires simple majority. * Yes * No ==== String category names in setlocale() ==== Since PHP 5.3 the use of string category names in ''setlocale()'' is deprecated and the corresponding ''LC_*'' constants should be used instead: // Instead of setlocale('LC_ALL', 'de_DE'); // Write setlocale(LC_ALL, 'de_DE'); Vote: Requires simple majority. * Yes * No ==== Unsafe curl file uploads ==== As part of the [[rfc/curl-file-upload]] RFC, the ''CURLOPT_SAFE_UPLOAD'' curl option has been introduced in PHP 5.5 to control whether the use of ''CURLFile'' is required to upload files. Since PHP 5.6 the option defaults to ''true''. For compatibility purposes the option will not be removed altogether, only the ability to set it to ''false'' is removed. Vote: Requires simple majority. * Yes * No ==== preg_replace() eval modifier ==== Due to security considerations the [[rfc/remove_preg_replace_eval_modifier]] RFC has deprecated the ''/e'' (eval) modifier used by ''preg_replace()'' in PHP 5.5. Instead ''preg_replace_callback'' should be used. Vote: Requires simple majority. * Yes * No ==== PDO::PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT driver option ==== In PHP 5.6 the pgsql specific driver option ''PDO::PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT'' was deprecated in favor of the more general ''PDO::ATTR_EMULATE_PREPARES'' option. Vote: Requires simple majority. * Yes * No ==== CN_match and SNI_server_name stream context options ==== Since PHP 5.6 it is no longer necessary to explicitly specify the host name using the ''CN_match'' and ''SNI_server_name'' stream context options, it will be determined automatically instead. It is possible to manually specify a host name using the ''peer_name'' context option, which covers both CN and SNI. The old, separate options have been deprecated. Vote: Requires simple majority. * Yes * No