{"id":522428,"date":"2024-10-31T15:00:57","date_gmt":"2024-10-31T14:00:57","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=phpstorm&#038;p=522428"},"modified":"2025-02-05T12:39:31","modified_gmt":"2025-02-05T11:39:31","slug":"php-annotated-october-2024","status":"publish","type":"phpstorm","link":"https:\/\/blog.jetbrains.com\/de\/phpstorm\/2024\/10\/php-annotated-october-2024","title":{"rendered":"PHP Annotated \u2013 October 2024"},"content":{"rendered":"<p><a href=\"https:\/\/blog.jetbrains.com\/phpstorm\/2024\/10\/php-annotated-october-2024\/\"><img decoding=\"async\" class=\"alignnone size-full\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/10\/php_annotated_october_2024.jpg\" alt=\"PHP Annotated\" width=\"900\"><\/a><\/p>\n<p>Welcome to the October edition of PHP Annotated! This recap is carefully handcrafted and brings you the most interesting developments in the PHP community over the past couple of months, so you don\u2019t have to sift through the noise\u2014we\u2019ve done it for you.<\/p>\n<p><!--more--><\/p>\n<style>@media (min-width: 769px) { main .article-section .content ul:not([class]):not([id]) li ul:not([class]):not([id]) { margin-top: 0; margin-bottom: 24px; } } main .article-section .content ul:not([class]):not([id]) li, main .article-section .content ul:not([class]):not([id]) > li {padding-bottom: 18px;}  main .article-section .content ul:not([class]):not([id]) li ul:not([class]):not([id]) li {padding-bottom: 0;} img.alignico {margin-right: 10px;margin-top: 5px;float: left;}  summary {display: list-item;cursor: pointer;font-style: italic; } section.article-section a {color: #7755f3} code {color: red;} #roman-pronskiy,.copy-heading:has(#roman-pronskiy){margin-top: 0;} main li a[href^=\"https:\/\/github.com\"]:before {background: no-repeat 2px center url(data:image\/svg+xml;utf8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNCIgaGVpZ2h0PSIxNCIgZmlsbD0ibm9uZSIgdmlld0JveD0iMCAwIDMyIDMyIj48cGF0aCBmaWxsPSIjMjQyOTJFIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNiAwYTE2IDE2IDAgMCAwLTUgMzEuMmMuNy4xIDEtLjQgMS0uOHYtM2MtNCAuOC01LTEtNS40LTEuOC0uMS0uNS0xLTItMS42LTIuMy0uNi0uMy0xLjQtMSAwLTEgMS4yIDAgMi4xIDEuMSAyLjQgMS42IDEuNSAyLjQgMy44IDEuNyA0LjcgMS4zLjEtMSAuNi0xLjcgMS0yLjEtMy41LS40LTcuMy0xLjgtNy4zLTggMC0xLjcuNy0zLjEgMS43LTQuMi0uMi0uNC0uNy0yIC4xLTQuMyAwIDAgMS40LS40IDQuNCAxLjdhMTQuOCAxNC44IDAgMCAxIDggMGMzLjEtMi4xIDQuNC0xLjcgNC40LTEuNyAxIDIuMi40IDMuOS4yIDQuM2E2IDYgMCAwIDEgMS42IDQuM2MwIDYuMS0zLjcgNy41LTcuMyA3LjkuNi41IDEuMSAxLjQgMS4xIDN2NC4zYzAgLjQuMyAxIDEuMS44QTE2IDE2IDAgMCAwIDE2IDBaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48L3N2Zz4=);content: \"\";padding-left: 20px;} main li a[href^=\"https:\/\/www.youtube.com\"]:not([data-test=\"blog-header\"]):before {background: no-repeat 0px center url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' height='100%25' version='1.1' viewBox='0 0 68 48' width='100%25'%3E%3Cpath class='ytp-large-play-button-bg' d='m .66,37.62 c 0,0 .66,4.70 2.70,6.77 2.58,2.71 5.98,2.63 7.49,2.91 5.43,.52 23.10,.68 23.12,.68 .00,-1.3e-5 14.29,-0.02 23.81,-0.71 1.32,-0.15 4.22,-0.17 6.81,-2.89 2.03,-2.07 2.70,-6.77 2.70,-6.77 0,0 .67,-5.52 .67,-11.04 l 0,-5.17 c 0,-5.52 -0.67,-11.04 -0.67,-11.04 0,0 -0.66,-4.70 -2.70,-6.77 C 62.03,.86 59.13,.84 57.80,.69 48.28,0 34.00,0 34.00,0 33.97,0 19.69,0 10.18,.69 8.85,.84 5.95,.86 3.36,3.58 1.32,5.65 .66,10.35 .66,10.35 c 0,0 -0.55,4.50 -0.66,9.45 l 0,8.36 c .10,4.94 .66,9.45 .66,9.45 z' fill='%23FF0000' fill-opacity='0.81'%3E%3C\/path%3E%3Cpath d='m 26.96,13.67 18.37,9.62 -18.37,9.55 -0.00,-19.17 z' fill='%23fff'%3E%3C\/path%3E%3Cpath d='M 45.02,23.46 45.32,23.28 26.96,13.67 43.32,24.34 45.02,23.46 z' fill='%23ccc'%3E%3C\/path%3E%3C\/svg%3E\"); content: \"\";padding-left: 18px;background-size: 16px;}<\/style>\n<h2 id=\"highlights\">Highlights<\/h2>\n<ul>\n<li>\n<h3><a href=\"https:\/\/wiki.php.net\/todo\/php84\" target=\"_blank\" rel=\"noopener\">PHP 8.4 RC3<\/a> is available for testing<\/h3>\n<p>        Release managers Calvin Buckley, Saki Takamachi, and Eric Mann have created the <code>PHP-8.4<\/code> branch, development will now be done in the corresponding branch, and the master branch is now targeting the next version of PHP.<\/p>\n<p>        With the <strong>final release expected on November 21<\/strong>, we can look forward to one more release candidate before then.<\/p>\n<p>        For a detailed list of what\u2019s coming in PHP 8.4 see <a href=\"https:\/\/php.watch\/versions\/8.4\" target=\"_blank\" rel=\"noopener\">php.watch<\/a> and <a href=\"https:\/\/stitcher.io\/blog\/new-in-php-84\" target=\"_blank\" rel=\"noopener\">stitcher.io<\/a>. <\/p>\n<p>        Try PHP 8.4:<\/p>\n<ul>\n<li>On Mac, you can install it using Homebrew through the Nightly channel via <a href=\"https:\/\/github.com\/shivammathur\/homebrew-php\" target=\"_blank\" rel=\"noopener\">shivammathur\/homebrew-php<\/a>.<\/li>\n<li>For other platforms, <a href=\"https:\/\/hub.docker.com\/_\/php\/tags?page=1&amp;name=8.4.0\" target=\"_blank\" rel=\"noopener\">Docker images<\/a> are probably the easiest way to try it out with no hassle.<\/li>\n<li>For a quick local test, PHP 8.4 is also available on <a href=\"https:\/\/herd.laravel.com\/\" target=\"_blank\" rel=\"noopener\">Herd<\/a>.<\/li>\n<\/ul>\n<\/li>\n<li>\n<h3><a href=\"https:\/\/www.php.net\/ChangeLog-8.php#8.1.30\" target=\"_blank\" rel=\"noopener\">PHP 8.1.30<\/a>, <a href=\"https:\/\/www.php.net\/ChangeLog-8.php#8.2.24\" target=\"_blank\" rel=\"noopener\">PHP 8.2.24<\/a>, and <a href=\"https:\/\/www.php.net\/ChangeLog-8.php#8.3.12\" target=\"_blank\" rel=\"noopener\">PHP 8.3.12<\/a> have been released<\/h3>\n<p>        \u2757\ufe0fThese are security releases that address several vulnerabilities:<\/p>\n<ul>\n<li>Parameter injection vulnerability in CGI <a href=\"https:\/\/github.com\/php\/php-src\/security\/advisories\/GHSA-p99j-rfp4-xqvq\" target=\"_blank\" rel=\"noopener\">[GHSA]<\/a><\/li>\n<li>Bypassable <code>cgi.force_redirect<\/code> configuration <a href=\"https:\/\/github.com\/php\/php-src\/security\/advisories\/GHSA-94p6-54jq-9mwp\" target=\"_blank\" rel=\"noopener\">[GHSA]<\/a><\/li>\n<li>Alterable logs in FPM children <a href=\"https:\/\/github.com\/php\/php-src\/security\/advisories\/GHSA-865w-9rf3-2wh5\" target=\"_blank\" rel=\"noopener\">[GHSA]<\/a><\/li>\n<li>Erroneous parsing of multipart form data <a href=\"https:\/\/github.com\/php\/php-src\/security\/advisories\/GHSA-9pqp-7h25-4f32\" target=\"_blank\" rel=\"noopener\">[GHSA]<\/a><\/li>\n<\/ul>\n<p>        All users should update their installations.\n    <\/li>\n<li>\n<h3><a href=\"https:\/\/blog.jetbrains.com\/phpstorm\/2024\/09\/phpstorm-2024-3-early-access-program-is-now-open\/\">PhpStorm 2024.3 Early Access Program Is Now Open<\/a><\/h3>\n<p>        In this early access version, you can already try out full support for PHP 8.4.\n    <\/li>\n<li>\n<h3><a href=\"https:\/\/thephp.foundation\/blog\/\" target=\"_blank\" rel=\"noopener\">The PHP Foundation Updates<\/a><\/h3>\n<p>        First, thanks to Ayesh from <a href=\"https:\/\/php.watch\/\" target=\"_blank\" rel=\"noopener\">PHP.Watch<\/a>, the foundation has relaunched its core roundup series in a new format. Check out the latest <strong><a href=\"https:\/\/thephp.foundation\/blog\/2024\/10\/02\/php-core-roundup-19\/\" target=\"_blank\" rel=\"noopener\">PHP Core Roundup #19<\/a>.<\/strong><\/p>\n<p>        Secondly, <a href=\"https:\/\/thephp.foundation\/blog\/2024\/10\/08\/open-source-pledge\/\" target=\"_blank\" rel=\"noopener\"><strong>The PHP Foundation has joined The Open Source Pledge<\/strong><\/a> which aims to encourage companies using open-source software to donate back to projects and help build a sustainable ecosystem. As part of this initiative, three PHP companies even made it onto <a href=\"https:\/\/x.com\/virtualmilin\/status\/1843729223124693054\" target=\"_blank\">the Nasdaq billboard<\/a><strong>.<\/strong><\/p>\n<p>        Thirdly, commissioned by the German government-backed <a href=\"https:\/\/www.sovereigntechfund.de\/\" target=\"_blank\" rel=\"noopener\">Sovereign Tech Fund<\/a>, the foundation delivered the <a href=\"https:\/\/thephp.foundation\/blog\/2024\/10\/21\/web-services-tool-for-php-fpm\/\" target=\"_blank\" rel=\"noopener\"><strong>Web Services Tool for PHP-FPM<\/strong><\/a>.<\/p>\n<p>        And last but not least, <a href=\"https:\/\/thephp.foundation\/blog\/2024\/09\/30\/call-fo-sponsors\/\" target=\"_blank\" rel=\"noopener\"><strong>The PHP Foundation is calling for sponsors<\/strong><\/a><strong>.<\/strong> Sponsor the foundation and help shape the future of PHP!\n    <\/li>\n<\/ul>\n<h2 id=\"php-core\">PHP Core<\/h2>\n<ul>\n<li>\n<h3>? <a href=\"https:\/\/wiki.php.net\/rfc\/closures_in_const_expr\" target=\"_blank\" rel=\"noopener\">RFC: Support Closures in constant expressions<\/a><\/h3>\n<p>        This one has some interesting use-cases:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\" data-enlighter-title=\"\">final class Locale\n{\n    #[Validator\\Custom(static function (string $languageCode): bool {\n        return \\preg_match(&#039;\/^[a-z][a-z]$\/&#039;, $languageCode);\n    })]\n    public string $languageCode;\n}<\/pre>\n<\/li>\n<li>\n<h3>? <a href=\"https:\/\/wiki.php.net\/rfc\/curl_share_persistence\" target=\"_blank\" rel=\"noopener\">RFC: Add persistent curl share handles<\/a><\/h3>\n<p>        Eric Norris proposes to add a new function <code>curl_share_init_persistent()<\/code>, which would allow cURL handles to be stored in global memory and reused in subsequent requests. This enhancement aims to improve performance by reducing the overhead of initializing cURL handles each time. <\/p>\n<p>        Quoting <a href=\"https:\/\/x.com\/matthieunapoli\/status\/1845928676577497199\" target=\"_blank\">Matthieu Napoli<\/a>, the author of <a href=\"https:\/\/bref.sh\/\" target=\"_blank\" rel=\"noopener\">Bref<\/a>, here:<\/p>\n<blockquote>\n<p>\n        Most PHP apps spend most of their time doing IO (not using the CPU). \u2026 But calling APIs (via HTTP) can take a very long time. Very different orders of magnitude.<\/p>\n<p>        Why? Because it establishes a TPC and HTTPS connection every time. That can take 100ms or 200ms (HTTPS is bonkers). On *every* request, because PHP (with FPM) recreates a connection every time. <\/p>\n<p>        That&#8217;s why switching to Laravel Octane or Symfony Runtime makes such a difference sometimes: by keeping the PHP process alive between requests, we can save these 100ms. Comparing that to what we save on the framework boot time, this is massive. <\/p>\n<p>        The RFC proposes to share HTTP connections between requests in PHP-FPM: that&#8217;s huge because it could bring some of these gains to all PHP apps out there, without having to switch to Octane\/Runtime (and the downsides that come with it).\n        <\/p>\n<\/blockquote>\n<p>        And to further prove the point, here are a couple of real-world use cases and workarounds:<\/p>\n<ul>\n<li>Wikipedia team: <a href=\"https:\/\/techblog.wikimedia.org\/2020\/10\/26\/impact-of-using-http-connection-pooling-for-php-applications-at-scale\/\" target=\"_blank\" rel=\"noopener\">Impact of using HTTP connection pooling for PHP applications at scale<\/a>.<\/li>\n<li>Bedrock team: <a href=\"https:\/\/tech.bedrockstreaming.com\/2021\/10\/18\/increase-performance-and-stability-by-adding-an-egress-controller.html\" target=\"_blank\" rel=\"noopener\">Increase performance and stability by adding an Egress Controller in a Kubernetes cluster at AWS<\/a>.<\/li>\n<\/ul>\n<\/li>\n<li>\n<h3>? <a href=\"https:\/\/wiki.php.net\/rfc\/array-sort-return-array\" target=\"_blank\" rel=\"noopener\">RFC: Change behaviour of array sort functions to return a copy of the sorted array<\/a><\/h3>\n<p>        Currently, PHP\u2019s array sort functions take the array to sort by reference, modifying the original array in place. However, these functions always return `true` which often makes them not so convenient to use. <\/p>\n<p>        Gina Banyard proposes changing the return value of these functions <code>sort()<\/code>, <code>rsort()<\/code>, <code>asort()<\/code>, <code>arsort()<\/code>, <code>ksort()<\/code>, <code>krsort()<\/code>, <code>natsort()<\/code>, <code>natcasesort()<\/code>, <code>usort()<\/code>, <code>uasort()<\/code>, <code>uksort()<\/code>, <code>array_multisort()<\/code>, <code>shuffle()<\/code>, <code>array_walk()<\/code>, <code>array_walk_recursive()<\/code> from <code>true<\/code> to a copy of the array. <\/p>\n<p>        This change would allow for a more functional programming style, enabling to chain these functions and work with immutable data more easily.\n    <\/li>\n<li><strong>\u2705 <a href=\"https:\/\/wiki.php.net\/rfc\/directory-opaque-object\" target=\"_blank\" rel=\"noopener\">RFC: Change Directory class to behave like an opaque object<\/a><\/strong>\n    <\/li>\n<li><strong>? <a href=\"https:\/\/wiki.php.net\/rfc\/warn-resource-to-string\" target=\"_blank\" rel=\"noopener\">RFC: Warn on conversions from resource to string<\/a><\/strong>\n    <\/li>\n<\/ul>\n<h2 id=\"tools\">Tools<\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/composer\/composer\/releases\/tag\/2.8.0\" target=\"_blank\" rel=\"noopener\"><strong>Composer<\/strong><\/a> <strong>2.8.0<\/strong><br \/>\n        The new version of Composer comes with several interesting additions:<\/p>\n<ul>\n<li><code>--patch-only<\/code> flag: This allows you to limit updates to patch-level changes, minimizing the risk of introducing breaking changes.<\/li>\n<li>Ability to explicitly decide if additional arguments\/options should be passed to the underlying command.<\/li>\n<\/ul>\n<\/li>\n<li><a href=\"https:\/\/github.com\/imliam\/cpx\" target=\"_blank\" rel=\"noopener\">imliam\/cpx<\/a> \u2013 It\u2019s like `npx` but for PHP. This tool allows you to run any command from any Composer package, even if it\u2019s not installed in your project.<\/li>\n<li><a href=\"https:\/\/php.new\/\" target=\"_blank\" rel=\"noopener\">php.new<\/a> \u2013 A one-line PHP installer from Laravel and Herd teams. It installs a static version of PHP intended specifically for development and testing purposes, along with composer and Laravel. Please note that it\u2019s not suitable for production use.<\/li>\n<li><a href=\"https:\/\/github.com\/Thavarshan\/fetch-php\" target=\"_blank\" rel=\"noopener\">Thavarshan\/fetch-php<\/a> \u2013 A lightweight package for making HTTP requests inspired by JavaScript\u2019s <code>fetch<\/code>.<\/li>\n<li><a href=\"https:\/\/api-platform.com\/?s=laravel\" target=\"_blank\" rel=\"noopener\">API Platform 4 Released<\/a> \u2013 API Platform 4 is now out and officially supports Laravel. It\u2019s a mature framework for building REST and GraphQL API-first applications.<\/li>\n<li><a href=\"https:\/\/pestphp.com\/docs\/pest3-now-available\" target=\"_blank\" rel=\"noopener\">Pest v3<\/a> released \u2013 The new version introduces mutation testing, arch presets, and more to streamline your testing workflow.<\/li>\n<li><a href=\"https:\/\/github.com\/Ucar-Solutions\/uri-signer\" target=\"_blank\" rel=\"noopener\">Ucar-Solutions\/uri-signer<\/a> \u2013 A minimal package for securely signing PSR-15 URIs in PHP applications.<\/li>\n<li><a href=\"https:\/\/github.com\/Nejcc\/php-datatypes\" target=\"_blank\" rel=\"noopener\">Nejcc\/php-datatypes<\/a> \u2013 Flexible yet strict way of handling primitive data types like integers, floats, and strings in PHP.<\/li>\n<li><a href=\"https:\/\/github.com\/tempestphp\/tempest-framework\" target=\"_blank\" rel=\"noopener\">tempestphp\/tempest-framework<\/a> v1.0.0-alpha \u2013 Brent <a href=\"https:\/\/www.youtube.com\/watch?v=zKwXyEbnyoI\" target=\"_blank\" rel=\"noopener\">tagged<\/a> the first alpha version of his framework that is designed so developers can write as little framework-related code as possible and focus on app logic.<\/li>\n<li><a href=\"https:\/\/github.com\/cerbero90\/json-parser\" target=\"_blank\" rel=\"noopener\">cerbero90\/json-parser<\/a> \u2013 A zero-dependency lazy parser to read JSON of any size and from any source in a memory-efficient way.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondcode\/php-spx\" target=\"_blank\" rel=\"noopener\">beyondcode\/php-spx<\/a> \u2013 A simple and straightforward PHP profiling extension with a built-in web UI. It\u2019s a fork of a popular profiler with a brand-new UI.<\/li>\n<li><a href=\"https:\/\/github.com\/shipmonk-rnd\/dead-code-detector\" target=\"_blank\" rel=\"noopener\">shipmonk-rnd\/dead-code-detector<\/a> \u2013 A PHPStan extension for detecting unused code in your PHP projects.<\/li>\n<li><a href=\"https:\/\/github.com\/shipmonk-rnd\/phpstan-baseline-per-identifier\" target=\"_blank\" rel=\"noopener\">shipmonk-rnd\/phpstan-baseline-per-identifier<\/a> \u2013 A PHPStan error formatter that generates baseline files for each error identifier.<\/li>\n<li><a href=\"https:\/\/github.com\/pxp-lang\/trunk\" target=\"_blank\" rel=\"noopener\">pxp-lang\/trunk<\/a> \u2013 An all-in-one tool for managing and developing PHP projects. It\u2019s implemented in Rust but installs just like any Composer package.<\/li>\n<li><a href=\"https:\/\/github.com\/staabm\/side-effects-detector\" target=\"_blank\" rel=\"noopener\">staabm\/side-effects-detector<\/a> \u2013 Analyzes PHP code for side effects to help maintain clean codebases.<\/li>\n<li><a href=\"https:\/\/github.com\/yiisoft\/mailer\" target=\"_blank\" rel=\"noopener\">yiisoft\/mailer<\/a> \u2013 A flexible yet simple mailer component.<\/li>\n<li><a href=\"https:\/\/github.com\/phikiphp\/phiki\" target=\"_blank\" rel=\"noopener\">phikiphp\/phiki<\/a> \u2013 Syntax highlighting powered by TextMate grammars.<\/li>\n<li><a href=\"https:\/\/github.com\/cerbero90\/enum\" target=\"_blank\" rel=\"noopener\">cerbero90\/enum<\/a> \u2013 Supercharges enums in your PHP projects.<\/li>\n<li><a href=\"https:\/\/github.com\/mario-deluna\/php-glfw\" target=\"_blank\" rel=\"noopener\">mario-deluna\/php-glfw<\/a> \u2013 A fully-featured OpenGL and GLFW extension for PHP.\n<p>        It introduces a whole new set of tools for PHP developers to build graphical applications like games, scientific simulations, and user interfaces. <\/p>\n<p>        Check out some <a href=\"https:\/\/phpgl.net\/examples\/00-about-examples.html\" target=\"_blank\" rel=\"noopener\">examples<\/a>:<br \/>\n        <img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/10\/flappy-elephpant.gif\"\/>\n    <\/li>\n<\/ul>\n<h2 id=\"ai\">AI<\/h2>\n<ul>\n<li><a href=\"https:\/\/adamadam.blog\/2024\/09\/09\/generating-a-mysql-parser-with-ai-google-gemini\/\" target=\"_blank\" rel=\"noopener\">Generating 1MB of PHP code with AI, a story of MySQL query parser<\/a> by Adam Zieli\u0144ski.<\/li>\n<li><a href=\"https:\/\/dev.to\/robertobutti\/consuming-http-streams-in-php-with-symfony-http-client-and-ollama-api-p9g\" target=\"_blank\" rel=\"noopener\">Consuming HTTP Streams in PHP with Symfony HTTP Client and Ollama API<\/a> by Roberto Butti.<\/li>\n<li><a href=\"https:\/\/github.com\/echolabsdev\/prism\" target=\"_blank\" rel=\"noopener\">echolabsdev\/prism<\/a> \u2013 A unified interface for working with LLMs in Laravel.<\/li>\n<li><a href=\"https:\/\/github.com\/use-the-fork\/synapse\" target=\"_blank\" rel=\"noopener\">use-the-fork\/synapse<\/a> \u2013 Seamless integration and management of AI agents within Laravel applications. Inspired by Langchain.<\/li>\n<\/ul>\n<h2 id=\"frameworks\">Frameworks<\/h2>\n<ul>\n<li><strong>Symfony turned 19 ?<\/strong><br \/>\n        <a href=\"https:\/\/x.com\/symfony\/status\/1847155843478786501\" target=\"_blank\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/10\/symfony_annuversary.png\" alt=\"\" width=\"60%\"><\/a>\n    <\/li>\n<li><a href=\"https:\/\/symfony.com\/blog\/category\/living-on-the-edge\/7.2\" target=\"_blank\" rel=\"noopener\">New in Symfony 7.2<\/a> by Javier Eguiluz.<\/li>\n<li><a href=\"https:\/\/christoph-rumpel.com\/2024\/9\/all-laravel-php-attributes-at-your-disposal\" target=\"_blank\" rel=\"noopener\">All Laravel PHP Attributes at Your Disposal<\/a> by Christoph Rumpel.<\/li>\n<li><a href=\"https:\/\/www.daveyshafik.com\/archives\/70916-laravel-pipelines-and-composable-job-middleware.html\" target=\"_blank\" rel=\"noopener\">Laravel Pipelines &amp; Composable Job Middleware<\/a> by Davey Shafik.<\/li>\n<li><a href=\"https:\/\/github.com\/olivernybroe\/collector-intellij\" target=\"_blank\" rel=\"noopener\">olivernybroe\/collector-intellij<\/a> \u2013 A PhpStorm plugin for Laravel Collections.<\/li>\n<\/ul>\n<h2 id=\"misc\">Misc<\/h2>\n<ul>\n<li><a href=\"https:\/\/jolicode.com\/blog\/php-object-lazy-loading-is-more-than-what-you-think\" target=\"_blank\" rel=\"noopener\">PHP Object Lazy-Loading is More Than What You Think<\/a> by Baptiste Leduc.<\/li>\n<li><a href=\"https:\/\/tideways.com\/profiler\/blog\/php-8-4-property-hooks-can-we-get-rid-of-getters-setters-now-a-benchmark\" target=\"_blank\" rel=\"noopener\">PHP 8.4 Property Hooks: Can we get rid of getters\/setters now? A benchmark<\/a> by Benjamin Eberlei.<\/li>\n<li><a href=\"https:\/\/tideways.com\/profiler\/blog\/how-we-use-hyperfine-to-measure-php-engine-performance\" target=\"_blank\" rel=\"noopener\">How we use hyperfine to measure PHP Engine performance<\/a> by Benjamin Eberlei.<\/li>\n<li><a href=\"https:\/\/blog.codito.dev\/2022\/11\/composer-binary-only-docker-images\/\" target=\"_blank\" rel=\"noopener\">Composer: binary-only Docker images<\/a> by Grzegorz Korba.<\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=dCuefNScYKM\" target=\"_blank\" rel=\"noopener\">I built an app using a single index.php file, here&#8217;s how it went<\/a> by Andrew Schmelyun.<\/li>\n<li><a href=\"https:\/\/dev.to\/realflowcontrol\/too-double-quote-or-not-thats-the-question-78l\" target=\"_blank\" rel=\"noopener\">To double quote or not, that&#8217;s the question!<\/a> by Florian Engelhardt.<\/li>\n<li><a href=\"https:\/\/blog.devgenius.io\/building-resilient-and-scalable-systems-by-default-ac6ca5c2083b\" target=\"_blank\" rel=\"noopener\">Building Resilient and Scalable Systems by default<\/a> by Dariusz Gafka.<\/li>\n<li><a href=\"https:\/\/x.com\/exakat\/status\/1837528507942883474\" target=\"_blank\"><br \/>\n        <img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/10\/exakat_anon_class.png\" alt=\"\" width=\"60%\"><br \/>\n    <\/a>\n    <\/li>\n<li><a href=\"https:\/\/watzon.tech\/blog\/rediscovering-php-a-modern-alternative-to-javascript-fatigue\" target=\"_blank\" rel=\"noopener\">Rediscovering PHP: A Modern Alternative to JavaScript Fatigue<\/a> by Christopher Watson.<\/li>\n<li><a href=\"https:\/\/tomasvotruba.com\/blog\/php-is-the-best-choice-for-long-term-business\" target=\"_blank\" rel=\"noopener\">PHP is the Best Choice for Long\u2011Term Business<\/a> by Tomas Votruba.<\/li>\n<\/ul>\n<h2 id=\"conferences\">Conferences<\/h2>\n<p>These PHP events are all worth a visit, and some are still accepting presentation proposals:<\/p>\n<ul>\n<li><a href=\"https:\/\/laracon.au\/\" target=\"_blank\" rel=\"noopener\">Laracon AU<\/a> \u2013 Brisbane, Australia, November 7\u20138.<\/li>\n<li><a href=\"https:\/\/phpconference.com\/munich\/\" target=\"_blank\" rel=\"noopener\">International PHP Conference<\/a> \u2013 Munich, Germany, November 11\u201215.<\/li>\n<li><a href=\"https:\/\/live.symfony.com\/2024-vienna-con\/\" target=\"_blank\" rel=\"noopener\">SymfonyCon 2024<\/a> \u2013 Vienna, Austria, December 5\u20136.<\/li>\n<li><a href=\"https:\/\/laracon.eu\/\" target=\"_blank\" rel=\"noopener\">Laracon EU 2025<\/a> \u2013 Amsterdam, The Netherlands, February 3\u20134.<\/li>\n<li><a href=\"https:\/\/www.phpconference.co.uk\/\" target=\"_blank\" rel=\"noopener\">PHP UK Conference 2025<\/a> \u2013 London, UK, February 19.<\/li>\n<li><a href=\"https:\/\/phpcon-odawara.jp\/2025\/\" target=\"_blank\" rel=\"noopener\">PHP Conference Odawara 2025<\/a> \u2013 Japan, April 12, 2025. ?<\/li>\n<li><a href=\"https:\/\/phptek.io\/\" target=\"_blank\" rel=\"noopener\">php[tek] 2025<\/a> \u2013 Chicago, IL, USA, May 20-22. <a href=\"https:\/\/sessionize.com\/phptek-2025\" target=\"_blank\" rel=\"noopener\">CFP<\/a><\/li>\n<\/ul>\n<p>To find a PHP meetup happening near you, check out <a href=\"https:\/\/www.php.net\/cal.php?cm=05&amp;cy=2024\" target=\"_blank\" rel=\"noopener\">the calendar on php.net<\/a>.<\/p>\n<h2 id=\"fun\">Fun<\/h2>\n<ul>\n<li><strong><a href=\"https:\/\/code-golf.io\/fizz-buzz#php\" target=\"_blank\" rel=\"noopener\">Fizz-Buzz in 56 characters?<\/a><\/strong>\n<p>        On the <a href=\"https:\/\/code-golf.io\/\" target=\"_blank\" rel=\"noopener\">code-golf.io<\/a> site, you can compete to implement the shortest solutions to simple programming problems. For example, try writing the shortest FizzBuzz code in PHP \u2014 currently at just 56 characters! <\/p>\n<p>        Well, my naive solution counts 72 chars. Can you do better?<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\" data-enlighter-title=\"\">for(;$i++&lt;100;)echo$i%15?($i%3?($i%5?$i:&#039;Buzz&#039;):&#039;Fizz&#039;):&#039;FizzBuzz&#039;,&quot;\\n&quot;;<\/pre>\n<\/li>\n<\/ul>\n<hr>\n<p>If you have any interesting or useful links to share via PHP Annotated, please leave a comment on this post or let us know <a href=\"https:\/\/twitter.com\/pronskiy\" target=\"_blank\" rel=\"noopener\">on X\/Twitter<\/a>.<\/p>\n<p style=\"text-align: left;\" align=\"center\"><a style=\"color: white\" class=\"jb-download-button\" title=\"Complete this form and get PHP Annotated Monthly delivered fresh to your email\" href=\"https:\/\/info.jetbrains.com\/PHP-Annotated-Subscription.html\" target=\"_blank\" rel=\"noopener\">Subscribe to PHP Annotated<\/a><\/p>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                                                            <div class=\"about-author__box-img\">\n                            <img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/07\/php-annotated-roman.png\" alt=\"\" loading=\"lazy\">\n                        <\/div>\n                                        <div class=\"about-author__box-text\">\n                                                    <h4>Roman Pronskiy<\/h4>\n                                                <p>Developer Advocate at <a href=\"https:\/\/twitter.com\/PhpStorm\" target=\"_blank\" rel=\"noopener\">@PhpStorm<\/a>, Executive Director at <a href=\"https:\/\/twitter.com\/ThePHPF\" target=\"_blank\" rel=\"noopener\">@The&nbsp;PHP&nbsp;Foundation<\/a>.<\/p>\n<p><a href=\"https:\/\/twitter.com\/pronskiy\" target=\"_blank\" rel=\"noopener\">Twitter<\/a> | <a href=\"https:\/\/github.com\/pronskiy\" target=\"_blank\" rel=\"noopener\">GitHub<\/a><\/p>\n                    <\/div>\n                            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":869,"featured_media":522444,"comment_status":"closed","ping_status":"closed","template":"","categories":[],"tags":[2213,190,8111,8504,2323,2648,191],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/phpstorm\/522428"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/phpstorm"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/types\/phpstorm"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/users\/869"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/comments?post=522428"}],"version-history":[{"count":11,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/phpstorm\/522428\/revisions"}],"predecessor-version":[{"id":565573,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/phpstorm\/522428\/revisions\/565573"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media\/522444"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media?parent=522428"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/categories?post=522428"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/tags?post=522428"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/cross-post-tag?post=522428"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}