Talks, tools, and articles from the Lamp team.
We build software for clients. We also contribute to the wider development community through conference talks, open source tools, and written guides. Everything here reflects the same priorities we bring to client work: code quality, testing, static analysis, and building systems that last.
Open source
PHP Language Extensions
Attributes that define new language features in PHP, enforced by static analysis rather than at runtime. Examples include #[Friend], #[NamespaceVisibility]. Used in production codebases including our own.
SARB (Static Analysis Results Baseliner)
The biggest barrier to adopting static analysis on an existing project is the wall of pre-existing warnings. SARB creates a baseline so only new issues are reported. Your team gets the benefit of static analysis immediately, and you can work through historical issues at your own pace.
SARB is language-agnostic. It works with any static analysis tool that outputs results, not just PHP tools.
Test Splitter
Splits PHPUnit test suites into batches for parallel execution, reducing CI pipeline time.
PHPStan Rule Test Helper
Makes it easier to write tests for custom PHPStan rules. If you're building your own rules (something we cover in our workshops), this speeds up the process.
Conference talks
Dave Liddament speaks regularly at international conferences on testing, static analysis, code quality, and architecture. These are the same topics we cover in our Train workshops, so the talks give a good sense of how we teach.
Extending the PHP Language
How to implement new language features using static analysis. The thinking behind the PHP Language Extensions library.
Custom PHPStan Rules: Automate Standards and Save Time
PHPStan finds bugs. Custom rules let you enforce your team's specific standards automatically. This talk shows you how to write them.
AssertTrue(isDecoupled("my tests"))
Writing decoupled code is good practice. That should extend to your test code too. This talk examines why test coupling is expensive and how to reduce it.
Elevating Legacy
The practical story of upgrading a legacy codebase. Tools used, things that went well, and lessons learned.
Demystifying Dependency Injection in Symfony
How Symfony's Dependency Injection Component works, how to configure it, and how to use Attributes for scalable, maintainable code.
SymfonyCon Vienna 2024, SymfonyOnline January 2025Mastering automated refactoring with custom Rector rules (Workshop)
Hands-on tutorial: create your own Rector rules for automated refactoring.
Longhorn PHP 2025, PHPTek 2025PHP Generics Today (almost)
How existing tools give you the power of generics now.
Practical Static Analysis
Integrating static analysis into your development workflow.
Effective Code Review
The business case for code review and how to make it work.
Articles
Introducing the PHP Language Extensions Library
The concept: using attributes and static analysis to emulate new language features.
Introducing the Friend attribute
Enforcing creational design patterns. Only the factory can create the object.
Introducing the MustUseResult attribute
Preventing a common class of bugs where a return value is accidentally ignored. PHP 8.5 later introduced #[NoDiscard] which does the same thing natively.
Introducing the NamespaceVisibility attribute
Emulating the missing package visibility modifier.
A standard for generics in PHP
A proposal for formalising the notation used for PHP generics.
Coding Without Fear
Using advanced static analysers on existing projects.
Published in PHP Architect magazine, Oct 2019Podcasts
Community Corner: SARB and PHP Language Extensions
Dave joined the PHP Architect podcast to discuss both open source projects, the philosophy behind them, and an upcoming Rector workshop.
Static Analysis with Dave Liddament
Dave joined Oliver Davies on the Beyond Blocks podcast to discuss PHPStan and static analysis.
Community
PHP-SW
Bristol's PHP meetup, running monthly on the second Wednesday. Dave organises, finds speakers, arranges venues, and hosts.