 
                                     
                                        The PHP team has released PHP 8.4 with new array find functions, property hooks, class instantiation without extra parenthesis, and more:
mb_trim functionsmb_ucfirst() and mb_lcfirst() functions– See the PHP 8.4 RFC page for a complete list.
PHP 8.4 will come with new array find functions that include:
array_find()array_find_key()array_any()array_all()See our post on the PHP 8.4 Array Find Functions.
Property hooks are inspired by languages like Kotlin, C#, and Swift, and the syntax includes two syntax variants that resemble short and multi-line closures:
class User implements Named
{
    private bool $isModified = false;
 
    public function __construct(
        private string $first,
        private string $last
    ) {}
 
    public string $fullName {
        // Override the "read" action with arbitrary logic.
        get => $this->first . " " . $this->last;
 
        // Override the "write" action with arbitrary logic.
        set {
            [$this->first, $this->last] = explode(' ', $value, 2);
            $this->isModified = true;
        }
    }
}Property hooks will help remove boilerplate of property getters and setters, allowing a property to define access and updates using hooks.
Since member access during instantiation was introduced, you must wrap the “new MyClass()” call in parentheses, or you'll get a parse error. The proposed syntax would allow you to access constants, properties, and methods without the extra parentheses:
// Wrapping parentheses are required to access class members
$request = (new Request())->withMethod('GET')->withUri('/hello-world');
 
// PHP Parse error (<= PHP 8.3): syntax error, unexpected token "->"
$request = new Request()->withMethod('GET')->withUri('/hello-world');This update fixes papercut that makes working with class member access simpler, not having to add surrounding parentheses or using a static constructor method. This syntax change also puts PHP more in alignment with other C languages like Java, C#, and TypeScript, which don't require surrounded parentheses.
Creating a DateTime from a Unix timestamp will be more convenient in PHP 8.4, with the new createFromTimestamp() method. It will support both a typical Unix timestamp as well as timestamps containing microseconds:
$dt = DateTimeImmutable::createFromTimestamp(1718337072);
$dt->format('Y-m-d'); // 2024-06-14
 
$dt = DateTimeImmutable::createFromTimestamp(1718337072.432);
$dt->format('Y-m-d h:i:s.u'); // 2024-06-14 03:51:12.432000In earlier versions of PHP, there are a few ways to create a DateTime instance from a timestamp, such as the createFromFormat() method:
$dt = DateTimeImmutable::createFromFormat('U', (string) 1718337072);
// DateTimeImmutable @1718337072 {#7948
//   date: 2024-06-14 03:51:12.0 +00:00,
// }
 
$dt = DateTimeImmutable::createFromFormat('U.u', (string) 1718337072.432);
// DateTimeImmutable @1718337072 {#7950
//   date: 2024-06-14 03:51:12.432 +00:00,
// }PHP has had trim, ltrim, rtrim, ucfirst, and lcfirst functions for a long time, and now in PHP 8.4 it adds 'mb_', multi-byte strings support for those functions.
mb_trim()mb_ltrim()mb_rtrim()mb_ucfirst()mb_lcfirst()These all carry the same arguments as the original functions. These functions are from two separate RFCs: rfc:mb_trim and rfc:mb_ucfirst.
Starting in PHP 8.4, properties may also have their visibility set asymmetrically with a different scope for reading and writing. Here's an example from the documentation:
class Book
{
    public function __construct(
        public private(set) string $title,
        public protected(set) string $author,
        protected private(set) int $pubYear,
    ) {}
}
 
class SpecialBook extends Book
{
    public function update(string $author, int $year): void
    {
        $this->author = $author; // OK
        $this->pubYear = $year; // Fatal Error
    }
}
 
$b = new Book('How to PHP', 'Peter H. Peterson', 2024);
 
echo $b->title; // How to PHP
echo $b->author; // Peter H. Peterson
echo $b->pubYear; // Fatal Error
All Comments