PHP 7.4

Денис Васишак, Студия "Флаг"

Что нового:

  1. Типизированные свойства классов
  2. Стрелочные функции
  3. Присваивающий оператор объединения с null (??=)
  4. Ковариантность/контравариантность
  5. Оператор распаковки в массивах
  6. Интерфейс внешних функций
  7. Предзагрузка для улучшения производительности
  8. Deprecations
  9. Остальное

Типизированные свойства классов (RFC)


                            class Foo
                            {
                                public string $version;
                                public ?int $number;
                                public Bar $bar;
                            }
					    

Нельзя использовать типы void и callable

Изменение типов при наследовании


                            class A {
                                private bool $a;
                                public int $b;
                                public ?int $c;
                            }
                            class B extends A {
                                public string $a; // legal, because A::$a is private
                                public ?int $b;   // ILLEGAL
                                public int $c;    // ILLEGAL
                            }
					    

Обращение к неинициализированной переменной


                            class Foo
                            {
                                public int $bar;
                            }

                            $foo = new Foo;
                            var_dump($foo->bar);

                            //Fatal error: Uncaught Error: Typed property Foo::$bar
                            //must not be accessed before initialization
					    

Стрелочные функции (RFC)


                            //PHP 7.3
                            $users = array_filter($users, function ($user) use ($name) {
                                return $user->name === $name;
                            }

                            //PHP 7.4
                            users = array_filter($users, fn($user) => $user->name === $name);
                        

Стрелочные функции

  • Они могут получить доступ к parent области, таким образом, нет необходимости использовать ключевое слово use
  • $this тоже доступна, как и в обычных анонимных функциях
  • Стрелочные функции могут содержать только одну строку, которая также является оператором возврата значения

Стрелочные функции

В сигнатуре стрелочной функции, как и в обычной функции, можно указывать типы, дефолты и прочее


                            fn(array $x) => $x;
                            fn(): int => $x;
                            fn($x = 42) => $x;
                            fn(&$x) => $x;
                            fn&($x) => $x;
                            fn($x, ...$rest) => $rest;
                        

Стрелочные функции

Замыкание переменных


                            $y = 1;

                            //PHP 7.3
                            $fn1 = function ($x) use ($y) {
                                return $x + $y;
                            };

                            //PHP 7.4
                            $fn1 = fn($x) => $x + $y;
                        

Присваивающий оператор объединения с null ??= (RFC)


                        //PHP 7.3
                        $user->created_at = $user->created_at ?? now();

                        //PHP 7.4
                        $user->created_at ??= now();
                    

Ковариантность/контравариантность (RFC)

Данное изменение позволяет изменять тип параметра на один из его супертипов. В свою очередь возвращаемый тип можно заменить на его подтип

Ковариантность


                            interface Factory {
                                function make(): object;
                            }
                             
                            class UserFactory implements Factory {
                                function make(): User;
                            }
                        

Контравариантность


                            interface Concatable {
                                function concat(Iterator $input); 
                            }

                            class Collection implements Concatable {
                                // accepts all iterables, not just Iterator
                                function concat(iterable $input) {/* . . . */}
                            }
                        

Оператор распаковки в массивах (RFC)


                        $arrayA = [1, 2, 3];
                        $arrayB = [4, 5];
                        $result = [0, ...$arrayA, ...$arrayB, 6 ,7];
                        //[0, 1, 2, 3, 4, 5, 6, 7]
                    

Интерфейс внешних функций (RFC)

Интерфейс внешних функций (FFI) позволяет писать код на C непосредственно в PHP-коде. Это означает, что расширения PHP могут быть написаны на чистом PHP.


                        // create FFI object, loading libc and exporting function printf()
                        $ffi = FFI::cdef(
                            "int printf(const char *format, ...);", // this is regular C declaration
                            "libc.so.6");
                        // call C printf()
                        $ffi->printf("Hello %s!\n", "world");
                    

Предзагрузка (RFC)

On server startup – before any application code is run – we may load a certain set of PHP files into memory – and make their contents “permanently available” to all subsequent requests that will be served by that server. All the functions and classes defined in these files will be available to requests out of the box, exactly like internal entities.

Deprecations (RFC)

  • Тип real
  • array_key_exists() с объектами
  • implode() произвольный порядок параметров
  • фигурные скобки при обращении к элементу массива $array{1}
  • parent:: без родительского класса
  • Короткий тэг <?
  • Левоассоциативный тернарный оператор

                            1 ? 2 : 3 ? 4 : 5;   // deprecated
                            (1 ? 2 : 3) ? 4 : 5; // ok
                        

Приоритет операций при конкатенации


                            echo "sum: " . $a + $b; // deprecated warning

                            //PHP NOW
                            echo ("sum: " . $a) + $b;

                            //PHP 8
                            echo "sum :" . ($a + $b);
                        

Остальное

Пользовательская сериализация объектов (RFC)


                                class A {
                                    private $prop_a;
                                    public function __serialize(): array {
                                        return ["prop_a" => $this->prop_a];
                                    }
                                    public function __unserialize(array $data) {
                                        $this->prop_a = $data["prop_a"];
                                    }
                                }
                                class B extends A {
                                    private $prop_b;
                                    public function __serialize(): array {
                                        return [
                                            "prop_b" => $this->prop_b,
                                            "parent_data" => parent::__serialize(),
                                        ];
                                    }
                                    public function __unserialize(array $data) {
                                        parent::__unserialize($data["parent_data"]);
                                        $this->prop_b = $data["prop_b"];
                                    }
                                }
                        

Поддержка исключений в __toString (RFC)


                            class Foo {
                                public function __toString() 
                                {
                                    throw new Exception('Hello there');
                                }
                            }
                        

Разделитель числовых литералов (RFC)


                            1_000_000_000  // int
                            6.674_083e-11; // float
                            299_792_458;   // decimal
                            0xCAFE_F00D;   // hexadecimal
                            0b0101_1111;   // binary
                            0137_041;      // octal
                        

Слабые ссылки (RFC)

Слабые ссылки позволяют сохранить ссылку на объект, которая не препятствует уничтожению этого объекта. Например, они полезны для реализации кэш-подобных структур.


                            $object = new stdClass;
                            $weakRef = WeakReference::create($object);

                            var_dump($weakRef->get()); // object(stdClass)#1 (0) {}
                            unset($object);
                            var_dump($weakRef->get()); // null
                        

https://vasishakd.github.io/php74