PHP 8.2 is just around the corner, scheduled for release on December 8th. It's a release aimed at simplifying the lives of developers by streamlining the coding process and deprecating older functions. Upgrading to the latest PHP version is highly recommended not only for enhanced site security but also for getting accustomed to the new syntax.
Let’s delve into the changes that PHP 8.2 brings to the table so you can make an informed decision about whether to switch to the new version when it becomes available.
In this section, we’ll explore the changes and exciting new features introduced in PHP 8.2.
In PHP 8.1, the readonly class property was introduced, and PHP 8.2 takes it a step further. Now, you can declare an entire class as readonly, making all its properties readonly as well. Note that this doesn't apply to dynamic properties, as declaring them as readonly will result in an error.
Before PHP 8.2:
class ReadOnlyClass {
public readonly int $number,
public readonly int $anotherNumber
}
With PHP 8.2:
class ReadOnlyClass {
public int $number,
public int $anotherNumber
}
Please keep in mind that you can't declare the following PHP features as readonly: Enums, Traits, and Interfaces.
With PHP 8.0, Union Types were introduced, allowing you to declare a type as a union of two or more types. However, using true, null, and false as standalone types was not allowed. PHP 8.2 changes this, enabling you to use these values as standalone types, making the PHP type system more descriptive for declaring return, parameter, and property types.
PHP 8.2 introduces a new attribute called SensitiveParameter
. It helps conceal sensitive information in stack traces when debugging applications. You can use it like this:
function passwords($publicpassword, #[\SensitiveParameter] $secretpassword) {
throw new \Exception('Error');
}
passwords('publicpassword', 'secretpassword');
PHP 8.2 simplifies the handling of parameterized MySQLi queries with the mysqli_execute_query($sql, $params)
function and the mysqli::execute_query
method. These allow you to prepare, bind, and execute queries in a single function call, resulting in a mysqli_result
object after successful execution.
Example:
foreach ($db->execute_query('SELECT * FROM user WHERE name LIKE ? AND type_id IN (?, ?)', [$name, $type1, $type2]) as $row) {
print_r($row);
}
PHP 8.2 enables you to declare constants in traits. Until now, traits only allowed code reuse through methods and properties. Here's an example:
trait Foo {
public const FLAG_1 = 1;
protected const FLAG_2 = 2;
private const FLAG_3 = 2;
public function doFoo(int $flags): void {
if ($flags & self::FLAG_1) {
echo 'Got flag 1';
}
if ($flags & self::FLAG_2) {
echo 'Got flag 2';
}
if ($flags & self::FLAG_3) {
echo 'Got flag 3';
}
}
}
PHP 8.2 introduces Disjunctive Normal Form (DNF) types, a standardized way of organizing boolean expressions. It comprises a disjunction of conjunctions or simply boolean OR of ANDs. Examples include:
(A&B)|D
C|(X&D)|null
(A&B&D)|int|null
PHP 8.2 deprecates dynamic variables in classes, resulting in a deprecation message in PHP 8.2 and ErrorException in future versions. To allow dynamic properties for classes, a new #[AllowDynamicProperties]
attribute has been added. Here's an example:
class Foo {}
$foo = new Foo;
// Deprecated: Creation of dynamic property Foo::$bar is deprecated
$foo->bar = 1;
// No deprecation warning: Dynamic property already exists.
$foo->bar = 2;
In this section, we'll explore the features that will be deprecated in PHP 8.2.
PHP 8.2 will deprecate utf8_encode()
and utf8_decode()
functions, used for converting between ISO-8859-1 and UTF-8 encoding standards. These functions lacked error messages, and warnings, and had limited encoding support. PHP 9.0 will exclude them entirely, and users are encouraged to use iconv
or intl
extensions for encoding conversion.
PHP 8.2 will deprecate the mbstring
extension's support for Base64, Uuencode, Quoted-Printable, and HTML Entities. These formats processed information in raw bytes instead of sequences of bytes, and PHP already has separate functions for encoding/decoding these formats.
PHP 8.2 will deprecate partially-supported callables that don't work with the $callable()
pattern. The deprecated callables include various forms like:
$callable = "self::method"
$callable = "parent::method"
$callable = "static::method"
$callable = ["self", "method"]
$callable = ["parent", "method"]
...
To prevent deprecation messages, users can convert all self, parent, and static keywords to their corresponding class names.
PHP allows variable value replacement within string literals using double quotes. In PHP 8.2, the syntax ${var}
and " ${expr}"
for variable variables will be deprecated. You can still use the simpler "$myname"
and "{$myname}"
options without any issues.
PHP 8.2 introduces improvements to the random extension, moving several functions and constants to this extension. These functions will still be available in the global namespace. Notable functions and constants include random_bytes
, random_int
, rand
, getrandmax
, srand
, lcg_value
, mt_rand
, mt_getrandmax
, mt_srand
, MT_RAND_PHP
, and MT_RAND_MT19937
.
Here’s a list of all the functions and constants that will be moved to the random extension. Keep in mind that they will remain in the global namespace.
Starting with PHP 8.2, libmysql support has been removed. PHP historically supported two libraries to connect to MySQL databases: mysqlnd
and libmysql
. As of PHP 5.4, mysqlnd
became the recommended library. With PHP 8.2, libmysql
has been removed, and users are required to use the mysqlnd
library for connecting to MySQL databases.
PHP 8.2 introduces a bug fix for the ksort
function, making the output of the SORT_REGULAR
parameter consistent with other parameters. Prior to PHP 8.2, it prioritized alphabetic keys before numeric keys, but now ksort
will place numeric keys before alphabetic keys when sorting.
PHP 8.2 addresses a bug in the str_split
function. Previously, when given an empty string, it would return an empty string. In PHP 8.2, it will return an empty array when provided with an empty string.
Most hosting providers offer an easy way to switch between PHP versions. If you’re using Sitebuilder.live's control panel, follow these steps:
Within this utility, you can also manage PHP extensions and options for each PHP version individually.
PHP 8.2 brings a host of improvements over previous versions, introducing new features like readonly classes, deprecating complex syntax in outdated implementations, and fixing critical bugs to enhance the development workflow. We hope this overview has helped you prepare for the PHP 8.2 release that is already available on Sitebuilder.live!