[presentations] master: Commit missing presentations
[email protected] (Derick Rethans) Fri, 18 Jun 2021 12:19:49 +0000
| Newsgroups | php.pres |
|---|---|
| Message-ID | <[email protected]> |
Author: Derick Rethans (derickr) Date: 2021-06-18T13:19:18+01:00 Commit: https://github.com/php/presentations/commit/4287ea354385c4a2a1af476da5e2aa6d0f9c3b31 Raw diff: https://github.com/php/presentations/commit/4287ea354385c4a2a1af476da5e2aa6d0f9c3b31.diff Commit missing presentations Changed paths: A php-confoo21.xml A php-phpday21.xml A slides/internals/ben-ramsey.jpg A slides/internals/patrick-allaert.jpg A slides/internals/php81-auto-capture-multi-statement-closures.xml A slides/internals/php81-enums-1.xml A slides/internals/php81-enums-2.xml A slides/internals/php81-enums-3.xml A slides/internals/php81-enums-4.xml A slides/internals/php81-enums-5.xml A slides/internals/php81-enums-6.xml A slides/internals/php81-enums-7.xml A slides/internals/php81-fibers.xml A slides/internals/php81-final-class-constants.xml A slides/internals/php81-implicit-float-conversions.xml A slides/internals/php81-intl-date-pattern-generator.xml A slides/internals/php81-never-type.xml A slides/internals/php81-new-in-initialisers-locations.xml A slides/internals/php81-new-in-initialisers.xml A slides/internals/php81-null-internal-functions.xml A slides/internals/php81-property-accessors-explicit.xml A slides/internals/php81-property-accessors-implicit.xml A slides/internals/php81-property-accessors-interface.xml A slides/internals/php81-property-accessors.xml A slides/internals/php81-restrict-globals-usage.xml A slides/internals/php81-rms.xml A slides/internals/php81-serializable.xml A slides/internals/php81-static-vars.xml A slides/internals/win311-scaled.jpg A slides/internals/win311.jpg A slides/xdebug/php81-when.xml A xdebug-confoo21.xml A xdebug-phpmad21.xml A xdebug-zagreb21.xml M slides/xdebug/business-support.xml M slides/xdebug/config-settings-3b.xml M slides/xdebug/php80-when.xml M slides/xdebug/resources.xml M slides/xdebug/xdebug-cloud-announcement.xml Diff: diff --git a/php-confoo21.xml b/php-confoo21.xml new file mode 100644 index 00000000..87db1966 --- /dev/null +++ b/php-confoo21.xml @@ -0,0 +1,68 @@ +<?xml version="1.0" encoding="utf-8"?> +<presentation css="derick.css"> +<topic>PHP</topic> +<title>What's new in PHP 8</title> +<event>Confoo 2021</event> +<location>Virtual Montreal, Canada</location> +<date>February 24th, 2021</date> +<speaker>Derick Rethans</speaker> +<email>[email protected]</email> +<twitter>derickr</twitter> +<url>https://derickrethans.nl/talks/php-confoo21</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> +<!--<s lide>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> + +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/php-phpday21.xml b/php-phpday21.xml new file mode 100644 index 00000000..e11c4a0e --- /dev/null +++ b/php-phpday21.xml @@ -0,0 +1,88 @@ +<?xml version="1.0" encoding="utf-8"?> +<presentation css="derick.css"> +<topic>PHP</topic> +<title>What's new in PHP 8.1</title> +<event>phpDay 2021</event> +<location>Virtual Verona, Italy</location> +<date>June 8th, 2021</date> +<speaker>Derick Rethans</speaker> +<email>[email protected]</email> +<twitter>derickr</twitter> +<url>https://derickrethans.nl/talks/php-phpday21</url> +<joindin></joindin> +<slide>slides/xdebug/title.xml</slide> +<slide>slides/mongodb/me.xml</slide> + +<!-- PHP 8.1 RMs --> +<slide>slides/internals/php81-rms.xml</slide> + + +<!-- BIG NEW FEATURES --> +Enumerations (https://wiki.php.net/rfc/enumerations) +<slide>slides/internals/php81-enums-1.xml</slide> +<slide>slides/internals/php81-enums-2.xml</slide> +<slide>slides/internals/php81-enums-3.xml</slide> +<slide>slides/internals/php81-enums-4.xml</slide> +<slide>slides/internals/php81-enums-5.xml</slide> +<slide>slides/internals/php81-enums-6.xml</slide> +<slide>slides/internals/php81-enums-7.xml</slide> + +Fibers (https://wiki.php.net/rfc/fibers) +<slide>slides/internals/php81-fibers.xml</slide> + +<!-- SYNTAX --> +Implemented: +Static Variables in Inherited Methods (https://wiki.php.net/rfc/static_variable_inheritance) +<slide>slides/internals/php81-static-vars.xml</slide> + +Array unpacking with string keys (https://wiki.php.net/rfc/array_unpacking_string_keys) +Noreturn type (https://wiki.php.net/rfc/noreturn_type) (never) +<slide>slides/internals/php81-never-type.xml</slide> + +In voting: +Final class constants (https://wiki.php.net/rfc/final_class_const) +<slide>slides/internals/php81-final-class-constants.xml</slide> + +Still proposed: +New in Initialisers (https://wiki.php.net/rfc/new_in_initializers) +<slide>slides/internals/php81-new-in-initialisers.xml</slide> +<slide>slides/internals/php81-new-in-initialisers-locations.xml</slide> + +Auto-capturing multi-statement closures (https://wiki.php.net/rfc/auto-capture-closure) +<slide>slides/internals/php81-auto-capture-multi-statement-closures.xml</slide> + +Property Accessors (https://wiki.php.net/rfc/property_accessors) +<slide>slides/internals/php81-property-accessors.xml</slide> +<slide>slides/internals/php81-property-accessors-implicit.xml</slide> +<slide>slides/internals/php81-property-accessors-explicit.xml</slide> +<slide>slides/internals/php81-property-accessors-interface.xml</slide> + +<!-- FEATURES --> +Voted in: +Add IntlDatePatternGenerator (https://wiki.php.net/rfc/intldatetimepatterngenerator) +<slide>slides/internals/php81-intl-date-pattern-generator.xml</slide> + +<!-- DEPRECATIONS --> +Implemented: +Restrict $GLOBALS usage (https://wiki.php.net/rfc/restrict_globals_usage) +<slide>slides/internals/php81-restrict-globals-usage.xml</slide> + +Phasing out Serializable (https://wiki.php.net/rfc/phase_out_serializable) +<slide>slides/internals/php81-serializable.xml</slide> + +Deprecate passing null to non-nullable arguments of internal functions (https://wiki.php.net/rfc/deprecate_null_to_scalar_internal_arg) +<slide>slides/internals/php81-null-internal-functions.xml</slide> + +Voted in: +Deprecate implicit non-integer-compatible float to int conversions (https://wiki.php.net/rfc/implicit-float-int-deprecate) +<slide>slides/internals/php81-implicit-float-conversions.xml</slide> + + +<slide>slides/xdebug/php81-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/ben-ramsey.jpg b/slides/internals/ben-ramsey.jpg new file mode 100644 index 00000000..ee49abd1 Binary files /dev/null and b/slides/internals/ben-ramsey.jpg differ diff --git a/slides/internals/patrick-allaert.jpg b/slides/internals/patrick-allaert.jpg new file mode 100644 index 00000000..f2903cd7 Binary files /dev/null and b/slides/internals/patrick-allaert.jpg differ diff --git a/slides/internals/php81-auto-capture-multi-statement-closures.xml b/slides/internals/php81-auto-capture-multi-statement-closures.xml new file mode 100644 index 00000000..cfc67f82 --- /dev/null +++ b/slides/internals/php81-auto-capture-multi-statement-closures.xml @@ -0,0 +1,31 @@ +<slide template="draft"> +<title>Auto-Capture with Statement List</title> + +<div effect="fade-in"> +<blurb>Auto-Capture with Single Expressions</blurb> +<example inline="1"><![CDATA[<?php +$factor = M_PI / 180; + +$adder = *fn* ($x) *=>* $x * $factor; +]]></example> + +<blurb>Manual-Capture with Statement List</blurb> +<example inline="1"><![CDATA[$wordCharacters = 'A-Za-z-'; + +$wordCounter = *function* ($sentence) *use ($wordCharacters)*: int *{* + $sanitised = preg_replace("/[^{$wordCharacters}]/", ' ', $sentence); + $condensed = preg_replace('/\s+/', ' ', $sanitised); + return count(explode(' ', $condensed)); +*}*]]></example> +</div> + +<div effect="fade-in"> +<blurb>Auto-Capture with Statement List</blurb> +<example inline="1"><![CDATA[$wordCounter = *fn* ($sentence): int *{* + $sanitised = preg_replace("/[^{$wordCharacters}]/", ' ', $sentence); + $condensed = preg_replace('/\s+/', ' ', $sanitised); + return count(explode(' ', $condensed)); +*}*]]></example> +</div> + +</slide> diff --git a/slides/internals/php81-enums-1.xml b/slides/internals/php81-enums-1.xml new file mode 100644 index 00000000..daa998ab --- /dev/null +++ b/slides/internals/php81-enums-1.xml @@ -0,0 +1,39 @@ +<slide> +<title>Enumerations</title> + +<div effect="fade-out"> +<blurb class="big-centre">%enum%</blurb> +<blurb class="centre">a data type consisting of a set of named values</blurb> +</div> + +<div effect="fade-in"> +<example><![CDATA[<?php +enum Currency { + case GBP; + case EUR; +}]]></example> +</div> + +<div effect="fade-in"> +<example inline="1"><![CDATA[class Product { + function __construct( + private string $name, private float $amount, private *Currency* $currency) { } +} + +$elephpant = new Product( 'Chilli', 5.50, *Currency::EUR* ); +var_dump( $elephpant ); +]]></example> +</div> + +<div effect="fade-in"> +<example inline="1">class Product#1 (3) { + private string $name => string(6) "Chilli" + private float $amount => double(5.5) + + private *Currency* $currency => + *class Currency*#2 (1) { + public string $name => string(3) "EUR" + } +} </example> +</div> +</slide> diff --git a/slides/internals/php81-enums-2.xml b/slides/internals/php81-enums-2.xml new file mode 100644 index 00000000..e8f79889 --- /dev/null +++ b/slides/internals/php81-enums-2.xml @@ -0,0 +1,25 @@ +<slide> +<title>Enumerations — Typed</title> + +<div> +<example inline="1"><![CDATA[<?php +enum Currency { + case GBP; + case EUR; +} + +class Product { + function __construct( + private string $name, private float $amount, private Currency $currency) { } +} + +$elephpant = new Product( 'Chilli', 5.50, *"EUR"* ); +]]></example> +</div> +<break/> +<div effect="fade-in"> +<example inline="1">*TypeError: Product::__construct(): Argument #3 ($currency) must be of type Currency,* + *string given, called in /tmp/enum-2.php on line 12 in /tmp/enum-2.php on line 8* +</example> +</div> +</slide> diff --git a/slides/internals/php81-enums-3.xml b/slides/internals/php81-enums-3.xml new file mode 100644 index 00000000..aaf5b439 --- /dev/null +++ b/slides/internals/php81-enums-3.xml @@ -0,0 +1,33 @@ +<slide> +<title>Enumerations — Backed</title> + +<div> +<example inline='1'><![CDATA[<?php +enum Currency*: string* { + case GBP *= '£'*; + case EUR = '€'; +} + +class Product { + function __construct( + private string $name, private float $amount, private Currency $currency) { } +} + +$elephpant = new Product( 'Chilli', 5.50, Currency::GBP ); +var_dump( $elephpant );]]></example> +</div> + +<div effect="fade-in"> +<example inline="1">class Product#1 (3) { + private string $name => string(6) "Chilli" + private float $amount => double(5.5) + + private Currency $currency => + class Currency#2 (2) { + public string $name => string(3) "GBP" + public string *$value* => string(2) "£" + } +} +</example> +</div> +</slide> diff --git a/slides/internals/php81-enums-4.xml b/slides/internals/php81-enums-4.xml new file mode 100644 index 00000000..5f9ca432 --- /dev/null +++ b/slides/internals/php81-enums-4.xml @@ -0,0 +1,32 @@ +<slide> +<title>Enumerations — Backed Values</title> + +<div> +<example><![CDATA[<?php +enum Currency: string { + case GBP = '£'; + case EUR = '€'; +}]]></example> +</div> +<break lines="3"/> +<div effect="fade-in-out"> +<blurb>Value Property:</blurb> +<example inline="1">var_dump( Currency::EUR*->value* );</example> +<example class="result">string(3) "€"</example> +</div> + +<div effect="fade-in-out"> +<blurb>Create from Value:</blurb> +<example inline="1">var_dump( Currency*::from('£')* );</example> +<example class="result">class Currency#2 (2) { + public string $name => string(3) "GBP" + public string $value => string(2) "£" +}</example> +</div> + +<div effect="fade-in"> +<blurb>Try Create from Value:</blurb> +<example inline="1">var_dump( Currency*::tryFrom('$')* );</example> +<example class="result">NULL</example> +</div> +</slide> diff --git a/slides/internals/php81-enums-5.xml b/slides/internals/php81-enums-5.xml new file mode 100644 index 00000000..eef883b7 --- /dev/null +++ b/slides/internals/php81-enums-5.xml @@ -0,0 +1,28 @@ +<slide> +<title>Enumerations — Functions</title> + +<div> +<example><![CDATA[<?php +enum Currency: string { + case GBP = '£'; + case EUR = '€'; + + public function format( float $amount ) + { + $pattern = match( $this ) { + Currency::GBP => "{$this->value} %.2f", + Currency::EUR => "%.2f {$this->value}", + }; + + return sprintf( $pattern, $amount ); + } +}]]></example> +</div> + +<div effect="fade-in"> +<blurb>Calling Methods:</blurb> +<example inline="1">$cur = Currency::GBP; +echo $cur->format( 42.75 );</example> +<example class="result">£ 42.75</example> +</div> +</slide> diff --git a/slides/internals/php81-enums-6.xml b/slides/internals/php81-enums-6.xml new file mode 100644 index 00000000..d5a0d80a --- /dev/null +++ b/slides/internals/php81-enums-6.xml @@ -0,0 +1,27 @@ +<slide> +<title>Enumerations — Static Methods</title> + +<div> +<example><![CDATA[<?php +enum Currency: string { + case GBP = '£'; + case EUR = '€'; + + static public function fromLocale( string $locale ) + { + return match( $locale ) { + 'nl_NL' => static::EUR, + 'it_IT' => static::EUR, + 'uk_GB' => static::GBP, + }; + } +}]]></example> +</div> + +<div effect="fade-in"> +<blurb>Alternative Constructor:</blurb> +<example inline="1">$cur = Currency::fromLocale( 'it_IT' ); +echo $cur->value, "\n";</example> +<example class="result">€</example> +</div> +</slide> diff --git a/slides/internals/php81-enums-7.xml b/slides/internals/php81-enums-7.xml new file mode 100644 index 00000000..76dab8f1 --- /dev/null +++ b/slides/internals/php81-enums-7.xml @@ -0,0 +1,29 @@ +<slide> +<title>Enumerations — Value Listing</title> + +<div> +<example><![CDATA[<?php +enum Currency: string { + case GBP = '£'; + case EUR = '€'; +}]]></example> +</div> + +<break lines="3"/> + +<div effect="fade-in"> +<blurb>List Cases:</blurb> +<example inline="1">var_dump( Currency::cases() );</example> +<example class="result" inline="1">array(2) { + [0] => *class* Currency#1 (2) { + public string $name => string(3) "GBP" + public string $value => string(2) "£" + } + [1] => class Currency#2 (2) { + public string $name => string(3) "EUR" + public string $value => string(3) "€" + } +} +</example> +</div> +</slide> diff --git a/slides/internals/php81-fibers.xml b/slides/internals/php81-fibers.xml new file mode 100644 index 00000000..477ba5ce --- /dev/null +++ b/slides/internals/php81-fibers.xml @@ -0,0 +1,11 @@ +<slide> +<title>Fibers</title> + +<blurb class="big-centre">Co-operative Multi-Tasking</blurb> + +<div effect="fade-in"> +<break lines="2"/> +<image filename='win311-scaled.jpg'/> +</div> + +</slide> diff --git a/slides/internals/php81-final-class-constants.xml b/slides/internals/php81-final-class-constants.xml new file mode 100644 index 00000000..0e6cbb86 --- /dev/null +++ b/slides/internals/php81-final-class-constants.xml @@ -0,0 +1,25 @@ +<slide template="draft"> +<title>Final Class Constants</title> + +<blurb class="centre">Currently, class constants are always overridable by child classes</blurb> + +<example inline="1"><![CDATA[<?php +class Universe +{ + *final* public const SPEED_OF_LIGHT = 299_458_792; +}]]></example> + +<div effect="fade-in"> +<example inline="1"><![CDATA[class RingSpace extends Universe +{ + public const SPEED_OF_LIGHT = 12_758; +} +]]></example> + +<example class="result"> +Fatal error: RingSpace::SPEED_OF_LIGHT cannot override + final constant Universe::SPEED_OF_LIGHT +</example> +</div> + +</slide> diff --git a/slides/internals/php81-implicit-float-conversions.xml b/slides/internals/php81-implicit-float-conversions.xml new file mode 100644 index 00000000..1847efef --- /dev/null +++ b/slides/internals/php81-implicit-float-conversions.xml @@ -0,0 +1,40 @@ +<slide> +<title>Implicit Non-Integer-Compatible Float to Int Conversion</title> + +<blurb>Integer Compatible Floats</blurb> + +<list> + <bullet>It is a number (---NaN--- or ---INF---)</bullet> + <bullet>It is in range of a PHP integer:<br/>%(PHP_INT_MIN >= $float >= PHP_INT_MAX)%</bullet> + <bullet>Has no fractional part (42---.76---)</bullet> +</list> + +<break lines="2"/> + +<div effect="fade-out"> +<blurb>In PHP 8.0:</blurb> +<example><![CDATA[<?php +function doTheNumber(int $number) +{ + var_dump( $number ); +} + +doTheNumber( 42.76 );]]></example> +<example class="result">int(42)</example> +</div> + +<div effect="fade-in"> +<blurb>In PHP 8.1:</blurb> +<example><![CDATA[<?php +function doTheNumber(int $number) +{ + var_dump( $number ); +} + +doTheNumber( 42.76 );]]></example> +<example class="result"> +Deprecated: Implicit conversion from non-compatible float-string "42.76" to int +int(42)</example> +</div> + +</slide> diff --git a/slides/internals/php81-intl-date-pattern-generator.xml b/slides/internals/php81-intl-date-pattern-generator.xml new file mode 100644 index 00000000..48923e85 --- /dev/null +++ b/slides/internals/php81-intl-date-pattern-generator.xml @@ -0,0 +1,88 @@ +<slide template="draft"> +<title>IntlDatePatternGenerator</title> + +<div effect="fade-out"> +<example><![CDATA[<?php +use IntlDateFormatter as IDF; + +$now = new \DateTimeImmutable; +$locale = 'en_US'; + +echo 'Short: ', IDF::formatObject($now, [ IDF::SHORT, IDF::NONE ], $locale), "\n"; +echo 'Medium: ', IDF::formatObject($now, [ IDF::MEDIUM, IDF::NONE ], $locale), "\n"; +echo 'Long: ', IDF::formatObject($now, [ IDF::LONG, IDF::NONE ], $locale), "\n"; +echo 'Manual: ', $now->format( 'n/d/Y' ), "\n"; +]]></example> +<example class="result"> +Short: 5/31/21 +Medium: May 31, 2021 +Long: May 31, 2021 +Manual: 5/31/2021 +</example> +</div> + +<div effect="fade-in-out"> +<example inline="1"><![CDATA[<?php +use IntlDateFormatter as IDF; + +$now = new \DateTimeImmutable; +$locale = *'it_IT'*; + +echo 'Short: ', IDF::formatObject($now, [ IDF::SHORT, IDF::NONE ], $locale), "\n"; +echo 'Medium: ', IDF::formatObject($now, [ IDF::MEDIUM, IDF::NONE ], $locale), "\n"; +echo 'Long: ', IDF::formatObject($now, [ IDF::LONG, IDF::NONE ], $locale), "\n"; +echo 'Manual: ', $now->format( 'n/d/Y' ), "\n"; +]]></example> +<example inline="1" class="result"> +Short: 30/05/21 +Medium: 30 mag 2021 +Long: 30 maggio 2021 +Manual: ---5/30/2021--- + 30/05/2021 +</example> +</div> + +<div effect="fade-in-out"> +<example inline="1"><![CDATA[<?php +use IntlDateFormatter as IDF; + +$now = new \DateTimeImmutable; + +$locale = 'it_IT'; +*$skeleton = 'YYYYMMdd';* + +$dtpg = new *\IntlDatePatternGenerator*($locale); +$pattern = $dtpg->getBestPattern($skeleton), "\n"; + +echo 'Correct: ', IDF::formatObject($now, *$pattern*, $locale), "\n"; +]]></example> +<example inline="1" class="result"> +Correct: 30/05/2021 +</example> +</div> + +<div effect="fade-in"> +<example inline="1"><![CDATA[<?php +use IntlDateFormatter as IDF; + +$now = new \DateTimeImmutable; + +$locale = *'en_US'*; +$skeleton = 'YYYYMMdd'; + +$dtpg = new \IntlDatePatternGenerator($locale); +$pattern = $dtpg->getBestPattern($skeleton), "\n"; + +echo 'Correct: ', IDF::formatObject($now, $pattern, $locale), "\n"; +]]></example> +<example inline="1" class="result"> +Correct: *05/30/2021* +</example> +</div> + +<div effect="fade-in"> +<break lines="3"/> +<blurb class="big-centre">"Correct" 🤔</blurb> +</div> + +</slide> diff --git a/slides/internals/php81-never-type.xml b/slides/internals/php81-never-type.xml new file mode 100644 index 00000000..5eabbf0b --- /dev/null +++ b/slides/internals/php81-never-type.xml @@ -0,0 +1,31 @@ +<slide> +<title>The 'never' Type</title> + +<blurb>Explicitly mark a function that it never returns:</blurb> +<example inline="1"><![CDATA[<?php +function redirect(string $uri): *never* { + header('Location: ' . $uri); + exit(); +} +]]></example> + +<div effect="fade-in"> +<break lines="2"/> + +<blurb>Or implicitily:</blurb> +<example>function redirectToLoginPage(): never { + redirect('/login'); +}</example> +</div> + +<div effect="fade-in"> +<break lines="2"/> + +<blurb>Remarks:</blurb> +<list> +<bullet>Just like %void%, only as a return type</bullet> +<bullet>It is a *bottom* type</bullet> +</list> +</div> + +</slide> diff --git a/slides/internals/php81-new-in-initialisers-locations.xml b/slides/internals/php81-new-in-initialisers-locations.xml new file mode 100644 index 00000000..c86a750c --- /dev/null +++ b/slides/internals/php81-new-in-initialisers-locations.xml @@ -0,0 +1,31 @@ +<slide template="draft"> +<title>New in Initialisers — Where?</title> + +<div effect="fade-in"> +<blurb>Static variables:</blurb> +<example inline="1"><![CDATA[<?php +function counter() +{ + static $i = *new* Counter; +}]]></example> +</div> + +<div effect="fade-in"> +<blurb>Constants:</blurb> +<example inline="1"><![CDATA[<?php +class Repository +{ + const DB = *new* DatabaseLink(dsn: 'sqlite://:memory:'); +}]]></example> +</div> + +<div effect="fade-in"> +<blurb>(Nested) Attributes:</blurb> +<example inline="1"><![CDATA[<?php +#[Constraint(*new Tries(3)*)] +class Login +{ +}]]></example> +</div> + +</slide> diff --git a/slides/internals/php81-new-in-initialisers.xml b/slides/internals/php81-new-in-initialisers.xml new file mode 100644 index 00000000..20b81732 --- /dev/null +++ b/slides/internals/php81-new-in-initialisers.xml @@ -0,0 +1,42 @@ +<slide template="draft"> +<title>New in Initialisers</title> + +<blurb>In PHP 8.0:</blurb> + +<example inline="1"><![CDATA[<?php +class Roci { + private Logger $logger; + + public function __construct( ?Logger $logger = null ) + { + $this->logger = $logger ?? new NullLogger; + } +}]]></example> + +<blurb>From PHP 8.1:</blurb> + +<div effect="fade-in-out"> +<example inline="1"><![CDATA[<?php +class Roci { + public function __construct( + private Logger $logger = *new* NullLogger) {} +}]]></example> +</div> + +<div effect="fade-in-out"> +<example inline="1"><![CDATA[<?php +class Roci { + public function __construct( + private Logger $logger = new FileLogger('/tmp/my-log.log')) {} +}]]></example> +</div> + +<div effect="fade-in"> +<example inline="1"><![CDATA[<?php +class Roci { + public function __construct( + private Logger $logger = new FileLogger(directory: '/tmp/logs')) {} +}]]></example> +</div> + +</slide> diff --git a/slides/internals/php81-null-internal-functions.xml b/slides/internals/php81-null-internal-functions.xml new file mode 100644 index 00000000..a950d336 --- /dev/null +++ b/slides/internals/php81-null-internal-functions.xml @@ -0,0 +1,29 @@ +<slide> +<title>Null to Non-Nullable Arguments for Internal Functions</title> + +<blurb>Internal Function:</blurb> +<example><![CDATA[var_dump(str_contains("foobar", null));]]></example> +<example class="result">bool(null)</example> + +<div effect="fade-in-out"> +<break/> +<blurb>User Function:</blurb> +<example><![CDATA[function my_str_contains(string $haystack, string $needle): bool { + return false !== strpos($haystack, $needle); +} + +var_dump(my_str_contains("foobar", null));]]></example> +<example class="result">TypeError: my_str_contains(): Argument #2 ($needle) must be of type string, null given</example> +</div> + +<div effect="fade-in"> +<break lines="3"/> +<list> + <bullet>PHP 8.1 will start throwing a deprecation warning:<br/> + <example class="result">Deprecated: Passing null to argument of type string is deprecated</example></bullet> + <bullet>PHP 9.0 will then make this a %TypeError%:<br/> + <example class="result">TypeError: str_contains(): Argument #2 ($needle) must be of type string, null given</example></bullet> +</list> +</div> + +</slide> diff --git a/slides/internals/php81-property-accessors-explicit.xml b/slides/internals/php81-property-accessors-explicit.xml new file mode 100644 index 00000000..618c0af5 --- /dev/null +++ b/slides/internals/php81-property-accessors-explicit.xml @@ -0,0 +1,25 @@ +<slide template="draft"> +<title>Explicit Property Accessors</title> + +<example inline="1"><![CDATA[<?php +class Whisky { + *private* string *$_name*; + + public string $name { + *get {* + return $this->_name; + *}* + *set* { + if (*$value* === '') { + thrown new ValueError('Name must be non-empty'); + } + $this->_name = $value; + } + } + + public function __construct(string $name) { + $this->name = $name; + } +}]]></example> + +</slide> diff --git a/slides/internals/php81-property-accessors-implicit.xml b/slides/internals/php81-property-accessors-implicit.xml new file mode 100644 index 00000000..de5e07fc --- /dev/null +++ b/slides/internals/php81-property-accessors-implicit.xml @@ -0,0 +1,21 @@ +<slide template="draft"> +<title>Implicit Property Accessors</title> + +<blurb>Standard Visibility</blurb> +<example inline="1"><![CDATA[<?php +class Whisky { + public string $name { *get;* *set;* } +]]></example> + +<div effect="fade-in"> +<blurb>Read-Only</blurb> +<example inline="1"><![CDATA[ public string $distillery { *get;* }]]></example> +</div> + +<div effect="fade-in"> +<blurb>Asymetric Visibility</blurb> +<example inline="1"><![CDATA[ public float $abv { get; *private set;* } +}]]></example> +</div> + +</slide> diff --git a/slides/internals/php81-property-accessors-interface.xml b/slides/internals/php81-property-accessors-interface.xml new file mode 100644 index 00000000..d336d6ff --- /dev/null +++ b/slides/internals/php81-property-accessors-interface.xml @@ -0,0 +1,47 @@ +<slide template="draft"> +<title>Property Accessors</title> + +<div effect="fade-out"> +<blurb>Interfaces:</blurb> +<example inline="1"><![CDATA[<?php +interface Namer { + public string $name { *get;* } +} + +class Whisky implements Namer { + public string $name; +}]]></example> +</div> + +<div effect="fade-in-out"> +<blurb>Inheritance:</blurb> +<example><![CDATA[<?php +class Whisky { + public $name { + get { echo __METHOD__, "\n"; } + set { echo __METHOD__, "\n"; } + } +} + +class SingleMalt { + public $name { + set { echo __METHOD__, "\n"; } + } +}]]></example> +</div> + +<div effect="fade-in"> +<blurb>Variance:</blurb> +<example inline="1"><![CDATA[<?php +class Whisky { + public int|string $invariant { get; set; } + public int|string $covariant { get; } +} + +class SingleMalt { + public int $invariant; // Illegal + public string $covariant; +}]]></example> +</div> + +</slide> diff --git a/slides/internals/php81-property-accessors.xml b/slides/internals/php81-property-accessors.xml new file mode 100644 index 00000000..f4313e56 --- /dev/null +++ b/slides/internals/php81-property-accessors.xml @@ -0,0 +1,60 @@ +<slide template="draft"> +<title>Property Accessors</title> + +<div effect="fade-out"> +<blurb>PHP 7.3:</blurb> +<example inline="1"><![CDATA[<?php +class Whisky { + private $name; + + public function __construct(*string* $name) { + $this->name = $name; + } + + public function getName(): *string* { + return $this->name; + } + + public function setName(*string* $name): void { + $this->name = $name; + } +}]]></example> +</div> + +<div effect="fade-in-out"> +<blurb>PHP 7.4:</blurb> +<example inline="1"><![CDATA[<?php +class Whisky { + public *string* $name; + + public function __construct(string $name) { + $this->name = $name; + } +}]]></example> +</div> + +<div effect="fade-in"> +<blurb>PHP 8.0:</blurb> +<example inline="1"><![CDATA[<?php +class Whisky { + public function __construct(*public* string $name) { + } +}]]></example> +</div> + +<div effect="fade-in"> +<blurb class="centre">Now also make sure it can't be empty 😭</blurb> +</div> +<div effect="fade-in"> +<blurb class="centre">… and read only 😭😭😭😭</blurb> +</div> + +<div effect="fade-in"> +<blurb>Options:</blurb> +<list> + <bullet>Going back to explicit setters/getters</bullet> + <bullet>Introduce magic %__get()%, %__set()%, and %__isset()%</bullet> +</list> +</div> + +</slide> diff --git a/slides/internals/php81-restrict-globals-usage.xml b/slides/internals/php81-restrict-globals-usage.xml new file mode 100644 index 00000000..a4609dad --- /dev/null +++ b/slides/internals/php81-restrict-globals-usage.xml @@ -0,0 +1,44 @@ +<slide> +<title>Changes to $GLOBALS</title> + +<div effect="fade-out"> +<blurb>%$GLOBALS% uses INDIRECT variables:</blurb> +<example><![CDATA[<?php +$a = 1; +$GLOBALS['a'] = 2; +var_dump($a);]]></example> +<example class="result">int(2)</example> +</div> + +<div effect="fade-in-out"> +<blurb>%$GLOBALS% are by-ref:</blurb> +<example><![CDATA[<?php +$a = 1; +$globals = $GLOBALS; +$globals['a'] = 2; +var_dump($a);]]></example> +<example class="result">int(2)</example> +</div> + +<div effect="fade-in"> +<break lines="2"/> +<blurb class="centre">Writes to %$GLOBALS% as a whole are no longer supported</blurb> +<break lines="2"/> +<blurb>Generates compile-time error:</blurb> +<example> +$GLOBALS = []; +$GLOBALS += []; +</example> +<break lines="2"/> +<blurb>This no longer modifies %$a%:</blurb> +<example> +$a = 4; +$globals = $GLOBALS; +$globals['a'] = 1; + +var_dump($a); +</example> +<example class="result">int(4)</example> +</div> + +</slide> diff --git a/slides/internals/php81-rms.xml b/slides/internals/php81-rms.xml new file mode 100644 index 00000000..4cbf4895 --- /dev/null +++ b/slides/internals/php81-rms.xml @@ -0,0 +1,19 @@ +<slide> +<title>Meet the PHP 8.1 Release Managers</title> + +<break lines="4"/> +<table> +<tr> +<td><image filename="patrick-allaert.jpg"/></td> +<td><image filename="ben-ramsey.jpg"/></td> +</tr> +<tr> +<td><break lines="2"/></td> +<td></td> +</tr> +<tr> +<td>Patrick Allaert</td> +<td>Ben Ramsey</td> +</tr> +</table> +</slide> diff --git a/slides/internals/php81-serializable.xml b/slides/internals/php81-serializable.xml new file mode 100644 index 00000000..7a783e62 --- /dev/null +++ b/slides/internals/php81-serializable.xml @@ -0,0 +1,57 @@ +<slide> +<title>Phasing out Serializable interface</title> + +<div effect="fade-out"> +<blurb>The Serializable mechanism has issues:</blurb> + +<example><![CDATA[<?php +class 🔥 implements Serializable +{ + private $temperature; + + public function serialize() { + return serialize($this->temperature); + } + public function unserialize($payload) { + $this->temperature = unserialize($payload); + } +}]]></example> + +<list> + <bullet>State is required between nested calls with %parent::serialize%</bullet> + <bullet>There is no requirement for what *is* used in %serialize%/%unserialize%</bullet> +</list> +</div> + +<div effect="fade-in-out"> +<blurb>PHP 7.4 introduced a new serializing mechanism through magic methods, with a stricter set of guarantees:</blurb> +<example><![CDATA[<?php +class 🔥 +{ + private $temperature; + + public function __serialize(): array { + return ["t" => $this->temperature]; + } + public function __unserialize(array $data) { + $this->temperature = $data['t']; + } +}]]></example> +</div> + +<div effect="fade-in"> +<break lines="2"/> +<blurb>PHP 8.1 starts the removal process of "only %Serializable%" classes:</blurb> +</div> + +<div effect="fade-in"> +<break lines="2"/> +<list><bullet>In PHP 8.1, implementing %Serializable% will throw a deprecation warning</bullet></list> +</div> + +<div effect="fade-in"> +<break lines="2"/> +<list><bullet>In PHP 9.0, the %Serializable% interface will be removed, and %unserialize% will stop understanding its serialisation format</bullet></list> +</div> + +</slide> diff --git a/slides/internals/php81-static-vars.xml b/slides/internals/php81-static-vars.xml new file mode 100644 index 00000000..45104598 --- /dev/null +++ b/slides/internals/php81-static-vars.xml @@ -0,0 +1,26 @@ +<slide> +<title>Static Variables in Inherited Methods</title> + +<example><![CDATA[<?php +class A { + public static function counter() { + static $i = 0; + return ++$i; + } +} +class B extends A {} + +echo A::counter(), ' ', + A::counter(), ' ', + B::counter(), ' ', + B::counter(); +]]></example> + +<blurb>PHP 8.0:</blurb> +<example>1 2 1 2</example> + +<div effect="fade-in"> +<blurb>PHP 8.1:</blurb> +<example>1 2 3 4</example> +</div> +</slide> diff --git a/slides/internals/win311-scaled.jpg b/slides/internals/win311-scaled.jpg new file mode 100644 index 00000000..b1401994 Binary files /dev/null and b/slides/internals/win311-scaled.jpg differ diff --git a/slides/internals/win311.jpg b/slides/internals/win311.jpg new file mode 100644 index 00000000..6f0a22c6 Binary files /dev/null and b/slides/internals/win311.jpg differ diff --git a/slides/xdebug/business-support.xml b/slides/xdebug/business-support.xml index 2c34f7a9..103a8144 100644 --- a/slides/xdebug/business-support.xml +++ b/slides/xdebug/business-support.xml @@ -8,7 +8,8 @@ <break/> <blurb class="centre"> -Seravo  —  CHECK24  —  Private Packagist  —  Supermetrics  —  Intracto  —  Strategery  —  e3N  —  Automattic  —  JetBrains  —  TYPO3 GmbH  —  Tideways +Intracto — Private Packagist — Edmonds Commerce — Find My Electric — Tideways — TYPO3 GmbH — +Seravo — CHECK24 — Supermetrics </blurb> </slide> diff --git a/slides/xdebug/config-settings-3b.xml b/slides/xdebug/config-settings-3b.xml index 2f197a22..75ea942f 100644 --- a/slides/xdebug/config-settings-3b.xml +++ b/slides/xdebug/config-settings-3b.xml @@ -6,7 +6,7 @@ <td> <example inline="2"> xdebug.cli_color -xdebug.cloud.userid +|0000ff|xdebug.cloud_id| xdebug.collect_assignments xdebug.collect_return xdebug.dump.COOKIE @@ -33,14 +33,14 @@ xdebug.max_nesting_level </example></td><td><example inline="2"> xdebug.max_stack_frames |ff0000|xdebug.mode| -xdebug.output_dir +|00ff00|xdebug.output_dir| xdebug.profiler_append xdebug.profiler_output_name xdebug.remote_addr_header -xdebug.remote_connect_back xdebug.remote_cookie_expire_time -xdebug.remote_host -xdebug.remote_port +|0000ff|xdebug.discover_client_host| +|0000ff|xdebug.client_host| +|0000ff|xdebug.remote_port| xdebug.remote_timeout xdebug.scream xdebug.show_error_trace diff --git a/slides/xdebug/php80-when.xml b/slides/xdebug/php80-when.xml index 1777039f..edbb243d 100644 --- a/slides/xdebug/php80-when.xml +++ b/slides/xdebug/php80-when.xml @@ -1,14 +1,9 @@ <slide> <break lines="7"/> -<blurb class="centre">When is it out?</blurb> +<blurb class="centre">When was it released?</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/php81-when.xml b/slides/xdebug/php81-when.xml new file mode 100644 index 00000000..eee1c90c --- /dev/null +++ b/slides/xdebug/php81-when.xml @@ -0,0 +1,12 @@ +<slide> +<break lines="7"/> +<blurb class="centre">When is available?</blurb> + +<div effect="fade-in"> +<break lines="1"/> +<blurb class="big-centre">*November 25th, 2021*</blurb> +</div> +<div effect="fade-in"> +<blurb class="center">(maybe)</blurb> +</div> +</slide> diff --git a/slides/xdebug/resources.xml b/slides/xdebug/resources.xml index 8c39014e..cf61f2fd 100644 --- a/slides/xdebug/resources.xml +++ b/slides/xdebug/resources.xml @@ -7,6 +7,7 @@ <blurb class="center">*Slides*</blurb> <blurb class="center">%:-:url:-:%</blurb> <blurb class="center">%:-:joindin:-:%</blurb> + <blurb class="center">%https://xdebug.cloud%</blurb> <break line="3"/> <blurb class="center">%https://phpinternals.news%</blurb> <break line="3"/> diff --git a/slides/xdebug/xdebug-cloud-announcement.xml b/slides/xdebug/xdebug-cloud-announcement.xml index 55a93926..1f26b1d1 100644 --- a/slides/xdebug/xdebug-cloud-announcement.xml +++ b/slides/xdebug/xdebug-cloud-announcement.xml @@ -1,6 +1,6 @@ <slide> <video width="1800" height="900" filename="xdebug-cloud-animation.webm"/> <div effect="fade-in"> -<blurb class="big-centre">%cloud.xdebug.com%</blurb> +<blurb class="big-centre">%https://xdebug.cloud%</blurb> </div> </slide> diff --git a/xdebug-confoo21.xml b/xdebug-confoo21.xml new file mode 100644 index 00000000..1cdc9e96 --- /dev/null +++ b/xdebug-confoo21.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="utf-8"?> +<presentation css="derick.css"> +<topic>Debugging</topic> +<title>Xdebug 3</title> +<event>Confoo 2021</event> +<location>Virtual Montréal, Canada</location> +<date>February 25th, 2021</date> +<speaker>Derick Rethans</speaker> +<email>[email protected]</email> +<twitter>derickr</twitter> +<url>https://derickrethans.nl/talks/xdebug-confoo21</url> +<joindin>https://xdebug.org</joindin> +<slide>slides/xdebug/title.xml</slide> +<slide>slides/mongodb/me.xml</slide> + +<slide>slides/xdebug/focus-on-xdebug.xml</slide> +The Xdebug Experience +17 years + +<slide>slides/xdebug/xdebug-slow.xml</slide> + +<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/test-with-many-versions.xml</slide> +<slide>slides/xdebug/xdebug-ci.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/code-reorgnisation.xml</slide> +<slide>slides/xdebug/modes.xml</slide> +<slide>slides/xdebug/config-settings-3.xml</slide> +<slide>slides/xdebug/config-settings-3b.xml</slide> + +<slide>slides/xdebug/xdebug-hard.xml</slide> +<!-- <s lide>slides/xdebug/connect1.xml</slide> --> +<!-- <s lide>slides/xdebug/connect2.xml</slide> --> +<slide>slides/xdebug/debugger-activation.xml</slide> +<slide>slides/xdebug/debugger-connection-log.xml</slide> +<slide>slides/xdebug/diagnostic-log.xml</slide> + +<slide>slides/xdebug/xdebug-3-speedup-1.xml</slide> + +<slide>slides/xdebug/xdebug-cloud-announcement.xml</slide> + +<slide>slides/xdebug/donate.xml</slide> +<slide>slides/xdebug/business-support.xml</slide> +<slide>slides/xdebug/transparency.xml</slide> + + +<slide>slides/xdebug/phpinternalsnews.xml</slide> +<slide>slides/mongodb/questions.xml</slide> +<slide>slides/xdebug/resources.xml</slide> + +</presentation> diff --git a/xdebug-phpmad21.xml b/xdebug-phpmad21.xml new file mode 100644 index 00000000..84eb84f0 --- /dev/null +++ b/xdebug-phpmad21.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="utf-8"?> +<presentation css="derick.css"> +<topic>Debugging</topic> +<title>Xdebug on the way to time traveling</title> +<event>PHPMad March 2021</event> +<location>Virtual Madrid, Spain</location> +<date>March 3rd, 2021</date> +<speaker>Derick Rethans</speaker> +<email>[email protected]</email> +<twitter>derickr</twitter> +<url>https://derickrethans.nl/talks/xdebug-phpmad21</url> +<joindin>https://xdebug.org</joindin> +<slide>slides/xdebug/title.xml</slide> +<slide>slides/mongodb/me.xml</slide> + +<slide>slides/xdebug/focus-on-xdebug.xml</slide> +The Xdebug Experience +17 years + +<slide>slides/xdebug/xdebug-slow.xml</slide> + +<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/test-with-many-versions.xml</slide> +<slide>slides/xdebug/xdebug-ci.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/code-reorgnisation.xml</slide> +<slide>slides/xdebug/modes.xml</slide> +<slide>slides/xdebug/config-settings-3.xml</slide> +<slide>slides/xdebug/config-settings-3b.xml</slide> + +<slide>slides/xdebug/xdebug-hard.xml</slide> +<!-- <s lide>slides/xdebug/connect1.xml</slide> --> +<!-- <s lide>slides/xdebug/connect2.xml</slide> --> +<slide>slides/xdebug/debugger-activation.xml</slide> +<slide>slides/xdebug/debugger-connection-log.xml</slide> +<slide>slides/xdebug/diagnostic-log.xml</slide> + +<slide>slides/xdebug/xdebug-3-speedup-1.xml</slide> + +<slide>slides/xdebug/xdebug-cloud-announcement.xml</slide> + +<slide>slides/xdebug/donate.xml</slide> +<slide>slides/xdebug/business-support.xml</slide> +<slide>slides/xdebug/transparency.xml</slide> + + +<slide>slides/xdebug/phpinternalsnews.xml</slide> +<slide>slides/mongodb/questions.xml</slide> +<slide>slides/xdebug/resources.xml</slide> + +</presentation> diff --git a/xdebug-zagreb21.xml b/xdebug-zagreb21.xml new file mode 100644 index 00000000..adf59964 --- /dev/null +++ b/xdebug-zagreb21.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="utf-8"?> +<presentation css="derick.css"> +<topic>Debugging</topic> +<title>Xdebug 3.0</title> +<event>ZgPHP</event> +<location>Virtual Zagreb, Croatia</location> +<date>April 15th, 2021</date> +<speaker>Derick Rethans</speaker> +<email>[email protected]</email> +<twitter>derickr</twitter> +<url>https://derickrethans.nl/talks/xdebug-phpmad21</url> +<joindin>https://xdebug.org</joindin> +<slide>slides/xdebug/title.xml</slide> +<slide>slides/mongodb/me.xml</slide> + +<slide>slides/xdebug/focus-on-xdebug.xml</slide> +The Xdebug Experience +17 years + +<slide>slides/xdebug/xdebug-slow.xml</slide> + +<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/test-with-many-versions.xml</slide> +<slide>slides/xdebug/xdebug-ci.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/code-reorgnisation.xml</slide> +<slide>slides/xdebug/modes.xml</slide> +<slide>slides/xdebug/config-settings-3.xml</slide> +<slide>slides/xdebug/config-settings-3b.xml</slide> + +<slide>slides/xdebug/xdebug-hard.xml</slide> +<!-- <s lide>slides/xdebug/connect1.xml</slide> --> +<!-- <s lide>slides/xdebug/connect2.xml</slide> --> +<slide>slides/xdebug/debugger-activation.xml</slide> +<slide>slides/xdebug/debugger-connection-log.xml</slide> +<slide>slides/xdebug/diagnostic-log.xml</slide> + +<slide>slides/xdebug/xdebug-3-speedup-1.xml</slide> + +<slide>slides/xdebug/xdebug-cloud-announcement.xml</slide> + +<slide>slides/xdebug/donate.xml</slide> +<slide>slides/xdebug/business-support.xml</slide> +<slide>slides/xdebug/transparency.xml</slide> + + +<slide>slides/xdebug/phpinternalsnews.xml</slide> +<slide>slides/mongodb/questions.xml</slide> +<slide>slides/xdebug/resources.xml</slide> + +</presentation>