21.06.2019 Антон Околелов · 2019. 6. 19. · Стрелочные функции...
TRANSCRIPT
![Page 1: 21.06.2019 Антон Околелов · 2019. 6. 19. · Стрелочные функции Синтаксис: fn(список_параметров) => возвращаемое_выражение](https://reader035.vdocuments.net/reader035/viewer/2022071116/5ffd600cf6223a3265544f95/html5/thumbnails/1.jpg)
PHP 7.4
Антон Околелов21.06.2019
![Page 2: 21.06.2019 Антон Околелов · 2019. 6. 19. · Стрелочные функции Синтаксис: fn(список_параметров) => возвращаемое_выражение](https://reader035.vdocuments.net/reader035/viewer/2022071116/5ffd600cf6223a3265544f95/html5/thumbnails/2.jpg)
Кто я?
• Работатимлид команды PHP/Go
• Хоббиведущий подкаста “Цинковый прод”
![Page 3: 21.06.2019 Антон Околелов · 2019. 6. 19. · Стрелочные функции Синтаксис: fn(список_параметров) => возвращаемое_выражение](https://reader035.vdocuments.net/reader035/viewer/2022071116/5ffd600cf6223a3265544f95/html5/thumbnails/3.jpg)
PHP развивается быстро, но куда?
● Типизированные свойства классов
● FFI и предзагрузка
● Стрелочные функции
● Оператор ??=
● Ковариантность/контравариантность при наследовании
● Оператор распаковки в массивах и многое другое
● !!!это всё круто, но чего-то важного не хватает
![Page 4: 21.06.2019 Антон Околелов · 2019. 6. 19. · Стрелочные функции Синтаксис: fn(список_параметров) => возвращаемое_выражение](https://reader035.vdocuments.net/reader035/viewer/2022071116/5ffd600cf6223a3265544f95/html5/thumbnails/4.jpg)
Опять нет асинхронщины :(
• amphp• reactphp• swoole• Golang• NodeJS
но не php из коробки
![Page 5: 21.06.2019 Антон Околелов · 2019. 6. 19. · Стрелочные функции Синтаксис: fn(список_параметров) => возвращаемое_выражение](https://reader035.vdocuments.net/reader035/viewer/2022071116/5ffd600cf6223a3265544f95/html5/thumbnails/5.jpg)
Типизированные свойства
class User { public int $id; public string $name;
public function __construct(int $id, string $name) { $this->id = $id; $this->name = $name; }}
![Page 6: 21.06.2019 Антон Околелов · 2019. 6. 19. · Стрелочные функции Синтаксис: fn(список_параметров) => возвращаемое_выражение](https://reader035.vdocuments.net/reader035/viewer/2022071116/5ffd600cf6223a3265544f95/html5/thumbnails/6.jpg)
class Example { public int $scalarType; protected ClassName $classType; private ?ClassName $nullableClassType;
public static iterable $staticProp;
var bool $flag;
public string $str = "foo"; public ?string $nullableStr = null; // нет дефолта, даже null’а
public float $x, $y;}
![Page 7: 21.06.2019 Антон Околелов · 2019. 6. 19. · Стрелочные функции Синтаксис: fn(список_параметров) => возвращаемое_выражение](https://reader035.vdocuments.net/reader035/viewer/2022071116/5ffd600cf6223a3265544f95/html5/thumbnails/7.jpg)
FFI (Foreign function interface)
// создаем FFI объект, берем одну функцию из библиотеки libc$ffi = FFI::cdef( "int printf(const char *format, ...);", // описание на Cи "libc.so.6");
// вызываем сишную функцию$ffi->printf("Hello %s!\n", "world");
![Page 8: 21.06.2019 Антон Околелов · 2019. 6. 19. · Стрелочные функции Синтаксис: fn(список_параметров) => возвращаемое_выражение](https://reader035.vdocuments.net/reader035/viewer/2022071116/5ffd600cf6223a3265544f95/html5/thumbnails/8.jpg)
FFI (Foreign function interface)
$p = FFI::new("struct {int x,y;} [2]");
$p[0]->x = 5;$p[1]->y = 10;
![Page 9: 21.06.2019 Антон Околелов · 2019. 6. 19. · Стрелочные функции Синтаксис: fn(список_параметров) => возвращаемое_выражение](https://reader035.vdocuments.net/reader035/viewer/2022071116/5ffd600cf6223a3265544f95/html5/thumbnails/9.jpg)
FFI (Foreign function interface)
• Выстрел в ногу, ручное управление памятью• Можно на Rust• ffi.enable - false, true,preload
![Page 10: 21.06.2019 Антон Околелов · 2019. 6. 19. · Стрелочные функции Синтаксис: fn(список_параметров) => возвращаемое_выражение](https://reader035.vdocuments.net/reader035/viewer/2022071116/5ffd600cf6223a3265544f95/html5/thumbnails/10.jpg)
FFI (Foreign function interface)
cargo new hellofromrust --lib
Cargo.toml:….[lib]name="hellofromrust"crate-type = ["dylib"]
….
![Page 11: 21.06.2019 Антон Околелов · 2019. 6. 19. · Стрелочные функции Синтаксис: fn(список_параметров) => возвращаемое_выражение](https://reader035.vdocuments.net/reader035/viewer/2022071116/5ffd600cf6223a3265544f95/html5/thumbnails/11.jpg)
FFI (Foreign function interface)
#[no_mangle]pub extern "C" fn addNumbers(x: i32, y: i32) -> i32 {
x + y}
![Page 12: 21.06.2019 Антон Околелов · 2019. 6. 19. · Стрелочные функции Синтаксис: fn(список_параметров) => возвращаемое_выражение](https://reader035.vdocuments.net/reader035/viewer/2022071116/5ffd600cf6223a3265544f95/html5/thumbnails/12.jpg)
FFI (Foreign function interface)
<?php// перед запуском надо сделать cargo build, чтобы сгенерить .so
$ffi = FFI::cdef("int addNumbers(int x, int y);", './libhellofromrust.so');print "1+2=" . $ffi->addNumbers(1, 2) . "\n";
// 1+2=3
![Page 13: 21.06.2019 Антон Околелов · 2019. 6. 19. · Стрелочные функции Синтаксис: fn(список_параметров) => возвращаемое_выражение](https://reader035.vdocuments.net/reader035/viewer/2022071116/5ffd600cf6223a3265544f95/html5/thumbnails/13.jpg)
Предзагрузка
• opcache.preload=preload.php• preload.php:
<?php FFI::load(...) opcache_compile_file(...); opcache_compile_file(...); ....
Рестарт на любое изменение
![Page 14: 21.06.2019 Антон Околелов · 2019. 6. 19. · Стрелочные функции Синтаксис: fn(список_параметров) => возвращаемое_выражение](https://reader035.vdocuments.net/reader035/viewer/2022071116/5ffd600cf6223a3265544f95/html5/thumbnails/14.jpg)
Стрелочные функции
//Было:$result = array_filter($paths, function ($v) use ($names) { return in_array($v, $names);});
//Стало:$result = array_filter($paths, fn($v) => in_array($v, $names));
![Page 15: 21.06.2019 Антон Околелов · 2019. 6. 19. · Стрелочные функции Синтаксис: fn(список_параметров) => возвращаемое_выражение](https://reader035.vdocuments.net/reader035/viewer/2022071116/5ffd600cf6223a3265544f95/html5/thumbnails/15.jpg)
Стрелочные функции
● Синтаксис:
fn(список_параметров) => возвращаемое_выражение
● Замыкается весь родительский скоуп
● fn - новое ключевое слово
![Page 16: 21.06.2019 Антон Околелов · 2019. 6. 19. · Стрелочные функции Синтаксис: fn(список_параметров) => возвращаемое_выражение](https://reader035.vdocuments.net/reader035/viewer/2022071116/5ffd600cf6223a3265544f95/html5/thumbnails/16.jpg)
Ковариантность/контравариантность
interface Factory { function make(): object;}
class UserFactory implements Factory { function make(): User;}
![Page 17: 21.06.2019 Антон Околелов · 2019. 6. 19. · Стрелочные функции Синтаксис: fn(список_параметров) => возвращаемое_выражение](https://reader035.vdocuments.net/reader035/viewer/2022071116/5ffd600cf6223a3265544f95/html5/thumbnails/17.jpg)
Ковариантность/контравариантность
class Animal {}class Cat extends Animal {}
class Person { public function feed(Cat $x) {}}
class ConcretePerson extends Person { public function method(Animal $x) {}}
![Page 18: 21.06.2019 Антон Околелов · 2019. 6. 19. · Стрелочные функции Синтаксис: fn(список_параметров) => возвращаемое_выражение](https://reader035.vdocuments.net/reader035/viewer/2022071116/5ffd600cf6223a3265544f95/html5/thumbnails/18.jpg)
Spread operator для массивов
• Traversable
$parts = ['apple', 'pear'];$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
![Page 19: 21.06.2019 Антон Околелов · 2019. 6. 19. · Стрелочные функции Синтаксис: fn(список_параметров) => возвращаемое_выражение](https://reader035.vdocuments.net/reader035/viewer/2022071116/5ffd600cf6223a3265544f95/html5/thumbnails/19.jpg)
Оператор ??=
// эквивалентные записи
$params['x'] = $params['x'] ?? 0;
$params['x'] ??= 0;
![Page 20: 21.06.2019 Антон Околелов · 2019. 6. 19. · Стрелочные функции Синтаксис: fn(список_параметров) => возвращаемое_выражение](https://reader035.vdocuments.net/reader035/viewer/2022071116/5ffd600cf6223a3265544f95/html5/thumbnails/20.jpg)
Разное
• функция mb_str_split() - разбиение мультибайтовых строк на чанки• Разделение литералов: 1_000_000_000• Разрешены exceptions в __toString()• Изменён приоритет оператора конкатенации, у + и - теперь выше:
echo "sum: " . $a + $b; // в 7.4 будет warningecho "sum :" . ($a + $b); // в 8 будет читаться так
• __serialize __unserialize• Weak references• Вложенные тернарки без скобок запрещены
![Page 21: 21.06.2019 Антон Околелов · 2019. 6. 19. · Стрелочные функции Синтаксис: fn(список_параметров) => возвращаемое_выражение](https://reader035.vdocuments.net/reader035/viewer/2022071116/5ffd600cf6223a3265544f95/html5/thumbnails/21.jpg)
Ссылки
• https://wiki.php.net/rfc#php_74 - ссылки на все RFC• https://habr.com/ru/company/funcorp/blog/454410/ - обзорная статья
по-русски• https://habr.com/ru/post/450544/ - статья про стрелочные функции в
PHP• https://soundcloud.com/znprod - подкаст ”Цинковый прод” • https://facebook.com/anton.okolelov - фейсбук• https://twitter.com/AntonOkolelov - твиттер