com presentations: Summer talks: php-dpc20.xml php-essex20.xml php-ext-phpfwdays20.xml php-phpnw20.xml slides/internals/extension-why-not-possible.xml slides/internals/extension-why-speed.xml slides/internals/extension-why-wrap.xml slides/internals/php80-attributes-after.xml slides/internals/php80-attributes-attribute-definition.xml slides/internals/php80-attributes-before.xml slides/internals/php80-attributes-syntax.xml slides/internals/php80-at

[email protected] (Derick Rethans) Fri, 21 Aug 2020 10:47:00 +0000
Newsgroups php.pres
Message-ID <[email protected]>
Commit:    b905529e252186a28b0f2fe54ee5c7a6d679d313
Author:    Derick Rethans <[email protected]>         Fri, 21 Aug 2020 11:47:00 +0100
Parents:   67792376ecbfd0ea052eace144e85cfaa7767a8f
Branches:  master

Link:       http://git.php.net/?p=presentations.git;a=commitdiff;h=b905529e252186a28b0f2fe54ee5c7a6d679d313

Log:
Summer talks

Changed paths:
  A  php-dpc20.xml
  M  php-essex20.xml
  A  php-ext-phpfwdays20.xml
  A  php-phpnw20.xml
  M  slides/internals/extension-why-not-possible.xml
  M  slides/internals/extension-why-speed.xml
  M  slides/internals/extension-why-wrap.xml
  A  slides/internals/php80-attributes-after.xml
  A  slides/internals/php80-attributes-attribute-definition.xml
  A  slides/internals/php80-attributes-before.xml
  A  slides/internals/php80-attributes-syntax.xml
  A  slides/internals/php80-attributes-use-cases.xml
  A  slides/internals/php80-cpp-with.xml
  A  slides/internals/php80-cpp-without.xml
  A  slides/internals/php80-jit.xml
  A  slides/internals/php80-match.xml
  A  slides/internals/php80-mixed-types.xml
  A  slides/internals/php80-named-with.xml
  A  slides/internals/php80-named-without.xml
  A  slides/internals/php80-new-catch.xml
  A  slides/internals/php80-null-safe-short-circuit.xml
  A  slides/internals/php80-null-safe.xml
  A  slides/internals/php80-str-functions.xml
  A  slides/internals/php80-trailing-comma-example.xml
  A  slides/internals/php80-union-types-coercive.xml
  A  slides/internals/php80-union-types-examples.xml
  A  slides/internals/php80-union-types-law.xml
  A  slides/internals/php80-union-types-new.xml
  A  slides/internals/php80-union-types-phpdoc.xml
  A  slides/internals/php80-union-types.xml
  A  slides/internals/php80-warning-to-error.xml
  A  slides/internals/php80-weakmap.xml
  M  slides/internals/questions-new.xml
  A  slides/xdebug/analyse-running-script2.xml
  A  slides/xdebug/callgrind-new.png
  M  slides/xdebug/functiontrace-summary.xml
  A  slides/xdebug/php80-when.xml
  A  slides/xdebug/phpstorm-new2.png
  M  slides/xdebug/profiling.xml
  M  slides/xdebug/resources.xml
  A  slides/xdebug/trace-new.png
  M  slides/xdebug/vld-path-4-output.xml
  A  slides/xdebug/xdebug-cloud-coming-soon.png
  A  slides/xdebug/xdebug-cloud.xml
  M  slides/xdebug/xdebug-var-dump.xml
  A  xdebug-seravo20.xml
diff_b905529e252186a28b0f2fe54ee5c7a6d679d313.txt (text/plain, 37.5 KB)
diff --git a/php-dpc20.xml b/php-dpc20.xml
new file mode 100644
index 00000000..7947b1dc
--- /dev/null
+++ b/php-dpc20.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<presentation css="derick.css">
+<topic>PHP</topic>
+<title>What's&#160;new&#160;in&#160;PHP&#160;7.4… …and&#160;coming&#160;up&#160;in&#160;PHP&#160;8</title>
+<event>Dutch PHP Conference</event>
+<location>Virtual Amsterdam, the Netherlands</location>
+<date>June 26th, 2020</date>
+<speaker>Derick Rethans</speaker>
+<email>[email protected]</email>
+<twitter>derickr</twitter>
+<url>https://derickrethans.nl/talks/php-dpc20</url>
+<joindin>https://joind.in/28131</joindin>
+<slide>slides/xdebug/title.xml</slide>
+<slide>slides/mongodb/me.xml</slide>
+
+<!-- TYPES -->
+<slide>slides/internals/php74-typed-properties.xml</slide>
+<slide>slides/internals/php74-typed-properties-read.xml</slide>
+<slide>slides/internals/php74-typed-properties-write.xml</slide>
+<slide>slides/internals/php74-typed-properties-write-coersive.xml</slide>
+<slide>slides/internals/php74-typed-properties-write-strict.xml</slide>
+<slide>slides/internals/php74-variance-return-ok.xml</slide>
+<slide>slides/internals/php74-variance-return-wrong.xml</slide>
+<slide>slides/internals/php74-variance-argument-ok.xml</slide>
+<slide>slides/internals/php74-variance-argument-wrong.xml</slide>
+<slide>slides/internals/php74-variance-properties-ok.xml</slide>
+<slide>slides/internals/php74-variance-properties-wrong.xml</slide>
+
+<slide>slides/internals/php80-union-types.xml</slide>
+<slide>slides/internals/php80-union-types-phpdoc.xml</slide>
+<slide>slides/internals/php80-union-types-new.xml</slide>
+<slide>slides/internals/php80-union-types-examples.xml</slide>
+<slide>slides/internals/php80-trailing-comma-example.xml</slide>
+<slide>slides/internals/php80-union-types-law.xml</slide>
+<slide>slides/internals/php80-union-types-coercive.xml</slide>
+
+Mixed Type v2
+<slide>slides/internals/php80-mixed-types.xml</slide>
+
+Constructor Property Promotion
+<slide>slides/internals/php80-cpp-without.xml</slide>
+<slide>slides/internals/php80-cpp-with.xml</slide>
+
+<slide>slides/internals/php80-named-without.xml</slide>
+<slide>slides/internals/php80-named-with.xml</slide>
+
+Attributes v2
+<slide>slides/internals/php80-attributes-before.xml</slide>
+<slide>slides/internals/php80-attributes-after.xml</slide>
+<slide>slides/internals/php80-attributes-attribute-definition.xml</slide>
+<slide>slides/internals/php80-attributes-use-cases.xml</slide>
+
+Small Fry
+<slide>slides/internals/php80-str-functions.xml</slide>
+<slide>slides/internals/php80-weakmap.xml</slide>
+
+<slide>slides/internals/php80-warning-to-error.xml</slide>
+
+Non-Capturing Catches
+<slide>slides/internals/php80-new-catch.xml</slide>
+
+JIT
+<slide>slides/internals/php80-jit.xml</slide>
+
+<slide>slides/xdebug/php80-when.xml</slide>
+
+<slide>slides/xdebug/phpinternalsnews.xml</slide>
+
+<slide>slides/internals/questions-new.xml</slide>
+<slide>slides/xdebug/resources.xml</slide>
+
+</presentation>
diff --git a/php-essex20.xml b/php-essex20.xml
index 9f12541d..f8451683 100644
--- a/php-essex20.xml
+++ b/php-essex20.xml
@@ -2,7 +2,7 @@
 <presentation css="derick.css">
 <topic>PHP</topic>
 <title>The La(te)st PHP 7 — What's&#160;new&#160;in&#160;PHP&#160;7.4</title>
-<event>PHPMinds</event>
+<event>Essex Web Developers</event>
 <location>Virtual Chemlsford, UK</location>
 <date>April 15th, 2020</date>
 <speaker>Derick Rethans</speaker>
diff --git a/php-ext-phpfwdays20.xml b/php-ext-phpfwdays20.xml
new file mode 100644
index 00000000..d1d25f9a
--- /dev/null
+++ b/php-ext-phpfwdays20.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<presentation css="derick.css">
+<topic>PHP</topic>
+<title>Introduction into PHP Extensions</title>
+<event>PHP fwdays '20</event>
+<location>Virtual Kiev, Ukraine</location>
+<date>May 31st, 2020</date>
+<speaker>Derick Rethans</speaker>
+<email>[email protected]</email>
+<twitter>derickr</twitter>
+<url>https://derickrethans.nl/talks/php-ext-phpfwdays</url>
+<joindin></joindin>
+<slide>slides/xdebug/title.xml</slide>
+<slide>slides/mongodb/me.xml</slide>
+
+<slide>slides/internals/extension-agenda.xml</slide>
+<slide>slides/internals/extension-agenda2.xml</slide>
+<slide>slides/internals/extension-what1.xml</slide>
+<slide>slides/internals/extension-why1.xml</slide>
+<slide>slides/internals/extension-why-wrap.xml</slide>
+<slide>slides/internals/extension-why-not-possible.xml</slide>
+<slide>slides/internals/extension-why-speed.xml</slide>
+
+<slide>slides/internals/extension-why-not1.xml</slide>
+
+<slide>slides/internals/rdp-intro.xml</slide>
+<slide>slides/internals/rdp-intro2.xml</slide>
+<slide>slides/internals/rdp-intro3.xml</slide>
+<slide>slides/internals/rdp-intro4.xml</slide>
+
+<slide>slides/internals/extension-parts.xml</slide>
+<slide>slides/internals/config.m4.xml</slide>
+<slide>slides/internals/config.w32.xml</slide>
+<slide>slides/internals/phpize.xml</slide>
+
+<slide>slides/internals/extension.h.xml</slide>
+<slide>slides/internals/extension.c-part1.xml</slide>
+<slide>slides/internals/extension.c-part2.xml</slide>
+<slide>slides/internals/extension.c-part3.xml</slide>
+
+<slide>slides/internals/function.xml</slide>
+<slide>slides/internals/rdp_simplify-part1.xml</slide>
+<slide>slides/internals/rdp_simplify-zedval.xml</slide>
+<slide>slides/internals/rdp_simplify-part1b.xml</slide>
+<slide>slides/internals/rdp_simplify-convert-data.xml</slide>
+<slide>slides/internals/rdp_simplify-run-algorithm.xml</slide>
+<slide>slides/internals/rdp_simplify-php.xml</slide>
+<slide>slides/internals/rdp_simplify-c.xml</slide>
+<slide>slides/internals/rdp_simplify-return-result.xml</slide>
+<slide>slides/internals/rdp_simplify-return-scalars.xml</slide>
+<slide>slides/internals/memory-management.xml</slide>
+
+<slide>slides/internals/tests.xml</slide>
+<slide>slides/internals/rdp-test.xml</slide>
+
+<slide>slides/internals/debug.xml</slide>
+
+<!--<slide>slides/internals/exercise.xml</slide> -->
+<!--<slide>slides/internals/coordinates.xml</slide> -->
+<!--<slide>slides/internals/exercise-steps.xml</slide> -->
+
+
+<slide>slides/mongodb/questions.xml</slide>
+<slide>slides/mongodb/resources.xml</slide>
+</presentation>
diff --git a/php-phpnw20.xml b/php-phpnw20.xml
new file mode 100644
index 00000000..ae623f6b
--- /dev/null
+++ b/php-phpnw20.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<presentation css="derick.css">
+<topic>PHP</topic>
+<title>What's&#160;new&#160;in&#160;PHP&#160;8</title>
+<event>PHP North West</event>
+<location>Virtual Manchester, United Kingdom</location>
+<date>August 4th, 2020</date>
+<speaker>Derick Rethans</speaker>
+<email>[email protected]</email>
+<twitter>derickr</twitter>
+<url>https://derickrethans.nl/talks/php-phpnw20</url>
+<joindin></joindin>
+<slide>slides/xdebug/title.xml</slide>
+<slide>slides/mongodb/me.xml</slide>
+
+<!-- TYPES -->
+<slide>slides/internals/php74-typed-properties.xml</slide>
+<slide>slides/internals/php74-variance-argument-ok.xml</slide>
+
+<slide>slides/internals/php80-union-types.xml</slide>
+<slide>slides/internals/php80-union-types-phpdoc.xml</slide>
+<slide>slides/internals/php80-union-types-new.xml</slide>
+<slide>slides/internals/php80-union-types-examples.xml</slide>
+<slide>slides/internals/php80-trailing-comma-example.xml</slide>
+<slide>slides/internals/php80-union-types-law.xml</slide>
+<slide>slides/internals/php80-union-types-coercive.xml</slide>
+
+Mixed Type v2
+<slide>slides/internals/php80-mixed-types.xml</slide>
+
+Constructor Property Promotion
+<slide>slides/internals/php80-cpp-without.xml</slide>
+<slide>slides/internals/php80-cpp-with.xml</slide>
+
+<slide>slides/internals/php80-named-without.xml</slide>
+<slide>slides/internals/php80-named-with.xml</slide>
+
+Attributes v2
+<slide>slides/internals/php80-attributes-before.xml</slide>
+<slide>slides/internals/php80-attributes-after.xml</slide>
+<slide>slides/internals/php80-attributes-attribute-definition.xml</slide>
+<slide>slides/internals/php80-attributes-use-cases.xml</slide>
+<slide>slides/internals/php80-attributes-syntax.xml</slide>
+
+New Syntax
+<slide>slides/internals/php80-match.xml</slide>
+<slide>slides/internals/php80-null-safe.xml</slide>
+<slide>slides/internals/php80-null-safe-short-circuit.xml</slide>
+
+Small Fry
+<slide>slides/internals/php80-str-functions.xml</slide>
+<slide>slides/internals/php80-weakmap.xml</slide>
+
+<slide>slides/internals/php80-warning-to-error.xml</slide>
+
+Non-Capturing Catches
+<slide>slides/internals/php80-new-catch.xml</slide>
+
+JIT
+<slide>slides/internals/php80-jit.xml</slide>
+
+<slide>slides/xdebug/php80-when.xml</slide>
+
+<slide>slides/xdebug/phpinternalsnews.xml</slide>
+
+<slide>slides/internals/questions-new.xml</slide>
+<slide>slides/xdebug/resources.xml</slide>
+
+</presentation>
diff --git a/slides/internals/extension-why-not-possible.xml b/slides/internals/extension-why-not-possible.xml
index 4c29dc8b..03c55799 100644
--- a/slides/internals/extension-why-not-possible.xml
+++ b/slides/internals/extension-why-not-possible.xml
@@ -1,4 +1,4 @@
-<slide background="escher.jpg">
+<slide background="escher.jpg" template="black">
 <title>Unpossible in userland</title>
 
 <break lines="3"/>
diff --git a/slides/internals/extension-why-speed.xml b/slides/internals/extension-why-speed.xml
index a1055f5f..e1f85db6 100644
--- a/slides/internals/extension-why-speed.xml
+++ b/slides/internals/extension-why-speed.xml
@@ -1,4 +1,4 @@
-<slide background="tracing.jpg">
+<slide background="tracing.jpg" template="black">
 <title>Speed</title>
 
 <break lines="3"/>
diff --git a/slides/internals/extension-why-wrap.xml b/slides/internals/extension-why-wrap.xml
index d2cbceb2..782d0e4c 100644
--- a/slides/internals/extension-why-wrap.xml
+++ b/slides/internals/extension-why-wrap.xml
@@ -1,4 +1,4 @@
-<slide background="bubble-wrap.jpg" background_attr="https://pixabay.com/en/bubble-wrap-blow-packaging-1183728/ — CC0">
+<slide background="bubble-wrap.jpg" background_attr="https://pixabay.com/en/bubble-wrap-blow-packaging-1183728/ — CC0" template="black">
 <title>Wrapping Libraries</title>
 
 <break lines="3"/>
diff --git a/slides/internals/php80-attributes-after.xml b/slides/internals/php80-attributes-after.xml
new file mode 100644
index 00000000..44329c1e
--- /dev/null
+++ b/slides/internals/php80-attributes-after.xml
@@ -0,0 +1,29 @@
+<slide>
+<title>Attributes</title>
+
+<example inline="2" class="big"><![CDATA[
+&lt;?php
+use Doctrine\ORM\Attributes as ORM;
+
+*@@ORM\Entity*
+class Distillery
+{
+    *@@ORM\Id*
+    *@@ORM\Column("string")*
+    private $name;
+}]]>
+</example>
+
+<div effect="fade-in">
+<example inline="2" class="big"><![CDATA[
+    @@*ORM\Column*("string") // Class Name]]>
+</example>
+</div>
+
+<div effect="fade-in">
+<example inline="2" class="big"><![CDATA[
+    @@ORM\Column(*"string"*) // Constructor Arguments]]>
+</example>
+</div>
+
+</slide>
diff --git a/slides/internals/php80-attributes-attribute-definition.xml b/slides/internals/php80-attributes-attribute-definition.xml
new file mode 100644
index 00000000..ce85ddc3
--- /dev/null
+++ b/slides/internals/php80-attributes-attribute-definition.xml
@@ -0,0 +1,57 @@
+<slide>
+<title>Attributes: Reading</title>
+
+<table class="two">
+<tr><td>
+<example result="0">
+<![CDATA[<?php
+use MyORM\Attributes as ORM;
+
+class Distillery
+{
+    @@ORM\Column("string")
+    private $name;
+}
+]]></example><example><![CDATA[<?php
+namespace MyORM\Attributes;
+use PhpAttribute;
+
+@@PhpAttribute
+class Column {
+    public function __construct(public string $type) {  }
+}
+]]></example><example inline="1"><![CDATA[&lt;?php
+$rc = new \ReflectionClass(\Distillery::class);
+$rp = $rc->getProperty('name');
+
+foreach ($rp->getAttributes() as $attr) {
+    echo "Name: ", $attr->getName(), "\n";
+    var_dump($attr->getArguments());
+    var_dump($attr->*newInstance()*);
+}]]>
+</example>
+</td>
+<td>
+<div effect="fade-in">
+<example>
+Name: MyORM\Attributes\Column
+array(1) {
+  [0]=>
+  string(6) "string"
+}
+object(MyORM\Attributes\Column)#4 (1) {
+  ["type"]=>
+  string(6) "string"
+}
+</example>
+</div>
+
+<div effect="fade-in">
+	<break lines="2"/>
+	<blurb class="big-centre">%*PhpAttribute*%<br/>🠳<br/>%*Attribute*%</blurb>
+</div>
+
+</td>
+</tr>
+</table>
+</slide>
diff --git a/slides/internals/php80-attributes-before.xml b/slides/internals/php80-attributes-before.xml
new file mode 100644
index 00000000..1e6946f0
--- /dev/null
+++ b/slides/internals/php80-attributes-before.xml
@@ -0,0 +1,16 @@
+<slide>
+<title>Attributes</title>
+
+<example class="big">
+&lt;?php
+/** Entity */
+class Distillery
+{
+    /**
+     * @Id
+     * @Column(type=string)
+     */
+    private $name;
+}
+</example>
+</slide>
diff --git a/slides/internals/php80-attributes-syntax.xml b/slides/internals/php80-attributes-syntax.xml
new file mode 100644
index 00000000..a478445d
--- /dev/null
+++ b/slides/internals/php80-attributes-syntax.xml
@@ -0,0 +1,64 @@
+<slide>
+<title>Attribute Syntax</title>
+
+<div effect="fade-out">
+<example inline="2" class="big"><![CDATA[
+&lt;?php
+use Doctrine\ORM\Attributes as ORM;
+
+*&lt;&lt;ORM\Entity>>*
+class Distillery
+{
+    *&lt;&lt;ORM\Id>>*
+    *&lt;&lt;ORM\Column("string")>>*
+    private $name;
+}]]>
+</example>
+</div>
+
+<div effect="fade-in-out">
+<example inline="2" class="big"><![CDATA[
+&lt;?php
+use Doctrine\ORM\Attributes as ORM;
+
+*@@ORM\Entity*
+class Distillery
+{
+    *@@ORM\Id*
+    *@@ORM\Column("string")*
+    private $name;
+}]]>
+</example>
+</div>
+
+<div effect="fade-in-out">
+<example inline="2" class="big"><![CDATA[
+&lt;?php
+use Doctrine\ORM\Attributes as ORM;
+
+*#[ORM\Entity]*
+class Distillery
+{
+    *#[ORM\Id]*
+    *#[ORM\Column("string")]*
+    private $name;
+}]]>
+</example>
+</div>
+
+<div effect="fade-in">
+<example inline="2" class="big"><![CDATA[
+&lt;?php
+use Doctrine\ORM\Attributes as ORM;
+
+*@[ORM\Entity]*
+class Distillery
+{
+    *@[ORM\Id]*
+    *@[ORM\Column("string")]*
+    private $name;
+}]]>
+</example>
+</div>
+
+</slide>
diff --git a/slides/internals/php80-attributes-use-cases.xml b/slides/internals/php80-attributes-use-cases.xml
new file mode 100644
index 00000000..fc35acce
--- /dev/null
+++ b/slides/internals/php80-attributes-use-cases.xml
@@ -0,0 +1,13 @@
+<slide>
+<title>Attributes: Use Cases</title>
+
+<list>
+	<bullet>Replaces phpdoc annotations in Doctrine, Symfony, etc…</bullet>
+	<bullet>May add internal attributes:
+	<list>
+		<bullet>%&amp;lt;&amp;lt;Deprecated("Use xyz instead")>>%</bullet>
+		<bullet>%&amp;lt;&amp;lt;Jit>>%, %&amp;lt;&amp;lt;NoJit>>%</bullet>
+	</list>
+	</bullet>
+</list>
+</slide>
diff --git a/slides/internals/php80-cpp-with.xml b/slides/internals/php80-cpp-with.xml
new file mode 100644
index 00000000..3cc71c22
--- /dev/null
+++ b/slides/internals/php80-cpp-with.xml
@@ -0,0 +1,17 @@
+<slide>
+<title>Constructor Property Promotion</title>
+
+<example inline="1">
+&amp;lt;?php
+class 🥃whisky 
+{
+    function __constructor(
+        *public*    string $name,
+        *protected* Distillery $distillery,
+        *public*    int $age,
+        *private*   ?Bottler $bottler = null*,*
+    ) {}
+}
+</example>
+</slide>
+
diff --git a/slides/internals/php80-cpp-without.xml b/slides/internals/php80-cpp-without.xml
new file mode 100644
index 00000000..d377c455
--- /dev/null
+++ b/slides/internals/php80-cpp-without.xml
@@ -0,0 +1,25 @@
+<slide>
+<title>Constructor Property Promotion</title>
+
+<example>
+&lt;?php
+class 🥃whisky 
+{
+    public    string      $name;
+    protected Distillery  $distillery;
+    public    int         $age;
+    private   ?Bottler    $bottler = null;
+</example>
+<div effect="fade-in">
+<example>
+    function __constructor(string $name, Distillery $distillery, int $age, ?Bottler $bottler)
+    {
+        $this->name = $name;
+        $this->distillery = $distillery;
+        $this->age = $age;
+        $this->bottler = $bottler;
+    }
+</example>
+</div>
+</slide>
+
diff --git a/slides/internals/php80-jit.xml b/slides/internals/php80-jit.xml
new file mode 100644
index 00000000..3e5e7101
--- /dev/null
+++ b/slides/internals/php80-jit.xml
@@ -0,0 +1,14 @@
+<slide>
+<title>Just-In-Time (JIT) Compiler</title>
+
+<list>
+<bullet>Compiles PHP code to x86 machine code</bullet>
+<bullet>Performance improvements mostly apply to math heavy code</bullet>
+<bullet>Part of opcache:
+<example>
+opcache.jit=on
+opcache.jit_buffer_size=128M 
+</example>
+</bullet>
+</list>
+</slide>
diff --git a/slides/internals/php80-match.xml b/slides/internals/php80-match.xml
new file mode 100644
index 00000000..957f32bc
--- /dev/null
+++ b/slides/internals/php80-match.xml
@@ -0,0 +1,51 @@
+<slide>
+<title>Match Expressions</title>
+
+<div effect="fade-out">
+<blurb>%switch% can be cumbersome:</blurb>
+<example inline="2"><![CDATA[
+&lt;?php
+switch ($this->lexer->lookahead['type']) {
+    case Lexer::T_SELECT:
+        $statement = $this->SelectStatement();
+        break;
+ 
+    case Lexer::T_UPDATE:
+        $statement = $this->UpdateStatement();
+        break;
+ 
+    case Lexer::T_DELETE:
+        $statement = $this->DeleteStatement();
+        break;
+ 
+    default:
+        $this->syntaxError('SELECT, UPDATE or DELETE');
+        break;
+}
+]]>
+</example>
+</div>
+
+<div effect="fade-in">
+<blurb>%match% improves this:</blurb>
+<example inline="2"><![CDATA[
+&lt;?php
+$statement = match ($this->lexer->lookahead['type']) {
+    Lexer::T_SELECT => $this->SelectStatement(),
+    Lexer::T_UPDATE => $this->UpdateStatement(),
+    Lexer::T_DELETE => $this->DeleteStatement(),
+    default => $this->syntaxError('SELECT, UPDATE or DELETE'),
+};]]>
+</example>
+</div>
+
+<div effect="fade-in">
+<blurb>Differences with %switch%:</blurb>
+<list>
+<bullet>It is an expression, so returns a value</bullet>
+<bullet>%match% does not do type-juggling</bullet>
+<bullet>No automatic fall through</bullet>
+<bullet>Exception if nothing matched</bullet>
+</list>
+</div>
+</slide>
diff --git a/slides/internals/php80-mixed-types.xml b/slides/internals/php80-mixed-types.xml
new file mode 100644
index 00000000..22f285a7
--- /dev/null
+++ b/slides/internals/php80-mixed-types.xml
@@ -0,0 +1,17 @@
+<slide>
+<break lines="4"/>
+
+<blurb class="big-centre">%mixed%</blurb>
+<blurb class="centre">%array|bool|callable|int|float|null|object|resource|string%</blurb>
+
+<break lines="4"/>
+<list>
+<bullet>Distinguishes between:<list>
+<bullet>I didn't add the type yet</bullet>
+<bullet>It really accepts any value</bullet>
+</list></bullet>
+<bullet>Acts as a union type</bullet>
+<bullet>Follows standard variance rules</bullet>
+<bullet>A missing return type declaration is assumed to be: %*mixed|void*%</bullet>
+</list>
+</slide>
diff --git a/slides/internals/php80-named-with.xml b/slides/internals/php80-named-with.xml
new file mode 100644
index 00000000..5a8d53c8
--- /dev/null
+++ b/slides/internals/php80-named-with.xml
@@ -0,0 +1,29 @@
+<slide>
+<title>Object Instantiation with Named Arguments</title>
+
+<example inline="1">
+&amp;lt;?php
+class Settings
+{
+    function __construct(
+        public $includeDistillery   = true,
+        public $includeDescription  = true,
+        public $includeTastingNotes = false,
+        public $pageSize            = 64,
+        public $sortByField         = 'whisky',
+    ) {}
+}
+</example>
+<div effect="fade-in">
+<blurb>Instantiation with different includes:</blurb>
+<example inline="2">
+$settings = new \Settings(*includeDistillery: false*);
+</example>
+</div>
+<div effect="fade-in">
+<blurb>Instantiation with different sort order:</blurb>
+<example inline="2">
+$settings = new \Settings(*sortByField: 'rating'*);
+</example>
+</div>
+</slide>
diff --git a/slides/internals/php80-named-without.xml b/slides/internals/php80-named-without.xml
new file mode 100644
index 00000000..c6ad9072
--- /dev/null
+++ b/slides/internals/php80-named-without.xml
@@ -0,0 +1,29 @@
+<slide>
+<title>Object Instantiation</title>
+
+<example inline="1">
+&amp;lt;?php
+class Settings
+{
+    function __construct(
+        public $includeDistillery   = true,
+        public $includeDescription  = true,
+        public $includeTastingNotes = false,
+        public $pageSize            = 64,
+        public $sortByField         = 'whisky',
+    ) {}
+}
+</example>
+<div effect="fade-in">
+<blurb>Instantiation with different includes:</blurb>
+<example inline="1">
+$settings = new \Settings(*false*, true, false);
+</example>
+</div>
+<div effect="fade-in">
+<blurb>Instantiation with different sort order:</blurb>
+<example inline="1">
+$settings = new \Settings(true, true, false, 64, *'rating'*);
+</example>
+</div>
+</slide>
diff --git a/slides/internals/php80-new-catch.xml b/slides/internals/php80-new-catch.xml
new file mode 100644
index 00000000..b705da3a
--- /dev/null
+++ b/slides/internals/php80-new-catch.xml
@@ -0,0 +1,23 @@
+<slide>
+<title>Non-Capturing Catches</title>
+
+<break lines="2"/>
+<blurb class="center">Sometimes you don't need the Exception itself:</blurb>
+<break lines="2"/>
+
+<div effect="fade-out">
+<example class="big" inline="2"><![CDATA[try {
+    changeImportantData();
+} catch (PermissionException *$ex*) {
+    echo "You don't have permission to do this";
+}]]></example>
+</div>
+
+<div effect="fade-in">
+<example class="big"><![CDATA[try {
+    changeImportantData();
+} catch (PermissionException) {
+    echo "You don't have permission to do this";
+}]]></example>
+</div>
+</slide>
diff --git a/slides/internals/php80-null-safe-short-circuit.xml b/slides/internals/php80-null-safe-short-circuit.xml
new file mode 100644
index 00000000..8ce196d5
--- /dev/null
+++ b/slides/internals/php80-null-safe-short-circuit.xml
@@ -0,0 +1,14 @@
+<slide>
+<title>Short Circuiting</title>
+
+<blurb>Example:</blurb>
+<example inline="2"><![CDATA[
+$country = $session?->user?->getAddress($session?->format)?->country;
+]]>
+</example>
+
+<div effect="fade-in"><list><bullet>If %$session->format% is %NULL%, %NULL% is passed to %getAddress()%</bullet></list></div>
+<div effect="fade-in"><list><bullet>If %$session->user% is NULL, %getAddress()% is not called</bullet></list></div>
+<div effect="fade-in"><list><bullet>If %getAddress()% returns %NULL%, %$country% is %NULL%</bullet></list></div>
+
+</slide>
diff --git a/slides/internals/php80-null-safe.xml b/slides/internals/php80-null-safe.xml
new file mode 100644
index 00000000..519b6f15
--- /dev/null
+++ b/slides/internals/php80-null-safe.xml
@@ -0,0 +1,30 @@
+<slide>
+<title>Null-safe Operator</title>
+
+<blurb>Checking for %null% at every step:</blurb>
+<example inline="2"><![CDATA[
+$country =  null;
+ 
+if ($session !== null) {
+    $user = $session->user;
+ 
+    if ($user !== null) {
+        $address = $user->getAddress();
+ 
+        if ($address !== null) {
+            $country = $address->country;
+        }
+    }
+}
+]]>
+</example>
+
+<div effect="fade-in">
+<blurb>With null-safe operator %?->%:</blurb>
+<example inline="2"><![CDATA[
+$country = $session?->user?->getAddress()?->country;
+]]>
+</example>
+</div>
+
+</slide>
diff --git a/slides/internals/php80-str-functions.xml b/slides/internals/php80-str-functions.xml
new file mode 100644
index 00000000..872603ad
--- /dev/null
+++ b/slides/internals/php80-str-functions.xml
@@ -0,0 +1,23 @@
+<slide>
+<title>New String Functions</title>
+
+<example>
+&lt;?php
+function str_contains(
+    string $haystack,
+    string $needle
+): bool {}
+
+function str_starts_with(
+    string $haystack,
+    string $needle
+): bool {}
+
+function str_ends_with(
+    string $haystack,
+    string $needle
+): bool {}
+</example>
+
+<blurb class="centre">No multi-byte variants, so use UTF-8</blurb>
+</slide>
diff --git a/slides/internals/php80-trailing-comma-example.xml b/slides/internals/php80-trailing-comma-example.xml
new file mode 100644
index 00000000..709edfeb
--- /dev/null
+++ b/slides/internals/php80-trailing-comma-example.xml
@@ -0,0 +1,21 @@
+<slide>
+<title>Trailing Comma in Function Declaration</title>
+
+<example inline="2">
+function microtime(bool $get_as_float = false*,*): string|float {}
+
+function gettimeofday(bool $return_float = false*,*): array|float {}
+
+function base64_decode(string $str, bool $strict = false*,*): string|false {}
+
+function implode(string|array $glue, array $pieces*,*): string {}
+
+function substr_replace(
+    string|array $str,
+    string|array $replace,
+    $start,
+    $length*,*
+) : string|array|false {}
+
+</example>
+</slide>
diff --git a/slides/internals/php80-union-types-coercive.xml b/slides/internals/php80-union-types-coercive.xml
new file mode 100644
index 00000000..c6e4a8ba
--- /dev/null
+++ b/slides/internals/php80-union-types-coercive.xml
@@ -0,0 +1,23 @@
+<slide>
+<title>Coercive typing mode</title>
+
+<blurb>If the exact type of the value is not part of the union, then the target type is chosen in the following order of preference:</blurb>
+<list>
+<bullet>int</bullet>
+<bullet>float</bullet>
+<bullet>string</bullet>
+<bullet>bool</bullet>
+</list>
+
+<example inline="1">
+// type: *int|string*
+42.0  → 42          // *float* compatible with *int*
+42.1  → 42          // *float* compatible with *int*
+1e100 → "1.0E+100"  // *float* too large for *int* type, fall back to *string*
+INF   → "INF"       // *float* too large for *int* type, fall back to *string*
+true  → 1           // *bool* compatible with *int*
+new ObjectWithToString → "Result of __toString()"
+                    // *object* never compatible with *int*, fall back to *string*
+[]    → *TypeError*   // *array* *not* compatible with *int* or *string*
+</example>
+</slide>
diff --git a/slides/internals/php80-union-types-examples.xml b/slides/internals/php80-union-types-examples.xml
new file mode 100644
index 00000000..fcd342f9
--- /dev/null
+++ b/slides/internals/php80-union-types-examples.xml
@@ -0,0 +1,21 @@
+<slide>
+<title>Union Types — Examples</title>
+
+<example inline="2">
+function microtime(bool $get_as_float = false): *string|float* {}
+
+function gettimeofday(bool $return_float = false): *array|float* {}
+
+function base64_decode(string $str, bool $strict = false): *string|false* {}
+
+function implode(*string|array* $glue, array $pieces): string {}
+
+function substr_replace(
+    *string|array $str*,
+    *string|array $replace*,
+    $start,
+    $length
+) : *string|array|false* {}
+
+</example>
+</slide>
diff --git a/slides/internals/php80-union-types-law.xml b/slides/internals/php80-union-types-law.xml
new file mode 100644
index 00000000..8ac7ea66
--- /dev/null
+++ b/slides/internals/php80-union-types-law.xml
@@ -0,0 +1,19 @@
+<slide>
+<title>Union Types — Rules</title>
+
+<blurb>All support types can be part of a union, with the following caveats:</blurb>
+<list>
+<bullet>*%void%* can't be part of a union type</bullet>
+<bullet>*%?Class%* is equivalent to *%Class|null%*</bullet>
+<bullet>*%false%* is an addition, as it is used in the PHP standard library<br/>e.g.: %*strpos() : int|false%*</bullet>
+<bullet>No redundant types, such as: *%bool|false%*, or: *%object|Whisky%*</bullet>
+</list>
+
+<blurb>Variance:</blurb>
+<list>
+<bullet>Union types follow standard variance rules</bullet>
+<bullet>Order is irrelevant: *%int|string%* and *%string|int%*</bullet>
+<bullet>%*array|Traversable*% is the same as %*iterable*%</bullet>
+</list>
+
+</slide>
diff --git a/slides/internals/php80-union-types-new.xml b/slides/internals/php80-union-types-new.xml
new file mode 100644
index 00000000..e04dbb65
--- /dev/null
+++ b/slides/internals/php80-union-types-new.xml
@@ -0,0 +1,30 @@
+<slide>
+<title>Union Types</title>
+
+<example>
+&lt;?php
+declare(strict_types=1);
+
+class Number {
+
+
+
+    private int|float $number;
+ 
+
+
+
+    public function setNumber(int|float $number) {
+        $this->number = $number;
+    }
+ 
+
+
+
+    public function getNumber() : int|float {
+        return $this->number;
+    }
+}
+</example>
+
+</slide>
diff --git a/slides/internals/php80-union-types-phpdoc.xml b/slides/internals/php80-union-types-phpdoc.xml
new file mode 100644
index 00000000..1e4c6fed
--- /dev/null
+++ b/slides/internals/php80-union-types-phpdoc.xml
@@ -0,0 +1,30 @@
+<slide>
+<title>Union Types</title>
+
+<example>
+&lt;?php
+declare(strict_types=1);
+
+class Number {
+    /**
+     * @var int|float $number
+     */
+    private $number;
+ 
+    /**
+     * @param int|float $number
+     */
+    public function setNumber($number) {
+        $this->number = $number;
+    }
+ 
+    /**
+     * @return int|float
+     */
+    public function getNumber() {
+        return $this->number;
+    }
+}
+</example>
+
+</slide>
diff --git a/slides/internals/php80-union-types.xml b/slides/internals/php80-union-types.xml
new file mode 100644
index 00000000..8e66f8d1
--- /dev/null
+++ b/slides/internals/php80-union-types.xml
@@ -0,0 +1,30 @@
+<slide>
+<title>Union Types</title>
+
+<example>
+&lt;?php
+declare(strict_types=1);
+
+class Number {
+
+
+
+    private $number;
+ 
+
+
+
+    public function setNumber($number) {
+        $this->number = $number;
+    }
+ 
+
+
+
+    public function getNumber() {
+        return $this->number;
+    }
+}
+</example>
+
+</slide>
diff --git a/slides/internals/php80-warning-to-error.xml b/slides/internals/php80-warning-to-error.xml
new file mode 100644
index 00000000..c5e1a94c
--- /dev/null
+++ b/slides/internals/php80-warning-to-error.xml
@@ -0,0 +1,23 @@
+<slide>
+<title>Warning → Error exception</title>
+
+<blurb>Prototype:</blurb>
+<example>function array_fill( int $start_index, int $num, mixed $value ): array|false {}</example>
+
+<blurb>Code:</blurb>
+<example><![CDATA[
+<?php
+try {
+    var_dump(array_fill(0, -100, "foobar"));
+} catch( Throwable $e ) {
+    echo get_class( $e ), ': ', $e->getMessage();
+}
+?>]]></example>
+
+<blurb>PHP 7.4:</blurb>
+<example>Warning: array_fill(): Number of elements can't be negative</example>
+
+<blurb>PHP 8.0:</blurb>
+<example>ValueError: array_fill(): Argument #2 ($num) must be greater than or equal to 0</example>
+
+</slide>
diff --git a/slides/internals/php80-weakmap.xml b/slides/internals/php80-weakmap.xml
new file mode 100644
index 00000000..ba3f4c6e
--- /dev/null
+++ b/slides/internals/php80-weakmap.xml
@@ -0,0 +1,25 @@
+<slide>
+<title>WeakMap</title>
+
+<example inline="2"><![CDATA[
+&lt;?php
+$map = new *WeakMap*;
+$obj = new stdClass;
+
+$map[$obj] = $dataForObj;
+unset($obj); // $obj automatically dropped from WeakMap! 
+]]></example>
+
+<break lines="2"/>
+<blurb class="centre">Use Case</blurb>
+<example><![CDATA[
+class FooBar {
+&lt;?php
+    private WeakMap $cache;
+
+    public function getSomethingWithCaching(object $obj) {
+        return $this->cache[$obj] ??= $this->computeSomethingExpensive($obj);
+    }
+} 
+?>]]></example>
+</slide>
diff --git a/slides/internals/questions-new.xml b/slides/internals/questions-new.xml
index e3f21586..fead865d 100644
--- a/slides/internals/questions-new.xml
+++ b/slides/internals/questions-new.xml
@@ -1,6 +1,4 @@
 <slide style="title" background="queries.jpg" background_attr="Véronique Debord-Lazaro — https://www.flickr.com/photos/debord/4932655275">
 <title>Any Queries?</title>
 
-<audio filename="phpintnews-outro.mp3"/>
-
 </slide>
diff --git a/slides/xdebug/analyse-running-script2.xml b/slides/xdebug/analyse-running-script2.xml
new file mode 100644
index 00000000..4d9cf082
--- /dev/null
+++ b/slides/xdebug/analyse-running-script2.xml
@@ -0,0 +1,5 @@
+<slide>
+<title>Step Debugging</title>
+
+<image filename="phpstorm-new2.png"/>
+</slide>
diff --git a/slides/xdebug/callgrind-new.png b/slides/xdebug/callgrind-new.png
new file mode 100644
index 00000000..64997910
Binary files /dev/null and b/slides/xdebug/callgrind-new.png differ
diff --git a/slides/xdebug/functiontrace-summary.xml b/slides/xdebug/functiontrace-summary.xml
index 6fa0ec9b..8946c3c4 100644
--- a/slides/xdebug/functiontrace-summary.xml
+++ b/slides/xdebug/functiontrace-summary.xml
@@ -2,19 +2,8 @@
 <slide fontsize="6em">
 	<title>Function traces</title>
 
-	<list>
-		<bullet>Different types: *Textual*, *Parsable* and *HTML*</bullet>
-		<bullet>Tracing only parts of an application with *xdebug_start_trace()* and *xdebug_stop_trace()*.</bullet>
-        <bullet>%xdebug.collect_return%:
-<example>
--> explode('/', '/xdebug-phpnw13/11') /home/httpd/pres2/show2.php:121
- >=> array (0 => '', 1 => 'xdebug-phpnw13', 2 => '11')
-                       </example></bullet>
-		<bullet>%xdebug.collect_assignments%:
-<example>
--> ezcTemplateVariableCollection->__set($name = 'slideNr', $value = '11') /home/httpd/pres2/show2.php:202
-   => $this->variables['slideNr'] = '11' /home/derick/dev/zetacomponents/trunk/Template/src/variable_collection.php:134
-</example>
-</bullet>
-	</list>
+	<image filename="trace-new.png"/>
+<break/>
+	<blurb class="center">Different types: *Textual*, *Parsable* and *HTML*</blurb>
+	<blurb class="center">Function and Method Calls, Assignments, Return Values</blurb>
 </slide>
diff --git a/slides/xdebug/php80-when.xml b/slides/xdebug/php80-when.xml
new file mode 100644
index 00000000..1777039f
--- /dev/null
+++ b/slides/xdebug/php80-when.xml
@@ -0,0 +1,14 @@
+<slide>
+<break lines="7"/>
+<blurb class="centre">When is it out?</blurb>
+
+<div effect="fade-in">
+<break lines="1"/>
+<blurb class="big-centre">*November 26th, 2020*</blurb>
+</div>
+
+<div effect="fade-in">
+<break lines="1"/>
+<blurb class="center">(hopefully)</blurb>
+</div>
+</slide>
diff --git a/slides/xdebug/phpstorm-new2.png b/slides/xdebug/phpstorm-new2.png
new file mode 100644
index 00000000..db450275
Binary files /dev/null and b/slides/xdebug/phpstorm-new2.png differ
diff --git a/slides/xdebug/profiling.xml b/slides/xdebug/profiling.xml
index 28004169..fc0eca22 100644
--- a/slides/xdebug/profiling.xml
+++ b/slides/xdebug/profiling.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <slide fontsize="6em">
 	<title>Profiling</title>
-	<subtitle>KCacheGrind's Flat Profile and Call List</subtitle>
-	<image filename="pg1.png"/>
+	<image filename="callgrind-new.png"/>
 
+<break/>
 	<example class="code_large">xdebug.profiler_enable=1          ; enable profiler
 xdebug.profiler_output_dir=/tmp   ; output directory
 xdebug.profiler_output_name=cachegrind.out.%p</example>
diff --git a/slides/xdebug/resources.xml b/slides/xdebug/resources.xml
index 741a0c26..8c39014e 100644
--- a/slides/xdebug/resources.xml
+++ b/slides/xdebug/resources.xml
@@ -7,6 +7,8 @@
 	<blurb class="center">*Slides*</blurb>
 	<blurb class="center">%:-:url:-:%</blurb>
 	<blurb class="center">%:-:joindin:-:%</blurb>
-<break line="2"/>
+<break line="3"/>
+	<blurb class="center">%https://phpinternals.news%</blurb>
+<break line="3"/>
 	<blurb class="center">:-:speaker:-: — @:-:twitter:-: — :-:email:-:</blurb>
 </slide>
diff --git a/slides/xdebug/trace-new.png b/slides/xdebug/trace-new.png
new file mode 100644
index 00000000..3e6e8700
Binary files /dev/null and b/slides/xdebug/trace-new.png differ
diff --git a/slides/xdebug/vld-path-4-output.xml b/slides/xdebug/vld-path-4-output.xml
index 1963557f..831c02bc 100644
--- a/slides/xdebug/vld-path-4-output.xml
+++ b/slides/xdebug/vld-path-4-output.xml
@@ -1,6 +1,6 @@
 <slide>
 <title>Xdebug code coverage output</title>
 
-<iframe width="1431" filename="examples/code-coverage-report/test.php.html"/>
+<iframe zoom="1.5" width="1720" height="900" filename="cov"/>
 
 </slide>
diff --git a/slides/xdebug/xdebug-cloud-coming-soon.png b/slides/xdebug/xdebug-cloud-coming-soon.png
new file mode 100644
index 00000000..ac904cc0
Binary files /dev/null and b/slides/xdebug/xdebug-cloud-coming-soon.png differ
diff --git a/slides/xdebug/xdebug-cloud.xml b/slides/xdebug/xdebug-cloud.xml
new file mode 100644
index 00000000..d7ab188b
--- /dev/null
+++ b/slides/xdebug/xdebug-cloud.xml
@@ -0,0 +1,4 @@
+<slide>
+<image filename="xdebug-cloud-coming-soon.png"/>
+<blurb class="large_center">%https://cloud.xdebug.com%</blurb>
+</slide>
diff --git a/slides/xdebug/xdebug-var-dump.xml b/slides/xdebug/xdebug-var-dump.xml
index 1fe9ba4c..36b6de05 100644
--- a/slides/xdebug/xdebug-var-dump.xml
+++ b/slides/xdebug/xdebug-var-dump.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
-<slide fontsize="6em" style="past">
+<slide fontsize="6em">
 	<title>Pretty Printing Variables</title>
 
 <div effect="fade-out">
-<iframe zoom="1.5" filename="http://whisky/test/xdebug/var_dump.php"/>
+<iframe zoom="2.75" width="1720" height="900" filename="http://192.168.42.104/html/test/xdebug/var_dump.php"/>
 </div>
 <div effect="fade-in">
 	<blurb>Options:</blurb>
diff --git a/xdebug-seravo20.xml b/xdebug-seravo20.xml
new file mode 100644
index 00000000..4e1b0707
--- /dev/null
+++ b/xdebug-seravo20.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<presentation css="derick.css">
+<topic>Debugging</topic>
+<title>Xdebug</title>
+<event>Seravo Webinar</event>
+<location>Online</location>
+<date>August 19th, 2020</date>
+<speaker>Derick Rethans</speaker>
+<email>[email protected]</email>
+<twitter>derickr</twitter>
+<url>https://derickrethans.nl/talks/xdebug-seravo20</url>
+<joindin></joindin>
+<slide>slides/xdebug/title.xml</slide>
+
+<slide>slides/xdebug/xdebug-var-dump.xml</slide>
+<slide>slides/xdebug/functiontrace-summary.xml</slide>
+
+<slide>slides/xdebug/profiling.xml</slide>
+
+<slide>slides/xdebug/vld-path-4-output.xml</slide>
+
+<slide>slides/xdebug/analyse-running-script2.xml</slide>
+<slide>slides/xdebug/focus-on-xdebug.xml</slide>
+The Xdebug Experience
+17 years
+
+<slide>slides/xdebug/focus-on-xdebug3.xml</slide>
+breakpoint behaviour
+New versions (7.4)
+CI
+<!--
+<s lide>slides/xdebug/xdebug-2.8.xml</slide>
+<s lide>slides/xdebug/breakpoint-behaviour.xml</slide>
+-->
+
+<slide>slides/xdebug/cc-speedup.xml</slide>
+
+<slide>slides/xdebug/xdebug-3.xml</slide>
+Code reorganisation
+Modes
+- only do what is needed
+Reduce Configuration Options
+Code Improvements (algorithms, memory, etc)
+<slide>slides/xdebug/modes.xml</slide>
+
+<slide>slides/xdebug/xdebug-cloud.xml</slide>
+
+<!--<s lide>slides/xdebug/phpinternalsnews.xml</slide>-->
+<slide>slides/mongodb/questions.xml</slide>
+<slide>slides/xdebug/resources.xml</slide>
+
+</presentation>