Finally we have a Release Candidate v4 for PHP 8.1. What have changed? and what’s got added new? But mainly what did they decided to drop from the language? Read this and surprise your boss/team with super sweet knowledge of new technologies!
Deprecation of Automatic conversion of false type to array
You won’t be able to initialize array from falsy values any more this include: only false
values and nothing else.
Read more about Automatic conversion in PHP 8.1 in here.
Multi Classes Types
Combine two or more types of classes (or array
) to be required by the class property, local variable or a return type of the function.
Read more about Intersections Types in PHP 8.1 over here.
Localized Date Formats
Format your date with local date structure to combine different format and pattern for full date via new class ` IntlDatePatternGenerator
and methods like: getBestPattern()
.
Read more about new IntlDatePatternGenerator class in this link.
New Warning being throw when converting float to int
For plain float
type of variables or float being marked as string, there will be thrown a PHP Deprecation about potential data loss.
Read more about new non-integer-compatible float to int conversions in this article.
ENUMS are here!
Limit your variables with pre-selected values setup by using new scalar type of enum
and by as cool and fun as JAVA or C# developers!
Read more about Enumerations and how to use them in correct way in here.
Deprecation when you pass NULL to non-null param
So you have some random null
values passed over to internal PHP function for non-null params? Well you are in trouble in PHP 8.1 and even more trouble when PHP 9 would pop in.
Why in trouble? Read this and find out about passing null to non-nullable arguments.
Support of merging string keys via Spread Operator
Start merging arrays without array_merge()
completely. Spread Operator have now a support of integer types of keys, as well as string types keys. So you can merge your arrays more safe than before. Merge away!
What’s Spread Operator and how it was extended in PHP 8.1? Read here.
New feature array_is_list()
Added a new check to array
to see if it contains only an int based keys in natural order (from 0 to n`). Useful when we want to ensure the array is consistent (untouched) and when we want to serialize an array
to json
to format of [0, 1, 2]
instead of object properties.
Read more about array_is_list(array $input): bool over here.
New octal integer notation
Forget about a case of checking 016 == 16
causing a false response, from now on any octal integer will have to be written in literal notation, which is 0o16
. This only applies to integer types, strings behavior are kept intact.
Check out what other examples are supported with PHP 8.1 octal notation.
Secured $GLOBALS array
Not much would care about this one, but it’s worth to mention that previously you could override the whole $GLOBALS
variable with your custom data, now you can only modify its keys/aliases.
There is also a change of pass by references in $GLOBALS, but you can read that here.
Default MySQLi Error Mode
The default error mode for mysqli
calls is now changed from silent mode to Exception mode. This doesn’t affect PDO
object since PHP Data Object is already throwing Exception by default.
More on MySQLi Error Mode could be found in this page.
MySQLi: fetch_column()
New function was added to retrieve first or any other column from the resultset to MySQLi
object. This follows the fetchColumn()
method from PDO and behaves in the same manner.
Learn more about mysqli:fetch_column(int index) over here.
MySQLi: binding multiple values
MySQLi is gettng a feature to bind arrays to execute($array)
method in single call. This would apply to standard int
index based arrays and associative arrays.
To get more information on binding in execute() visit this link.
New fsync() function
Synchronize new changes to the file without re-opening the same file again. fsync()
would also throw a warning when the file is not a file pointer. The interface is: fsync(resource $stream): bool
.
Checkout how fsync() work under the hood and why it could be OS dependent in here.
Extra return type :noreturn
For any methods or function which are meant to always throw exception or exit the code using things like: exit() or die()
a new return type of: noreturn
was added. The sample usage could be: function iWillAlwaysExit(): noreturn
.
Read how new return type throw an exception and when to use it safely in this link.
Asynchronous and lightweight thread execution: Fibers
Fibers allow the creation of full-stack, incorruptible functions that can be used to develop cooperative multitasking in PHP. This feature eliminates the distinction between sync and async functions by allowing them to be incorruptible without breaking the entire call stack.
Deprecated Serializable interface
Since PHP 7.4 magic methods of __seralize()
and __unserialize()
were added, since then Serializable interfece is obsolete and in fact broken with new PHP 8.x features. This also includes deprecating of PDO::FETCH_SERIALIZE
flag of PDO object that will be remove completely in PHP 9.
Why Serializable is broken and bad design? Read about that and more in here.
Inherited static variables
Local method static variables will now be inherited between multiple objects and even classes if base Class is used as parent Class. Previously each local static var was only related to the current type of Class.
Return types for internal methods
Every PHP internal methods from internal Classes will now contain a return type declarations. This change will impact any case of extending and overriding of internal PHP classes with custom implementations. From 8.1 we will get a deprecation and since 9.0 it will be a Fatal Error.
Check how this will impact union return types and when will they be available in this article.
Persistent class constants
It is now possible to declare a class constant as final
to prevent from overriding the constant by the child class. Of course current class constant functionality remains the same.
See how you could use final class constants in here.
New setAccessible() Reflection method
For any private method ReflectionMethod
or class property ReflectionProperty
we can now set its accessibility and call it manually without getting any errors.
View examples usages of setAccessible() in Reflection over here.
Default parameters with “new” keyword
Currently we could only assign a default parameter value of null
, array
or primitive types in functions and methods. In PHP 8.1 we will be able to provide any custom class as default value for our expected function parameter. This includes defining a class variables inside the parameters as well.
To inspect how you could start to use “new” in initializes navigate to this link.
Callable syntax
Convert any callable into Closure object to be returned and then used/called when needed. The next syntax (aka First class callable syntax) of $this->methodName(...)
is identical in behavior as current: Closure::fromCallable([this, 'methodName'])
. Do not confuse this syntax to unpacking argument syntax of ...$args
.
Read more about First-class callable syntax over here.
Read-only class properties
To ensure the class property will never be modified/changed by itself or children or external calls we can now use a readonly
prefix to class property declaration like so: public readonly string $propertyName = 'thisValueWillNeverChange;
. The only place when we could override the readonly variable is inside the class constructor.
More deprecations
date_sunrise()
anddate_sunset()
key()
,current()
,next()
,prev()
, andreset()
on objectsmb_check_encoding()
without argumentget_class()
,get_parent_class()
andget_called_class()
without argumentFILE_BINARY
andFILE_TEXT
constantst
fopen mode- Passing bool for
$value
argument ofIntlCalendar::roll()
- Accessing static members on traits
strptime()
strftime()
andgmtstrftime()
mhash*()
function familyctype_*()
function family acceptsint
parameters- Return by reference with void type
- NIL constant defined by the IMAP extension
- Calling overloaded pgsql functions without the connection argument
$num_points
parameter ofimage(open|filled)polygon
Full list of deprecated features can be found in this dedicated article.
More about PHP 8.1
You can read more and official information around PHP 8.1 and PHP 8.2 releases in the link below.
https://wiki.php.net/rfc#php_81