Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird....
Transcript of Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird....
![Page 1: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/1.jpg)
Das macht man heute soSebastian Bergmann
![Page 2: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/2.jpg)
Sebastian Bergmann
![Page 3: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/3.jpg)
![Page 4: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/4.jpg)
Wie hat sich die Art, wie wir programmieren,
geändert?
![Page 5: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/5.jpg)
![Page 6: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/6.jpg)
init: move #$ac,d7 move #1,d6mainloop:wframe: cmp.b #$ff,$dff006 bne wframe add d6,d7 cmp #$f0,d7 blo ok1 neg d6ok1: cmp.b #$40,d7 bhi ok2 neg d6ok2:waitras1: cmp.b $dff006,d7 bne waitras1 move.w #$fff,$dff180waitras2: cmp.b $dff006,d7 beq waitras2 move.w #$116,$dff180 btst #6,$bfe001 bne mainloop rts
![Page 7: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/7.jpg)
Wir überspringen ein paar Jahre ...
![Page 8: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/8.jpg)
<?phprequire __DIR__ . '/includes/config.php';require __DIR__ . '/includes/db.php';
$result = $DB->query(' SELECT * FROM auftrag, kunde WHERE auftrag.kunden_id = kunde.kunden_id AND auftrag.datum BETWEEN "' . $_GET['jahr'] . '-01-01" AND "' . $_GET['jahr'] . '-12-31";');
$auftraege = [];
foreach ($result as $row) { $auftraege[] = [ 'Auftragsnummer' => $row['auftrag_id'], 'Datum' => (new DateTimeImmutable($row['datum']))->format('d.m.Y'), 'Auftraggeber' => $row['name'] . ', ' . $row['anschrift'] ];}
header('Content-Type: application/json; charset=utf-8');print json_encode($auftraege) . PHP_EOL;
![Page 9: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/9.jpg)
![Page 10: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/10.jpg)
Prozedurales Skript, das von "oben nach unten" ausge�ührt wird
![Page 11: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/11.jpg)
Prozedurales Skript, das von "oben nach unten" ausge�ührt wird
Kon�guration, Datenbankverbindung, alle Variablen im globalen Scope
![Page 12: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/12.jpg)
Prozedurales Skript, das von "oben nach unten" ausge�ührt wird
Kon�guration, Datenbankverbindung, alle Variablen im globalen Scope
Request-Verarbeitung, Persistenz, Geschä�slogik und Darstellung nicht
von einander getrennt
![Page 13: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/13.jpg)
Wir refaktorieren ein paar Stunden ...
![Page 14: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/14.jpg)
<?php declare(strict_types=1);require __DIR__ . '/../src/autoload.php';
$factory = new Factory;
$request = Request::fromSuperglobals();
$action = $factory->getOrderListAction();
$action->execute($request)->send();
![Page 15: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/15.jpg)
https://thephp.cc/schulungen/alten-code-angstfrei-aendern
![Page 16: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/16.jpg)
Wie hat sich die Art, wie wir programmieren,
geändert?
![Page 17: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/17.jpg)
Wie hat sich die Art, wie wir programmieren,
geändert?
Prozedural → Objekt-Orientiert
![Page 18: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/18.jpg)
Wie hat sich die Art, wie wir programmieren,
geändert?
Prozedural → Objekt-Orientiert
Global State → Object State
![Page 19: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/19.jpg)
Wie hat sich die Art, wie wir programmieren,
geändert?
Prozedural → Objekt-Orientiert
Global State → Object State
Favour immutable state over mutable state
![Page 20: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/20.jpg)
Was hat sich bei PHP die letzten Jahre getan?
![Page 21: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/21.jpg)
Was hat sich bei PHP die letzten Jahre getan?
Schneller!
![Page 22: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/22.jpg)
Was hat sich bei PHP die letzten Jahre getan?
Schneller!
Weniger Strom
![Page 23: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/23.jpg)
Was hat sich bei PHP die letzten Jahre getan?
Schneller!
Weniger Strom
(Mehr) Typsicherheit
![Page 24: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/24.jpg)
Typsystem
![Page 25: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/25.jpg)
Wer erinnert sich noch an PHP 4?
![Page 26: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/26.jpg)
class Money{ var $amount;
function Money($amount) { $this->amount = $amount; }
function amount() { return $this->amount; }
function add($other) { return new Money($this->amount + $other->amount()); }}
![Page 27: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/27.jpg)
class Money{ var $amount;
function Money($amount) { if (!is_int($amount)) { trigger_error( 'Passed argument is not an integer', E_USER_ERROR ); }
$this->amount = $amount; }
function amount() { return $this->amount; }
function add($other) { return new Money($this->amount + $other->amount()); }}
![Page 28: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/28.jpg)
class Money{ var $amount;
function Money($amount) { $this->amount = $amount; }
function amount() { return $this->amount; }
function add($other) { if (!is_a($other, 'Money')) { trigger_error( 'Passed argument is not a Money object', E_USER_ERROR ); }
return new Money($this->amount + $other->amount()); }}
![Page 29: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/29.jpg)
PHP 5
![Page 30: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/30.jpg)
final class Money{ private $amount;
public function __construct($amount) { $this->amount = $amount; }
public function amount() { return $this->amount; }
public function add(self $other) { return new Money($this->amount + $other->amount()); }}
![Page 31: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/31.jpg)
final class Money{ private $amount;
public function __construct($amount) { if (!is_int($amount)) { throw new InvalidArgumentException( 'Passed argument is not an integer' ); }
$this->amount = $amount; }
public function amount() { return $this->amount; }
public function add(self $other) { return new Money($this->amount + $other->amount()); }}
![Page 32: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/32.jpg)
PHP 7
![Page 33: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/33.jpg)
final class Money{ private $amount;
public function __construct(int $amount) { $this->amount = $amount; }
public function amount(): int { return $this->amount; }
public function add(self $other): self { return new Money($this->amount + $other->amount()); }}
![Page 34: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/34.jpg)
PHP 7.4
![Page 35: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/35.jpg)
final class Money{ private int $amount;
public function __construct(int $amount) { $this->amount = $amount; }
public function amount(): int { return $this->amount; }
public function add(self $other): self { return new Money($this->amount + $other->amount()); }}
![Page 36: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/36.jpg)
Was fehlt noch?
![Page 37: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/37.jpg)
Typ-Deklaration �ür lokale Variablen
![Page 38: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/38.jpg)
Typisierte Arrays
![Page 39: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/39.jpg)
Typisierte Arrays
wären schön, Collections tun es aber auch
![Page 40: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/40.jpg)
final class MoneyCollection implements \IteratorAggregate{ /** @var Money[] */ private $items = [];
public static function __construct(Money ...$items): self { $this->items = $items; }
public function add(Money $item): void { $this->items[] = $item; }
/** @return Money[] */ public function asArray(): array { return $this->items; }
public function getIterator(): MoneyCollectionIterator { return new MoneyCollectionIterator($this); }}
![Page 41: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/41.jpg)
final class MoneyCollectionIterator implements \Iterator { private $items; private $position;
public function __construct(MoneyCollection $collection) { $this->items = $collection->asArray(); }
public function rewind(): void { $this->position = 0; }
public function valid(): bool { return $this->position < \count($this->items); }
public function key(): int { return $this->position; }
public function current(): Money { return $this->items[$this->position]; }
public function next(): void { $this->position++; }}
![Page 42: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/42.jpg)
sebastianbergmann/shaku
![Page 43: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/43.jpg)
Was fehlt noch?
![Page 44: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/44.jpg)
Generics
![Page 45: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/45.jpg)
Union Types
![Page 46: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/46.jpg)
In den PHP 7-Beispielen habe ich declare(strict_types=1); aus
Platzgründen weggelassen.
Es gibt keinen Grund, in neuem Code auf die strikte Interpretation skalarer
Typdeklarationen zu verzichten.
![Page 47: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/47.jpg)
Type Checker
![Page 48: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/48.jpg)
![Page 49: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/49.jpg)
<?phpfunction foo(string $s): void { return 'bar';}
$a = ['hello', 5];foo($a[1]);foo();
if (rand(0, 1)) $b = 5;echo $b;
$c = rand(0, 5);if ($c) {} elseif ($c) {}
ERROR: InvalidReturnStatement - 3:12 - No return values are expected for fooINFO: UnusedParam - 2:21 - Param $s is never referenced in this methodERROR: InvalidReturnType - 2:26 - The declared return type 'void' for foo is incorrect, got 'string'ERROR: InvalidScalarArgument - 7:5 - Argument 1 of foo expects string, int(5) providedERROR: TooFewArguments - 8:1 - Too few arguments for method foo - expecting 1 but saw 0INFO: PossiblyUndefinedGlobalVariable - 11:6 - Possibly undefined global variable $b, first seen on line 10ERROR: TypeDoesNotContainType - 14:20 - Found a contradiction when evaluating $c and trying to reconcile type 'int(0)' to !falsy
![Page 50: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/50.jpg)
<?php declare(strict_types=1);namespace PHPUnit\Util\Annotation;
final class DocBlock{ // ...
/** @var array<string, array<int, string>> */ private $symbolAnnotations;
// ...}
![Page 51: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/51.jpg)
<?php declare(strict_types=1);namespace PHPUnit\Util;
final class Test{ // ... public static function getMissingRequirements(string $className, string $methodName): array { // ... if (!empty($required['PHP'])) { $operator = empty($required['PHP']['operator']) ? '>=' : $required['PHP']['operator'];
if (!\version_compare(\PHP_VERSION, $required['PHP']['version'], $operator)) { $missing[] = \sprintf('PHP %s %s is required.', $operator, $required['PHP']['version']); $hint = $hint ?? 'PHP'; } } elseif (!empty($required['PHP_constraint'])) { // ... } // ...}
ERROR: InvalidArgument - src/Util/Test.php:303:78 -Argument 3 of version_compare expects string(\x3c)|string(lt)|string(\x3c=)|string(le)|string(\x3e)|string(gt)|string(\x3e=)|string(ge)|string(==)|string(=)|string(eq)|string(!=)|string(\x3c\x3e)|string(ne), string(>=)|mixed provided
![Page 52: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/52.jpg)
--- a/src/Util/Test.php+++ b/src/Util/Test.php@@ -300,6 +301,8 @@ public static function getMissingRequirements(string $className, string $met if (!empty($required['PHP'])) { $operator = empty($required['PHP']['operator']) ? '>=' : $required['PHP']['operator
+ self::ensureOperatorIsValid($operator);+ if (!\version_compare(\PHP_VERSION, $required['PHP']['version'], $operator)) { $missing[] = \sprintf('PHP %s %s is required.', $operator, $required['PHP']['ve $hint = $hint ?? 'PHP';@@ -1279,4 +1286,19 @@ private static function shouldCoversAnnotationBeUsed(array $annotations):
return true; }++ private static function ensureOperatorIsValid(string $operator): void+ {+ if (!\in_array($operator, ['<', 'lt', '<=', 'le', '>', 'gt', '>=', 'ge', '==', '=', 'eq+ throw new Exception(+ \sprintf(+ '"%s" is not a valid version_compare() operator',+ $operator+ )+ );+ }+ } }
![Page 53: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/53.jpg)
<?php declare(strict_types=1);/** @psalm-pure */function f(int $x): int{ /** @var int $i */ static $i = 0;
$i += $x;
return $i;}
ERROR: ImpureStaticVariable - src/test.php:6:5 -Cannot use a static variable in a mutation-free context
![Page 54: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/54.jpg)
<?php declare(strict_types=1);/** @psalm-pure */function f(int $x): int{ fopen(__FILE__, 'r');
return $x;}
ERROR: ImpureFunctionCall - src/test.php:5:5 -Cannot call an impure function from a mutation-free contextfopen(__FILE__, 'r');
![Page 55: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/55.jpg)
<?php declare(strict_types=1);/** @psalm-immutable */final class Money{ private int $amount;
public function __construct(int $amount) { $this->amount = $amount; }
public function amount(): int { return $this->amount; }
public function setAmount(int $amount) { $this->amount = $amount; }}
ERROR: InaccessibleProperty - src/Money.php:21:9 -Money::$amount is marked readonly$this->amount = $amount;
![Page 56: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/56.jpg)
Tests
![Page 57: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/57.jpg)
https://thephp.cc/termine/2019/06/devtre�-siegburg/richtig-testen
![Page 58: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/58.jpg)
Unit Tests
![Page 59: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/59.jpg)
Test-Driven Development
![Page 60: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/60.jpg)
https://thephp.cc/termine/2019/10/contao-konferenz/richtig-guten-code-schreiben
![Page 61: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/61.jpg)
Domain-Driven Design
![Page 62: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/62.jpg)
Event Storming
![Page 63: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/63.jpg)
![Page 64: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/64.jpg)
Contact
https://thephp.cc
https://talks.thephp.cc
@s_bergmann
![Page 65: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/65.jpg)
Image Credits
"Day of the Tentacle", Copyright 1993 LucasArts
![Page 66: Sebastian Bergmann€¦ · PHP_EOL; Prozedurales Skript, das von "oben nach unten" ausgeührt wird. Prozedurales Skript, das von "oben nach unten" ausgeührt wird Konguration, Datenbankverbindung,](https://reader035.fdocument.pub/reader035/viewer/2022071211/602372cda06ef7662e5da89d/html5/thumbnails/66.jpg)