
Few weeks ago, I decided to give my very first language I learned, the PHP a second chance.
This all was driven by curiosity, that was sparked after watching a video about that the Php is a new JavaScript, and how Laravel is an amazing framework to build web applications quickly.
So I decided, let's get some fun and dived to see how much the ecosystem has evolved and whether I could leverage my past experience to build anything. However, what I encountered was a maze of choices and configurations that made me think that something with Php is really off.
On paper PHP reads like a pragmatic, everywhere language: massive install base, fast iteration, tons of hosting options, and a mature ecosystem of libraries and frameworks.
The syntax is superbly approachable, especially for someone with prior programming experience. Especially the modern PHP versions (7.x, 8.x) have made huge strides in performance, type safety, and developer ergonomics like improved error handling and type declarations, the pipes (8.5+) or property promotion (8.0+) or match expressions (8.0+) and many more.
I really adore the syntax, the options I have to do things in multiple ways, and the overall flexibility of the language; in practice, though, that surface simplicity quickly peels away and becomes kind of maybe interesting at first but overwhelming in practice. When you decide to actually build something beyond a toy app, the number of orthogonal choices—how to run PHP, which scaffolding to use and more to pick—starts to pile up. Each choice has its own trade-offs, and there’s no single “right” answer.
There is no single, no canonical PHP runtime option.
Instead of easy choices, you’ll find many competing, completely reasonable ways to run the same code, which for a person who worked with languages as Python, Ruby, Typescript or Elixir is quite surprising.
To illustrate, here are some of the most common PHP runtime options I found, each with its own trade-offs:
But why?
Why it is so fragmented?
Why so many valid ways to run the same language?
Why there is no single easy path with single executable like Python or Node.js?
Tutorials, blog posts and courses often assume different runtimes, so “follow these steps” leads to many incompatible setups. Hence since there is no opinionated default, beginners face:
composer run dev doesn't work on Windows, the workers can't spin up correctly so you need to run it with php artisan serve which also doesn't work well for hot-reloading on Windows, so you need to forget about hot-reloading and use php artisan serve --no-reload.Because Windows is still the most popular desktop OS in the world, and many beginners will start their journey on Windows machines.
And if the ecosystem doesn't support Windows well, it creates an unnecessary barrier to entry for many potential developers, so they choose Javascript or Python instead of Php; because this sh*t just works on Windows without any additional hurdles.
Laravel is an extraordinary framework!
Once you jump onto their website you immediately feel welcomed by the rich set of batteries included, the elegant syntax, and the vibrant community.
But down the rabbit hole of getting started lies a bewildering array of starter kits and frontend options that can paralyse decision-making.
Because instead of single “Laravel way” to scaffold a new app, you have multiple competing starters, each with its own philosophy and trade-offs:
/resource directory.Each of them, alters how you structure components, test behavior, and debug the UI. In simple terms, gives you different philosophies that cause teams to reason differently about state, routing, and deployment.
From very start, the choice of starter shapes the entire development experience:
Why there is no single recommended starter that balances simplicity and power for most use-cases?
Why they don't just pick one enemy to focus on and optimize the experience around that?
For example if the Laravel Team wanted to compete against frameworks like Django, Phoenix or Rails, they could have picked one canonical starter that covers 80% of use-cases well. The Breeze with Blade option seems to be the closest to that, but it is not promoted as the default way to start a new Laravel app and the ecosystem keeps pushing many alternatives that fragment the community.
On the other hand if they wanted to compete against Next.js or Nuxt.js, they could have picked Livewire with functional Volt as the default starter, since it provides a modern component-based approach with server-driven rendering that fits many web app needs. And it could easily fill the gap in the Market for Next.js or Nuxt.js but with a strong backend integration
Languages like Python and Ruby present a different first impression to beginners because their ecosystems are more opinionated about project bootstrapping.
As such:
rails new flow that scaffolds a conventional structure; conventions guide you so you can learn one idiom deeply.Those opinions reduce cognitive load. You still can pick other tools, but the common tutorials, deploy targets and shared community knowledge converge on a consistent default.
PHP’s multiplicity denies that same safe default: there are many "right" ways but no single obvious path, and that’s exhausting for someone returning to their first language.
The meta-decisions imposed by PHP’s runtime and starter diversity have real costs.
They all add friction to getting started and maintaining momentum:
That friction is real and discouraging.
PHP’s paradox is simple: It’s incredibly capable and powers half the web, but its abundance of valid tools and starter permutations makes the first steps messy.
On paper it looks friendly and pragmatic;
in practice it often forces you into meta-decisions
about runtimes and scaffolding that slows progress.
I wish the ecosystem had a clearer, more opinionated path for new or returning developers: one that balances flexibility with simplicity. Until then, anyone revisiting PHP and Laravel should brace for a journey through a maze of choices—each valid, but none definitive.
Maybe it's time for PHP to re-brand it, for example into Hyperscript, with at least one canonical runtime and starter that just works out of the box on all major platforms and then move to re-structure its ecosystem around that with frameworks in mind.