2025 was the year PHP and Magento development changed gear. PHP 8.5 shipped with the pipe operator, Hyvä became the undisputed default for new Magento projects, AI tools graduated from experimental to mandatory, and the blog reached 120 posts. A retrospective of what actually mattered this year.
Iterator and Generator are two related but distinct mechanisms in PHP. Iterator is a GoF pattern that gives sequential access to a collection without exposing its internal structure. Generator is a PHP language feature that creates an Iterator using yield – without storing all values in memory at once. I show both, benchmark the memory difference, and apply them to large-scale Magento product processing.
Extension Attributes are Magento 2’s mechanism for extending existing entities (Product, Order, Customer) without modifying core tables. They participate in the REST API automatically and can carry any data type. Most tutorials show a simple string attribute. I show a complete implementation with batch loading (fixing N+1), REST API exposure with serialisation, and unit tests.
PHP 8.5 RC1 is out and the pipe operator is in it. After weeks with real Magento 2 module code using the RC, I can report what the pipe operator is genuinely good for, where it creates surprises, and confirm that readonly property inheritance works exactly as the RFC described. This is practical experience, not theory.
DDEV out of the box is fast to set up but the defaults leave performance on the table. Mutagen file sync, custom services, project hooks, and shared team configuration in version control reduce friction for everyone on the project. I show the advanced DDEV setup I use on large Magento 2 projects with multiple developers.
Copying a production database to a development environment without a proper process is either a GDPR violation or a security incident waiting to happen. I show a complete pipeline: fast dump with mydumper, automatic anonymisation of personal data, and DDEV hooks that make the sanitised database available to the whole team with a single command.
PHP 8.1 introduced Fibers as a foundation for cooperative multitasking. Most developers use them only indirectly through ReactPHP or Amp. But understanding Fibers at the mechanism level unlocks the ability to build your own concurrency primitives. I show how Fibers work, implement a minimal cooperative scheduler, and use it to run parallel HTTP requests without a framework dependency.
The N+1 problem is especially acute in GraphQL because resolvers compose independently without awareness of each other. A query for 20 products that each have categories will trigger 20 separate category queries without batching. Magento 2’s BatchServiceContractResolverInterface and the DataLoader pattern solve this. I show both approaches with cache tag integration.
The PHP 8.5 RFC vote on the pipe operator passed. After years of debate it is officially coming in November 2025. Readonly property inheritance also passed – child classes can now override parent readonly properties in specific cases. array_first() and array_last() join the array function family. I show what the final syntax looks like and how it changes real code.
Hyvä is faster than Luma – everyone says so. But by how much, on what metrics, and does it translate to business results? I ran controlled benchmarks on identical hardware with the same Magento 2.4.8 installation and both themes, measuring LCP, TTFB, Lighthouse scores, and load test results with k6. The numbers are concrete.
