PHP Internals News: Episode 103: Disjunctive Normal Form (DNF) Types – Derick Rethans

PHP Internals News: Episode 103: Disjunctive Normal Form (DNF) Types

In this episode of “PHP Internals News” I talk with George Peter Banyard (Website, Twitter, GitHub, GitLab) about the “Disjunctive Normal Form Types” RFC that he has proposed with Larry Garfield.

The RSS feed for this podcast is, you can download this episode’s MP3 file, and it’s available on Spotify and iTunes. There is a dedicated website:


Derick Rethans 0:15

Hi, I’m Derick. Welcome to PHP internals news, a podcast dedicated to explaining the latest developments in the PHP language. This is episode 103. Today I’m talking with George Peter Banyard again, this time about a disjunctive normal form types RFC, or DNF, for short, which he’s proposing together with Larry Garfield. George Peter, would you please introduce yourself?

George Peter Banyard 0:39

Hello, my name is George Peter Banyard, I work on PHP paid part time, by the PHP foundation.

Derick Rethans 0:44

Just like last time, we are still got colleagues.

George Peter Banyard 0:46

Yes, we are indeed still call it.

Derick Rethans 0:48

What is this RFC about? What is it trying to solve?

George Peter Banyard 0:52

The problems of this RFC is to be able to mix intersection and union types together. Last year, when intersection types were added to PHP, they were explicitly disallowed to be used with Union types. Because: a) mental framework, b) implementation complexity, because intersection types were already complicated on their own, to try to get them to work with Union types was kind of a big step. So it was done in chunks. And this is the second part of the chunk, being able to use it with Union types in a specific way.

Derick Rethans 1:25

What is the specific way?

George Peter Banyard 1:27

The specific way is where the disjoint normal form thing comes into play. So the joint normal form just means it’s a normalized form of the type, where it’s unions of intersections. The reason for that it helps the engine be able to like handle all of the various parts it needs to do, because at one point, it would need to normalize the type anyway. And we currently is just forced on to the developer because it makes the implementation easier. And probably also the source code, it’s easier to read.

Derick Rethans 1:54

When you say, forcing it up on a developer to check out you basically mean that PHP won’t try to normalize any types, but instead throws a compilation error?

George Peter Banyard 2:05

Exactly. It’s, it’s the job of the developer to do the normalization step. The normalization step is pretty easy, because I don’t expect people to do too many stuff as intersection types. But as can always be done as a future scope of like adding a normalization step, then you get into the issues of like, maybe not having deterministic code, because normalization steps can take very, very long, and you can’t necessarily prove that it will terminate, which is not a great situation to be in. Imagine just having PHP not running at all, because it’s stuck in an infinite loop trying to normalize the format. It’s just like, oh, I can’t compile

Derick Rethans 2:39

Would a potential type alias kind of syntax help with that?

George Pe

Truncated by Planet PHP, read more at the original (another 23817 bytes)

PHP 8.2.0 Alpha 2 available for testing – PHP: Hypertext Preprocessor

The PHP team is pleased to announce the second testing release of PHP 8.2.0, Alpha 2. This continues the PHP 8.2 release cycle, the rough outline of which is specified in the PHP Wiki.For source downloads of PHP 8.2.0 Alpha 2 please visit the download page.Please carefully test this version and report any issues found in the bug reporting system.Please DO NOT use this version in production, it is an early test version.For more information on the new features and other changes, you can read the NEWS file, or the UPGRADING file for a complete list of upgrading notes. These files can also be found in the release archive.The next release will be PHP 8.2.0 Alpha 3, planned for 7 Jul 2022.The signatures for the release can be found in the manifest or on the QA site.Thank you for helping us make PHP better.

Benchmarking Serialization – Larry Garfield

Benchmarking Serialization

I was discussing recently with a TYPO3 colleague about performance, specifically caching. Both he and I are working on systems that may involve hundreds or thousands of objects that need to be cached for later use. The objects themselves are fairly small, but there’s a large number of them. The data format is only internal, so we don’t need anything standardized or parsable by outside systems.

PHP actually has two options for this use case: serialize()/unserialize() and var_export()/require(). But which is better?

Quick, to the benchmark mobile! The results I found were not at all what I expected.

Continue reading this post on PeakD.

21 June 2022 – 2:42pm

A new OAuth2 client for Javascript – Evert Pot

Frustrated with the lack of well maintained, minimal OAuth2 libraries, I wrote
my own
. This new OAuth2 library is only 3KB gzipped, mainly because it
has 0 dependencies and relies on modern APIs like fetch() and
Web Crypto which are built in Node 18 (but it works with Polyfills on
Node 14 and 16).

It has support for key features such as:

  • authorization_code with PKCE support.
  • password and client_credentials grants.
  • a fetch() wrapper that automatically adds Bearer tokens and refreshes them.
  • OAuth2 endpoint discovery via the Server metadata document (RFC8414).
  • OAuth2 Token Introspection (RFC7662).

If your server does support the meta-data document, here’s how simple the
process can be:

client_credentials example

import { OAuth2Client } from '@badgateway/oauth2-client'; const client = new Client({ clientId: '..', clientSecret: '..', server: 'https://my-auth-server.example'
}); const tokens = await client.clientCredentials();

Without the meta-data document, you will need to specify settings such as the
tokenEndpoint and possibly the authorizationEndpoint depending on which
flow you are using.

authorization_code example

The authorization_code flow is a multi-step process, so a bit more involved.
The library gives you direct access to the primitives, allowing you to
integrate in your own frameworks and applications.

import { OAuth2Client, generateCodeVerifier } from '@badgateway/oauth2-client'; const client = new OAuth2Client({ server: 'https://authserver.example/', clientId: '...',
}); // Part of PCKE
const codeVerifier = await generateCodeVerifier(); // In a browser this might work as follows:

Truncated by Planet PHP, read more at the original (another 2436 bytes)

A primer on GCP Compute Instance VMs for dockerized Apps [Tutorial Part 8] – Pascal Landau

In the eighth part of this tutorial series on developing PHP on Docker we will take a look on
the Google Cloud Platform (GCP)
and create a Compute Instance VM to run dockerized
. This includes:

  • creating VMs
  • using a container registry
  • using a secret manager