PHP Internals News: Episode 62: Saner Numeric Strings – Derick Rethans

PHP Internals News: Episode 62: Saner Numeric Strings

In this episode of “PHP Internals News” I talk with George Peter Banyard (Website, Twitter, GitHub, GitLab) about an RFC that he has proposed to make PHP’s numeric string handling less complicated.

The RSS feed for this podcast is https://derickrethans.nl/feed-phpinternalsnews.xml, you can download this episode’s MP3 file, and it’s available on Spotify and iTunes. There is a dedicated website: https://phpinternals.news

Transcript

Derick Rethans 0:17

Hi, I’m Derick, and this is PHP internals news, a weekly podcast dedicated to demystifying the development of the PHP language. This is Episode 62. Today I’m talking with George Peter Banyard about an RFC that he’s proposing called saner numeric strings. Hello George, how are you this morning?

George Peter Banyard 0:36

How are you; I’m doing fine. I’m George Peter Banyard. I work on PHP, and I’m currently employed by The Coding Machine to work on PHP.

Derick Rethans 0:46

I actually think I have a bug swatter from The Coding Machine, which is hilarious. Huh, I can’t show you that okay of course in a podcast and not on TV. But yes, I think I got it in Paris at some point at a conference there, and it’s been happily getting rid of flies in my living room. Anyway, that’s not what we want to talk about here today, we want to talk about the RFC that is made, what is the problem that is RFC is hoping to address?

George Peter Banyard 1:09

PHP has the concept of numeric strings, which are strings which have like integers or floats encoded as a string. Mostly that would arrive when you have like a get request or post request and you take like the value of a form, which would be in a string. Issue is that PHP makes some kind of weird distinctions, and classifies numeric strings in three different categories mainly. So there are purely numeric strings, which are pure integers or pure floats, which can have an optional leading whitespace and no trailing whitespace.

Derick Rethans 1:44

Does that also include like exponential numbers in there?

George Peter Banyard 1:48

Yes. However trailing white spaces are not part of the numeric string specification in the PHP language. To deal with that PHP has a concept of leading numeric strings, which are strings which are numeric but like in the first few bytes, so it can be leading whitespace, integer or float, and then it can be whatever else afterwards, so it can be characters, it can be any white spaces, that will consider as a leading numeric string. The distinction is important because PHP will sometimes only accept pure numeric strings. But in some other place where we’ll accept leading numeric strings. Of casts will accept whatever string possible and will try to coerce it into an integer. In weak mode, if you have a type hint. It will accept leading numeric strings, and it will emit an e_notice that a non well formed string has been encountered. When you use like a purely string string, you’ll get a non numeric string encountered warning. So the main issue with that is that like strings which have a leading whitespace are considered more numeric by PHP than strings with trailing whitespaces. It is a pretty odd distinction to make.

Derick Rethans 3:01

For me to get this right, the numeric string in PHP can have whitespace at the start, and then have numbers. There’s a leading numeric string that can have optional whitespace in front, numbers and digits, and then rubbish. Then there’s a non numeric string which never has any numbers in it.

George Peter Banyard 3:22

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

Byte-sized functional programming: Pure functions make testing easy – larry@garfieldtech.com

Byte-sized functional programming: Pure functions make testing easy

When testing stateful code, you have to first set up all of the explicit and implicit state that a given piece of code depends on. If the object you’re testing has many dependencies that could be complex, or references global variables, or calls many other routines with their own dependencies, you may be looking at a lot of complex setup that makes testing hard to do effectively.

Pure functions greatly reduce that problem.

A pure function is a function that:

  • has no inputs other than those explicitly specified;
  • has no effect on any value other than the value it returns.

That means there is, by definition, only one place to inject dependencies: the call itself. And there’s only one effect to validate: the return value of the function. No need to call a function and check what the effect was on some other value or piece of code: by definition, the only effect is the return value.

If one of the parameters you pass in is itself complex, that may make the test complex. But if the parameter is complex, that can serve as an impetus to simplify it. Rather than passing in an object, for example, just pass in a single function. If that function in practice has more complexity behind it, fine, but it makes passing a mock function trivial. Just… make a new (anonymous) function for the one test.

When your code has fewer sneaky interactions, there’s less effort involved in testing as well as fewer things to test.

Want to know more about functional programming and PHP? Read the whole book on the topic: Thinking Functionally in PHP.

Thinking Functionally in PHP

Larry
14 July 2020 – 9:28am

PHP Internals News: Episode 61: Stable Sorting – Derick Rethans

PHP Internals News: Episode 61: Stable Sorting

In this episode of “PHP Internals News” I chat with Nikita Popov (Twitter, GitHub, Website) about his Stable Sorting RFC.

The RSS feed for this podcast is https://derickrethans.nl/feed-phpinternalsnews.xml, you can download this episode’s MP3 file, and it’s available on Spotify and iTunes. There is a dedicated website: https://phpinternals.news

Transcript

Derick Rethans 0:18

Hi, I’m Derick, and this is PHP internals news, a weekly podcast dedicated to demystifying the development of the PHP language. This is Episode 61. Today I’m talking with Nikita Popov about a rather small RFC that he’s proposing called stable sorting. Hello Nikita, how are you this morning?

Nikita 0:36

Hey, Derick, I’m great. How are you?

Derick Rethans 0:38

Not too bad myself. Let’s jump straight in here. The title of the RFC is stable sorting, what does that mean, what is stable sorting, or what is sorting stability?

Nikita 0:48

Sorting stability refers to the behaviour of the sort when it comes to equal elements. And equal share means that we sort comparison function. For example, the one you pass to usort says the elements are equal, but there is still some way to distinguish them. For example, if you’re sorting some objects, to take the example from the RFC, we have an array with users, and users have an age, and we use usort to only sort the users by age. Then according to the comparison callback all users with the same age are equal. But of course, the user also has other fields on which we can distinguish it. And the question is now in what order will equal elements appear. If we have a stable sort, then they will appear in the order they were originally in. So it’s something not going to change.

Derick Rethans 1:41

And that is not what PHP sorting mechanism currently does?

Nikita 1:44

Right. PHP currently uses an unstable sort, which means that the order is simply unspecified. It will be deterministic. I mean if you take the same input array and sort it, then every time we will get the same result. But there is no well specified order or relative order of elements. There’s just some order. The reason why we have this behaviour is that well there are, I would say, two, the only two sorting algorithms. There is merge sort. Which is a guaranteed n log n sort that the stable, but has the disadvantage that that requires additional memory to perform the merge step. The other side there is a quicksort, which is an average case n log n sorting algorithm and is unstable, but does not require any additional memory. And in practice, everyone uses one of these algorithms, usually with a couple of extensions on sort of merge sort. Nowadays we use timsort, but which is still based on the same underlying principle, and for quicksort, we have sort which is better than quicksort, which tries to avoid some of the bad worst case performance which quicksort can have. PHP currently uses us a quicksort, which means that our sorting results are unstable.

Derick Rethans 3:07

Okay, and this RFC suggesting to change that. How would you do that? How would you modify quicksort to make it stable?

Nikita 3:15

Two ways. One is to just change the sorting algorithm. So as I mentioned, the really popular stable sorting is timsort, which is used by Python by Java and probably lots of other languages at this point. And the other possibility is to stick with an unstable source. So to stick with quicksort, but to artificially enforce that the comparison function does not have, does not report equal elements that a

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

Best practices for deploying web apps have evolved – platform.sh

[This post is heavily inspired by Christopher Skene’s 2017 “What is best practice in web application deployment.” Three years is a long time for best practices in devops land, however, so it’s time to again update our thinking.] “Best practices” are often talked about in the tech world, but rarely is it acknowledged that they can and do change over time. All “best practices” are nothing more than a distillation of the challenges of a given situation to a usually optimal set of trade-offs.

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

The PHP team is pleased to announce the second testing release of PHP 8.0.0, Alpha 2. This continues the PHP 8.0 release cycle, the rough outline of which is specified in the PHP Wiki. For source downloads of PHP 8.0.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 Alpha 3, planned for 23 Jul 2020.The signatures for the release can be found in the manifest or on the QA site.Thank you for helping us make PHP better.

Release of the Advanced Web Application Architecture book – Matthias Noback

Book cover

100% done

I’m happy to announce that my latest book “Advanced Web Application Architecture” is now complete.
With ~390 pages it has become a well-rounded book full of useful design patterns and architectural principles built around the notion of object-pure code, that will help you create decoupled applications that are testable by definition, and support a domain-first approach to software development.

Use this link to get 10% off the price: https://leanpub.com/web-application-architecture/c/RELEASE_DAY

“This book helped me to improve myself and I recommend it to any developer who wants to learn how to solve problems in a better way.” — Iosif Chiriluta

“Matthias has a knack for distilling decades of experience into simplified rules of thumb. Explained with practical examples, the rules in this book are accessible to developers of any level of experience. I expect to recommend this book for many years to come.” — Ramon de la Fuente

A second round of book club sessions

Read with the author

In the past few months we’ve been having some really interesting sessions with early-access readers of the book.
With the book fully finished, I decided to plan another round of sessions starting in September.
To join these sessions make sure to select the package “The Book + 6 Book club sessions” when buying your copy of the book.

“This book is a most welcome simplification of modern web application architecture concepts, making the topic accessible for a wide audience. By guiding the reader through classic web application scenarios and applying a couple of simple rules and principles while staying very pragmatic, the author achieves what most others don’t – making the core idea so simple that it is near impossible for the reader to get it wrong. The only architecture book I would recommend even to my junior colleagues.” — Ondřej Bouda

Print edition

For those who prefer a paper book there’s also a print edition available via Lulu.
This includes a free copy of the e-book.
You’ll find instructions for obtaining it inside the book.

The making of

Back in April 2019 I started working on this project.
It all started with the family visiting friends in France while I stayed at home, alone, with a bunch of post-it’s.

Post-it's

From this first brainstorm session I created a preliminary table of contents:

Original TOC part 1Original TOC part 2

The rough outline was there, but I started working on the setup first.

So far I’ve only used Leanpub’s Markdown-based publishing process.
They first convert the Markdown manuscript to LaTeX, then to PDF, html, EPUB and MOBI.
I thought it would be nice to have more control over all the build artifacts, so I worked on my own LaTeX-based setup.
This was a silly decision.
I didn’t keep track of all the hours that went into this, but it has probably taken me about 50 hours to get it right.
Of course, I keep running into little things that don’t work.
But I do have a fully automated local book writing process now.
Being able to add all kinds of other generated artifacts is really helpful.
For instance, I can edit the book cover in Gimp and it will be automatically resized for the different e-book formats, and also flattened for the print cover.
The same goes for the diagrams: if I modify them using the Draw.io desktop editor, they will be automatically prepared for inclusion in the manuscript.
Cool!
But also: very costly.

With the technical stuff out of the way, the writing process was great in the beginning, but seemed to last for ages in the end.
I’ve spent a total of 208 hours of actual writing (including writing the code samples and creating the diagrams).
I generally aim to get everything right the first time (of course), but revising

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