Some of the PHP 8.2 new features

Readonly classes

До сега можеше да декларираме отделни пропъртита на даден клас като readonly.
Вече може всички пропъртита да ги декларираме readonly ако декларираме целият клас readonly.

Вместо:

class MyClass
{
	public readonly string $myValue,
	public readonly int $myOtherValue
	public readonly string $myAnotherValue
	public readonly int $myYetAnotherValue
}

това:

readonly class MyClass
{
	public string $myValue,
	public int $myOtherValue
	public string $myAnotherValue
	public int $myYetAnotherValue
}

Важно е, че в такъв случай, когато целият клас е readonly, всичките му пропъртита трябва задължително да имат тип, дори и да е mixed.

Също и, че не може да се декларират като readonly – enum, interface и trait. Само класове.

Dynamic class properties

Вече не може да се използват клас пропъртита, които не са декларирани.

From PHP 8.2 onwards, dynamic properties are deprecated. Setting a value to an undeclared class property will emit a deprecation notice the first time the property is set.

However, from PHP 9.0 onwards, setting the same will throw an ErrorException error.

…if you want to stop these deprecation notices after upgrading to PHP 8.2, you can use PHP 8.2’s new #[AllowDynamicProperties] attribute to allow dynamic properties on classes.

new standalone types

Вече имаме типове като true, false и null, демек такива, които са по принцип values, a не типове, могат вече да се използват и като типове. Демек, функция например може да ти връща тип null, или тип false, или тип true.

Но да не забравяме, че true и false са union type на bool. Демек, не можем да декларираме параметър или тип на връщана стойност като например bool|false.
Both true and false types are essentially a union type of PHP’s bool type. To avoid redundancy, you cannot declare these three types together in a union type. Doing so will result in a compile-time fatal error.

Disjunctive Normal Form (DNF) Types

sensitive parametters

Има случаи, в които волно или неволно можем да логнем например пароли, в различни log файлове или подобни по предназначение системи.

За да избегнем това програмно, ако подобна информация е например клас пропърти или параметър на функция, можем да ги декларираме като т.н. SensitiveParameter с помощта на атрибутът [\SensitiveParameter] по следният начин.

function example(
    $ham,
    #[\SensitiveParameter] $eggs,
    $butter
) {
    throw new \Exception('Error');
}

example('ham', 'eggs', 'butter');

/*
Fatal error: Uncaught Exception: Error in test.php:8
Stack trace:
#0 test.php(11): test('ham', Object(SensitiveParameterValue), 'butter')
#1 {main}
thrown in test.php on line 8
*/

When you generate a backtrace, any parameter with the \SensitiveParameter attribute will be replaced with a \SensitiveParameterValue object, and its real value will never be stored in the trace. The SensitiveParameterValue object encapsulates the actual parameter value — if you need it for any reason.

Fetch enum Properties in const Expressions

https: // kinsta.com/blog/php-8-2/#fetch-enum-properties-in-const-expressions

Allow Constants in Traits

Вече и в traits може да се дефинират константи.

trait Foo {
    public const FLAG_1 = 1;
    protected const FLAG_2 = 2;
    ...
Deprecate Partially Supported Callables

Първо, какво значи „partially supported callables“?

These callables are termed „partially supported“ because you cannot interact with them directly via $callable(). You can only get to them with the call_user_func($callable) function.

From PHP 8.2 onwards, any attempts to invoke such callables — such as via call_user_func() or array_map() functions — will throw a deprecation warning.