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 new in PHP 7.4… …and coming up in PHP 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 new in PHP 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 new in PHP 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[ +<?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[<?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"> +<?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[ +<?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[ +<?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[ +<?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[ +<?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>%&lt;&lt;Deprecated("Use xyz instead")>>%</bullet> + <bullet>%&lt;&lt;Jit>>%, %&lt;&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"> +&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> +<?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[ +<?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[ +<?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"> +&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"> +&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> +<?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> +<?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> +<?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> +<?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[ +<?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 { +<?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>