! TYPES & STATIC ANALYSIS TYPES ARE GOOD, I PROMISE. SAM - - PowerPoint PPT Presentation

types static analysis
SMART_READER_LITE
LIVE PREVIEW

! TYPES & STATIC ANALYSIS TYPES ARE GOOD, I PROMISE. SAM - - PowerPoint PPT Presentation

! TYPES & STATIC ANALYSIS TYPES ARE GOOD, I PROMISE. SAM GREENWOOD @SAMTGREENWOOD TECHNOLOGY MANAGER @ UNITI GROUP I LIKE TYPES. WITHOUT TYPES WITH TYPES WHAT ARE TYPES? DYNAMIC TYPES DEFINED WHEN WE USE THEM STATIC TYPES DEFINED


slide-1
SLIDE 1

TYPES & STATIC ANALYSIS !

TYPES ARE GOOD, I PROMISE.

slide-2
SLIDE 2

SAM GREENWOOD

@SAMTGREENWOOD

TECHNOLOGY MANAGER @ UNITI GROUP I LIKE TYPES.

slide-3
SLIDE 3

WITHOUT TYPES

slide-4
SLIDE 4

WITH TYPES

slide-5
SLIDE 5
slide-6
SLIDE 6

WHAT ARE TYPES?

slide-7
SLIDE 7

DYNAMIC TYPES

DEFINED WHEN WE USE THEM

slide-8
SLIDE 8

STATIC TYPES

DEFINED BEFORE WE USE THEM

slide-9
SLIDE 9

STRONG TYPES

CAN NEVER CHANGE

slide-10
SLIDE 10

WEAK TYPES

IT HAS A TYPE RIGHT NOW, BUT IT CAN CHANGE.

slide-11
SLIDE 11

WHAT IS PHP?

> Dynamic, Weak! > Do we wish it was something else? > There are tools that can help! > PHP 7.4

slide-12
SLIDE 12

TYPES SHOW INTENT

slide-13
SLIDE 13
slide-14
SLIDE 14

TYPES MAKE YOUR CODE EASIER TO READ

slide-15
SLIDE 15

AVOID THE FEAR CYCLE

> Small changes have unpredictable, scary, or costly results. > We begin to fear making changes. > We try to make every change as small and local as possible. > The code base accumulates warts, knobs, and special cases.

slide-16
SLIDE 16

WHAT IS STATIC ANALYSIS?

slide-17
SLIDE 17

STATIC ANALYSIS IN PHP

slide-18
SLIDE 18

STATIC ANALYSIS SUCKS UNLESS IT KNOWS ABOUT YOUR CODE!

slide-19
SLIDE 19

PROVIDE TYPES WHERE YOU CAN

slide-20
SLIDE 20

GENERATED DOC BLOCKS? !

slide-21
SLIDE 21
slide-22
SLIDE 22

LOTS OF TOOLS!

> Psalm - psalm.dev > PHPStan - github.com/phpstan/phpstan > Larastan - github.com/nunomaduro/larastan > Rector - getrector.org

slide-23
SLIDE 23

PSALM

PSALM.DEV

> Additional type information > Generics > Typed Variables > Different strictness levels > 78 rules!

slide-24
SLIDE 24

PHPSTAN

GITHUB.COM/PHPSTAN/PHPSTAN

> Similar to Psalm > Community plugins for more functionality > Playground @ phpstan.org

slide-25
SLIDE 25

LARASTAN

GITHUB.COM/NUNOMADORO/LARASTAN

> PHPStan > Laravel Flavoured > That makes it better, right? > Know's about facades and Laravel internals

slide-26
SLIDE 26

RECTOR

GETRECTOR.ORG

> Instant code upgrades > Generate good doc blocks where needed > PHP 7.4 property types > Refactor Laravel facades to DI > Great for legacy

slide-27
SLIDE 27

5 THINGS SOMEONE HATES

> Code in comments > Useless DocBlocks > Types declarations > Cider with ice > Me after this talk

slide-28
SLIDE 28
slide-29
SLIDE 29

STATIC ANALYSIS ❤ DOCBLOCKS

slide-30
SLIDE 30

NOT NOW

class Account { private Owner $owner; public function deposit(Money[] $money) : Transaction { } }

slide-31
SLIDE 31

EXTRA TOOLS

class Account { /** * @var Owner */ private $owner; /** * @var Money[] $money */ public function deposit(array $money) : Transaction { } }
slide-32
SLIDE 32

EXTRA TOOLS & PHP 7.4

class Account { private Owner $owner; /** * @var Money[] $money */ public function deposit(array $money) : Transaction { } }

slide-33
SLIDE 33

DON'T USE UNNECESSARY DOC BLOCKS!

slide-34
SLIDE 34

IT'S NOT ALL AND

slide-35
SLIDE 35

!

$user = User::find(1); // could be User or NULL if($!user) // Let's check! { throw new UserNotFoundException(1); } $user->say('Types are great'); // Error! Calling function on possible null. /** * @var User $user */ $user->say('Types are great'); // I guess we'll make do.

slide-36
SLIDE 36

!

$transactions = Transaction::all(); $isOver9000 = function($number) : bool { return $number > 9000; }); $over9000 = $transactions->map(function($t) use($isOver9000) { return $isOver9000($t->amount()); });

slide-37
SLIDE 37

!

/** * @var Collection<Transaction> */ $transactions = Transaction::all(); $isOver9000 = function(int $number) : bool { return $number > 9000; }); $over9000 = $transactions->map(function(Transaction $t) use($isOver9000) : Transaction { return $isOver9000($t->amount()); });
slide-38
SLIDE 38

THERE ARE NO SOLUTIONS ONLY TRADEOFFS.

slide-39
SLIDE 39

slide-40
SLIDE 40

WHERE TO FIND ME

@samtgreenwood on Twitter samgreenwood on PHP Australia Slack samgreenwood.me ! "