{"id":541415,"date":"2025-01-29T12:26:50","date_gmt":"2025-01-29T11:26:50","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=phpstorm&#038;p=541415"},"modified":"2025-05-06T16:21:57","modified_gmt":"2025-05-06T15:21:57","slug":"php-annotated-january-2025","status":"publish","type":"phpstorm","link":"https:\/\/blog.jetbrains.com\/de\/phpstorm\/2025\/01\/php-annotated-january-2025","title":{"rendered":"PHP Annotated \u2013 January 2025"},"content":{"rendered":"<p><a href=\"https:\/\/blog.jetbrains.com\/phpstorm\/2025\/01\/php-annotated-january-2025\/\"><img decoding=\"async\" class=\"alignnone size-full\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/ps-featured_blog_1280x720_en.png\" alt=\"PHP Annotated\" width=\"900\"><\/a><\/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<p>Welcome to the January 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, we\u2019ve done it for you.<\/p>\n<p><!--more--><\/p>\n<h2 id=\"highlights\">Highlights<\/h2>\n<ul>\n<li>\n<h3><a href=\"https:\/\/www.php.net\/releases\/8.4\/\" target=\"_blank\" rel=\"noopener\">PHP 8.4<\/a><\/h3>\n<p>        PHP 8.4 was officially released on November 21, 2024, and by now, version 8.4.3 is already available.<\/p>\n<p>        This major language update brings many new features, such as property hooks, asymmetric visibility, an updated DOM API, performance improvements, bug fixes, and general code cleanup.<\/p>\n<p>        If you want to learn more about all the goodies in the release, visit <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>        There are also some lesser known improvements that you can learn more about from the Tideways blog:<\/p>\n<ul>\n<li><a href=\"https:\/\/tideways.com\/profiler\/blog\/php-8-4-improves-closure-naming-for-simplified-debugging\" target=\"_blank\" rel=\"noopener\">PHP 8.4 improves Closure Naming for simplified debugging<\/a>.<\/li>\n<li><a href=\"https:\/\/tideways.com\/profiler\/blog\/whats-new-in-php-8-4-in-terms-of-performance-debugging-and-operations\" target=\"_blank\" rel=\"noopener\">What\u2019s new in PHP 8.4 in terms of performance, debugging, and operations<\/a>.<\/li>\n<\/ul>\n<p>        <strong>Install or upgrade to PHP 8.4<\/strong><\/p>\n<ul>\n<li>Windows: Compiled binaries available at <a href=\"http:\/\/windows.php.net\" target=\"_blank\" rel=\"noopener\">windows.php.net<\/a>.<\/li>\n<li>Fedora\/RHEL\/CentOS: Available as a software collection (php84) from the <a href=\"https:\/\/blog.remirepo.net\/\" target=\"_blank\" rel=\"noopener\">Remi repo<\/a>.<\/li>\n<li>macOS: PHP 8.4 can be installed via Homebrew using the <a href=\"https:\/\/github.com\/shivammathur\/homebrew-php\/packages\" target=\"_blank\" rel=\"noopener\">shivammathur\/homebrew-php<\/a> tap.<\/li>\n<li>Docker: PHP 8.4 images are now available on <a href=\"https:\/\/hub.docker.com\/_\/php\" target=\"_blank\" rel=\"noopener\">Docker Hub<\/a> with <a href=\"https:\/\/hub.docker.com\/_\/php\/tags?page=1&amp;name=8.4\" target=\"_blank\" rel=\"noopener\">8.4 tags<\/a>.<\/li>\n<li><a href=\"https:\/\/herd.laravel.com\/\" target=\"_blank\" rel=\"noopener\">Herd<\/a> also comes with PHP 8.4 supported.<\/li>\n<\/ul>\n<p>        Watch a ? <a href=\"https:\/\/www.youtube.com\/live\/1AL2oDt9q38\" target=\"_blank\" rel=\"noopener\">Celebrating PHP 8.4<\/a> stream with Nicolas, Brent, and Roman:<br \/>\n        <iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/1AL2oDt9q38?si=0fCv3BcMeWpwGBMg\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n    <\/li>\n<li>\n<h3>PHP 8.2 goes in security-fixes-only phase<\/h3>\n<p>        Starting this year, PHP versions now follow <a href=\"https:\/\/wiki.php.net\/rfc\/release_cycle_update\" target=\"_blank\" rel=\"noopener\"><strong>a four-year support timeline<\/strong><\/a>: two years of active support followed by two years of security fixes.<\/p>\n<p>        For PHP 8.1 security patches will be provided until December 31, 2025, while PHP 8.2 will be maintained until December 31, 2026. The recent <a href=\"https:\/\/www.php.net\/releases\/8_2_27.php\" target=\"_blank\" rel=\"noopener\">PHP 8.2.27<\/a> release marked the end of its active support phase.\n    <\/li>\n<li>\n<h3><a href=\"https:\/\/phpstan.org\/blog\/phpstan-2-0-released-level-10-elephpants\" target=\"_blank\" rel=\"noopener\">PHPStan 2.0 has been released<\/a><\/h3>\n<p>        This update introduces Level 10 code analysis with stricter handling of mixed types, and adds support for the List type. You can also expect reduced memory consumption and improved performance.<\/p>\n<p>        Markus Staab shares interesting technical insights about improving PHPStan:<br \/>\n        <a href=\"https:\/\/staabm.github.io\/2024\/11\/26\/phpstan-mixed-types.html\" target=\"_blank\" rel=\"noopener\">A mixed type PHPStan journey<\/a>, <a href=\"https:\/\/staabm.github.io\/2024\/11\/17\/phpstan-performance-on-different-hardware.html\" target=\"_blank\" rel=\"noopener\">PHPStan performance on different hardware<\/a>, <a href=\"https:\/\/staabm.github.io\/2024\/11\/28\/phpstan-php-version-in-scope.html\" target=\"_blank\" rel=\"noopener\">My new PHPStan focus: multi-phpversion support<\/a>.\n    <\/li>\n<li>\n<h3>? <a href=\"https:\/\/thephp.foundation\/blog\/2024\/11\/22\/php-foundation-turns-three\/\" target=\"_blank\" rel=\"noopener\">The PHP Foundation turned three<\/a><\/h3>\n<\/p>\n<p>        The PHP Foundation was established <a href=\"https:\/\/blog.jetbrains.com\/phpstorm\/2021\/11\/the-php-foundation\/\">three years ago<\/a>. Over the past year, the PHP Foundation has supported the work of ten <a href=\"https:\/\/thephp.foundation\/structure\/#core_developers\" target=\"_blank\" rel=\"noopener\">core developers<\/a>, and made a significant contribution to the PHP language.<\/p>\n<p>        Consider <a href=\"https:\/\/thephp.foundation\/donate\/\" target=\"_blank\" rel=\"noopener\">supporting<\/a> the PHP Foundation via <a href=\"https:\/\/opencollective.com\/phpfoundation\" target=\"_blank\" rel=\"noopener\">OpenCollective<\/a> or <a href=\"https:\/\/github.com\/sponsors\/thephpf\" target=\"_blank\" rel=\"noopener\">GitHub Sponsors<\/a>.<\/p>\n<p>        The PHP Foundation has been also active with developments:<\/p>\n<ul>\n<li><a href=\"https:\/\/thephp.foundation\/blog\/2024\/11\/01\/how-hooks-happened\/\" target=\"_blank\" rel=\"noopener\">PHP 8.4: How Property Hooks Happened<\/a> \u2013 Larry Garfield details the decade-long journey of implementing Property Hooks in PHP 8.4.<\/li>\n<li>The PHP Installer for Extensions <a href=\"https:\/\/github.com\/php\/pie\" target=\"_blank\" rel=\"noopener\">php\/pie<\/a> reached version 0.5!<br \/>\n                Learn more about it from <a href=\"https:\/\/blog.codito.dev\/2024\/11\/pie-new-extension-installer-for-php\/\" target=\"_blank\" rel=\"noopener\">Pie: new extension installer for PHP<\/a> post by Grzegorz Korba.\n            <\/li>\n<\/ul>\n<\/li>\n<li>\n<h3><a href=\"https:\/\/github.com\/rectorphp\/rector\/releases\/tag\/2.0.0\" target=\"_blank\" rel=\"noopener\">Rector 2.0<\/a><\/h3>\n<p>\n        This major release updates dependencies (PHPStan 2 and PHP-Parser 5), runs 10\u201315% faster, and has <a href=\"https:\/\/getrector.com\/blog\/5-new-features-in-rector-20\" target=\"_blank\" rel=\"noopener\">5 new features<\/a>.\n    <\/li>\n<li>\n<h3><a href=\"https:\/\/dunglas.dev\/2024\/11\/frankenphp-1-3-massive-performance-improvements-watcher-mode-dedicated-prometheus-metrics-and-more\/\" target=\"_blank\" rel=\"noopener\">FrankenPHP 1.3<\/a><\/h3>\n<p>\n        In this release, expect performance improvements, watcher mode, dedicated Prometheus metrics, and more.\n    <\/li>\n<li>\n<h3><a href=\"https:\/\/packagist.com\/features\/conductor\" target=\"_blank\" rel=\"noopener\">Conductor &#8211; Automatic dependency updates for Composer<\/a><\/h3>\n<p>\n        The Packagist team announced a new tool that is similar to Dependabot, but specifically tailored to PHP projects.\n    <\/li>\n<li>\n<h3><a href=\"https:\/\/x.com\/s0yuka\/status\/1863908809317486635\" target=\"_blank\">You can now run code examples directly on the php.net website<\/a><\/h3>\n<p>\n        <img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/Screenshot-2025-01-28-at-10.19.06-AM.png\" alt=\"\" width=\"670\">\n    <\/li>\n<\/ul>\n<h2 id=\"php-core\">PHP Core<\/h2>\n<ul>\n<li>\n<h3>\u2705 <a href=\"https:\/\/wiki.php.net\/rfc\/curl_share_persistence_improvement\" target=\"_blank\" rel=\"noopener\">RFC: Add persistent curl share handles<\/a><\/h3>\n<\/p>\n<p>        PHP 8.5 will bring 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.<\/p>\n<p>        Persistence allows PHP scripts to eliminate the overhead of establishing a connection (and DNS lookups, SSL session IDs, etc.) and can improve performance and reliability.\n    <\/li>\n<li>\n<h3>\u2705 <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>        In PHP 8.5 it will be possible to use closures in previously<\/p>\n<ul>\n<li>In attribute parameters,<\/li>\n<li>As default values of properties and parameters.<\/li>\n<li>Constants and class constants.<\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\" data-enlighter-title=\"\">\n&lt;?php\n\nclass Foo\n{\n    public static Closure $callback = static function ($item) { echo &quot;Hello world&quot;; };\n}\n\n\nfunction my_array_filter(\n    array $array,\n    Closure $callback = static function ($item) { return !empty($item); },\n) {\n    \/\/ ...\n}\n<\/pre>\n<\/li>\n<li>\n<h3>\u2705 <a href=\"https:\/\/wiki.php.net\/rfc\/attributes-on-constants\" target=\"_blank\" rel=\"noopener\">RFC: Attributes on Constants<\/a><\/h3>\n<p>        Attributes were first introduced in the <a href=\"https:\/\/wiki.php.net\/rfc\/attributes_v2\" target=\"_blank\" rel=\"noopener\">RFC: Attributes v2<\/a>. Daniel Scherzer proposes to add support for attributes on compile-time non-class constants.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\" data-enlighter-title=\"\">\n#[\\MyAttribute]\nconst EXAMPLE = 1;\n<\/pre>\n<\/li>\n<li>\n<h3>\u2705 <a href=\"https:\/\/wiki.php.net\/rfc\/error_backtraces_v2\" target=\"_blank\" rel=\"noopener\">RFC: Error Backtraces v2<\/a><\/h3>\n<\/p>\n<p>        Previously, unlike exceptions, PHP errors did not provide backtraces, which made it difficult to figure out their underlying cause. PHP 8.5 will come with a new ini setting <code>fatal_error_backtraces=1<\/code> which will generate detailed error messages and trace for <code>E_ERROR<\/code>s.\n    <\/li>\n<li>\n<h3>? <a href=\"https:\/\/wiki.php.net\/rfc\/records\" target=\"_blank\" rel=\"noopener\">RFC: Records<\/a> vs. <a href=\"https:\/\/wiki.php.net\/rfc\/dataclass\" target=\"_blank\" rel=\"noopener\">RFC: Data Class<\/a> vs. <a href=\"https:\/\/wiki.php.net\/rfc\/structs-v2\" target=\"_blank\" rel=\"noopener\">RFC: Structs<\/a><\/h3>\n<p>        Apparently, there is a big interest in the community to add a simple native way of creating <a href=\"https:\/\/en.wikipedia.org\/wiki\/Value_object\" target=\"_blank\" rel=\"noopener\">Value Objects<\/a> in PHP.<\/p>\n<p>        Which one would you prefer?\n    <\/li>\n<li>\n        <iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/BvAcP6RtlAA?si=czt_aNe3rM29YuMr\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n    <\/li>\n<\/ul>\n<h2 id=\"tools\">Tools<\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/ringPHP\/php-mrloop\" target=\"_blank\" rel=\"noopener\">ringPHP\/php-mrloop<\/a> \u2013 A PHP port of the mrloop eventware designed to harness the powers of <code>io_uring<\/code>. Read an <a href=\"https:\/\/agiroloki.medium.com\/introducing-ext-mrloop-f85ed4d8881d\" target=\"_blank\" rel=\"noopener\">Introducing ext-mrloop<\/a> blog post to learn why io_ring is better than <code>select()<\/code>, <code>poll()<\/code>, and <code>epoll()<\/code> async io implementations.<\/li>\n<li><a href=\"https:\/\/github.com\/loupe-php\/loupe\" target=\"_blank\" rel=\"noopener\">loupe-php\/loupe<\/a> \u2013 A full text search engine with tokenization, stemming, typo tolerance, filters, and geo support based on only PHP and SQLite.<\/li>\n<li><a href=\"https:\/\/github.com\/twigstan\/twigstan\" target=\"_blank\" rel=\"noopener\">twigstan\/twigstan<\/a> \u2013 TwigStan is a static analyzer for Twig templates powered by PHPStan.<\/li>\n<li><a href=\"https:\/\/github.com\/azjezz\/psl\/\" target=\"_blank\" rel=\"noopener\">azjezz\/psl<\/a> \u2013 A modern, consistent, centralized, well-typed, non-blocking set of APIs for PHP programmers.<\/li>\n<li><a href=\"https:\/\/endor.dev\/s\/lamp84\" target=\"_blank\" rel=\"noopener\">Full LAMP Sandbox<\/a> \u2013 (PHP + WebServer + DB) <a href=\"https:\/\/docs.endor.dev\/faq\/general\/\" target=\"_blank\" rel=\"noopener\">running 100% inside your browser<\/a>.<\/li>\n<li><a href=\"https:\/\/github.com\/carthage-software\/mago\" target=\"_blank\" rel=\"noopener\">carthage-software\/mago<\/a> \u2013 A toolchain for PHP that aims to provide a set of tools to help developers write better code. Built in Rust.<\/li>\n<li><a href=\"https:\/\/github.com\/smoqadam\/pvm\" target=\"_blank\" rel=\"noopener\">smoqadam\/pvm<\/a> \u2013 A simple bash script to manage multiple PHP versions on Linux and macOS.<\/li>\n<li><a href=\"https:\/\/github.com\/tnylea\/php-ext\" target=\"_blank\" rel=\"noopener\">tnylea\/php-ext<\/a> \u2013 A Chrome extension to show PHP (Laravel) devtools console.<\/li>\n<li><a href=\"https:\/\/github.com\/phikiphp\/phiki\" target=\"_blank\" rel=\"noopener\">phikiphp\/phiki<\/a> \u2013 Syntax highlighting powered by TextMate grammars in PHP.<\/li>\n<li><a href=\"https:\/\/github.com\/coduo\/php-humanizer\" target=\"_blank\" rel=\"noopener\">coduo\/php-humanizer<\/a> \u2013 A useful tool to transform different strings and numbers to human-readable form.<\/li>\n<li><a href=\"https:\/\/docs.roadrunner.dev\/docs\/releases\/v2024-3-0\" target=\"_blank\" rel=\"noopener\">RoadRunner v2024.3.0<\/a> \u2013 The PHP application server got a major update with <a href=\"https:\/\/docs.roadrunner.dev\/docs\/php-worker\/auto-scaling\" target=\"_blank\" rel=\"noopener\">auto workers scaling<\/a>.<\/li>\n<\/ul>\n<h2 id=\"ai\">AI<\/h2>\n<ul>\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. Supports Anthropic, DeepSeek, Gemini, Groq, Mistral, Ollama, OpenAI, and xAI APIs.\n<p>        Also extensible with <a href=\"https:\/\/github.com\/jordan-price\/toolbox\" target=\"_blank\" rel=\"noopener\">jordan-price\/toolbox<\/a>.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/CodeWithKyrian\/whisper.php\" target=\"_blank\" rel=\"noopener\">CodeWithKyrian\/whisper.php<\/a> \u2013 Local Speech to Text in PHP made easy thanks to Whisper.cpp and OpenAI.<\/li>\n<li><a href=\"https:\/\/github.com\/deepseek-php\/deepseek-php-client\" target=\"_blank\" rel=\"noopener\">deepseek-php\/deepseek-php-client<\/a> \u2013 Supercharged community-maintained PHP API client that allows you to interact with deepseek API.<\/li>\n<\/ul>\n<h2 id=\"phpstorm\">PhpStorm<\/h2>\n<ul>\n<li>\n<h3><a href=\"https:\/\/blog.jetbrains.com\/phpstorm\/2024\/11\/phpstorm-2024-3-is-now-available\/\">PhpStorm 2024.3 is now available<\/a><\/h3>\n<\/p>\n<p>        The new PhpStorm comes with full PHP 8.4 support, inline AI prompts, Laravel Herd support.<\/p>\n<p>        Support for <code>.env<\/code> files <a href=\"https:\/\/blog.jetbrains.com\/phpstorm\/2025\/01\/support-for-env-files\/\">is now built into PhpStorm<\/a>. Previously it required installing a separate plugin.<\/p>\n<p>        JetBrains also announced a closed beta for <a href=\"https:\/\/blog.jetbrains.com\/junie\/2025\/01\/meet-junie-your-coding-agent-by-jetbrains\/\"><strong>Junie, AI Coding Agent<\/strong><\/a> for IDEs.\n    <\/li>\n<li><a href=\"https:\/\/plugins.jetbrains.com\/plugin\/26121-metastorm\/edit\" target=\"_blank\" rel=\"noopener\">MetaStorm<\/a> \u2013 This plugin allows extending PhpStorm\u2019s behaviour and adding support for your custom frameworks with a few lines in a config file. It unlocks both references and autocompletion at regular places such as <code>method($object,<property of object>), render(<file name>)<\/code>, etc.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/buggregator\/phpstorm-plugin\" target=\"_blank\" rel=\"noopener\">buggregator\/phpstorm-plugin<\/a> \u2013 This plugin works in the pair with <a href=\"https:\/\/github.com\/buggregator\/trap\" target=\"_blank\" rel=\"noopener\">buggregator\/trap<\/a> and allows dumping and debugging PHP projects just inside the IDE. Supports VarDumper server, Xhprof profiler, local SMTP server, local Sentry, and much more.<\/li>\n<li><a href=\"https:\/\/plugins.jetbrains.com\/plugin\/26412-cron--crontab-support\/edit\" target=\"_blank\" rel=\"noopener\">Cron &amp; Crontab Support Plugin<\/a>\n    <\/li>\n<\/ul>\n<h2 id=\"frameworks\">Frameworks<\/h2>\n<ul>\n<li>\n<h3><a href=\"https:\/\/github.com\/symfony\/symfony\/pull\/59032\" target=\"_blank\" rel=\"noopener\">Symfony 7.2.0 has been released<\/a><\/h3>\n<p>\n        Check the <a href=\"https:\/\/symfony.com\/blog\/category\/living-on-the-edge\/7.2\" target=\"_blank\" rel=\"noopener\">Living on the Edge<\/a> category on this blog to learn about the main features of this new stable release.\n    <\/li>\n<li>\n<h3><a href=\"https:\/\/new.drupal.org\/drupal-cms\" target=\"_blank\" rel=\"noopener\">Drupal CMS<\/a><\/h3>\n<p>\n        Previously known as <a href=\"https:\/\/www.drupal.org\/about\/starshot\" target=\"_blank\" rel=\"noopener\">Drupal Starshot Initiative<\/a>, Drupal CMS is the new way of creating web apps based on Drupal with no-code building experience.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/thedevdojo\/wave\" target=\"_blank\" rel=\"noopener\">thedevdojo\/wave<\/a> \u2013 The SaaS starter kit based on Laravel.<\/li>\n<li><a href=\"https:\/\/adamadam.blog\/2025\/01\/08\/wordpress-as-a-git-repo\/\" target=\"_blank\" rel=\"noopener\">WordPress as a git repo<\/a> by Adam Zieli\u0144ski \u2013 A promising addition that might be landed in WordPress core, allowing using markdown files as a backend for WordPress site.<\/li>\n<li><a href=\"https:\/\/www.geocod.io\/code-and-coordinates\/2025-01-13-how-geocodio-keeps-300M-addresses-up-to-date\/\" target=\"_blank\" rel=\"noopener\">How Geocodio keeps 300M addresses up to date<\/a> with Laravel and SQLite.<\/li>\n<li><a href=\"https:\/\/github.com\/Naoray\/laravel-github-monolog\" target=\"_blank\" rel=\"noopener\">Naoray\/laravel-github-monolog<\/a> \u2013 Laravel log Channel for GitHub issues.<\/li>\n<\/ul>\n<h2 id=\"misc\">Misc<\/h2>\n<ul>\n<li><a href=\"https:\/\/davorminchorov.com\/articles\/building-maintainable-php-applications-data-transfer-objects\" target=\"_blank\" rel=\"noopener\">Building Maintainable PHP Applications: Data Transfer Objects<\/a> by Davor Minchorov.<\/li>\n<li><a href=\"https:\/\/jump24.co.uk\/journal\/playtime-with-php-attributes\/\" target=\"_blank\" rel=\"noopener\">Playtime with PHP Attributes<\/a> by Pete Wond.<\/li>\n<li><a href=\"https:\/\/tomasvotruba.com\/blog\/why-final-classes-make-rector-and-phpstan-more-powerful\" target=\"_blank\" rel=\"noopener\">Why Final Classes make Rector and PHPStan more powerful<\/a> by Tomas Votruba.<\/li>\n<li><a href=\"https:\/\/phpfashion.com\/en\/property-hooks-in-php-8-4-game-changer-or-hidden-trap\" target=\"_blank\" rel=\"noopener\">Property Hooks in PHP 8.4: Game Changer or Hidden Trap?<\/a> by David Grudl.<\/li>\n<li><a href=\"https:\/\/stitcher.io\/blog\/php-version-stats-january-2025\" target=\"_blank\" rel=\"noopener\">PHP version stats: January, 2025<\/a> by Brent.<\/li>\n<li><a href=\"https:\/\/chrastecky.dev\/programming\/unleash-feature-flags-in-php\" target=\"_blank\" rel=\"noopener\">Unleash: Feature flags in PHP<\/a> by Dominik Chr\u00e1steck\u00fd.<\/li>\n<li><a href=\"https:\/\/heera.it\/the-dangers-of-phps-unserialize-and-how-to-stay-safe\" target=\"_blank\" rel=\"noopener\">The Dangers of PHP\u2019s unserialize and How to stay safe<\/a> by Sheikh Heera.<\/li>\n<li><a href=\"https:\/\/f2r.github.io\/en\/stop-using-pseudo-types\" target=\"_blank\" rel=\"noopener\">Stop using Pseudo-Types<\/a> by Fr\u00e9d\u00e9ric Bouchery.<\/li>\n<li><a href=\"https:\/\/jonathanpurvis.co.uk\/importing-1-7-billion-rows-of-csv-data-from-stripe-with-php\/\" target=\"_blank\" rel=\"noopener\">Importing 1.7 billion rows of CSV data from Stripe<\/a> by Jon Purvis.<\/li>\n<li><a href=\"https:\/\/github.com\/azjezz\/php-pretty-diff\" target=\"_blank\" rel=\"noopener\">azjezz\/php-pretty-diff<\/a> \u2013 A nice demo repository on how to use Rust code in a PHP project with FFI.<\/li>\n<li>\n        TIL: You can use #\ufe0f\u20e3 emoji instead of <code>#<\/code> symbol in comments and attributes in PHP!<br \/>\n        <a href=\"https:\/\/x.com\/joshmanders\/status\/1862869552620511596\" target=\"_blank\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/Screenshot-2025-01-29-at-12.09.52-PM.png\" width=\"598\"><\/a>\n    <\/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.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:\/\/laracon.in\/\" target=\"_blank\" rel=\"noopener\">Laracon India 2025<\/a> \u2013 Ahmedabad, India, March 8\u20139. <a href=\"https:\/\/docs.google.com\/forms\/d\/e\/1FAIpQLSeuj8ao7NGu-DhfTTZrGXIPO42IZrJnPHUf6Qk_uiHeA0sM0A\/viewform\" target=\"_blank\" rel=\"noopener\">CFP<\/a>\n    <\/li>\n<li><a href=\"https:\/\/phpcon-odawara.jp\/2025\/\" target=\"_blank\" rel=\"noopener\">PHP Conference Odawara 2025<\/a> \u2013 Japan, April 12.<\/li>\n<li><a href=\"https:\/\/phptek.io\/\" target=\"_blank\" rel=\"noopener\">php[tek] 2025<\/a> \u2013 Chicago, IL, USA, May 20\u201322.<\/li>\n<li><a href=\"https:\/\/summit.phpers.pl\/en\/\" target=\"_blank\" rel=\"noopener\">PHPers Summit 2025<\/a> \u2013 Pozna\u0144, Poland, May 24\u201325. <a href=\"https:\/\/summit.phpers.pl\/en\/call-for-papers\" target=\"_blank\" rel=\"noopener\">CFP<\/a>\n    <\/li>\n<li><a href=\"https:\/\/websummercamp.com\/2025\/news\/call-for-papers-for-web-summer-camp-2025-is-now-open\" target=\"_blank\" rel=\"noopener\">Summer Camp<\/a> \u2013 Opatija, Croatia, July 3\u20135. <a href=\"https:\/\/websummercamp.com\/2025\/news\/call-for-papers-for-web-summer-camp-2025-is-now-open\" 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>\n        <iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/AJRGxd9cVaY?si=60IjCDT3uftQYIRo\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n    <\/li>\n<li>\n        <iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/Jk8q7MNeWeQ?si=9iSLt_LsVgPz9chx\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\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":541474,"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\/541415"}],"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=541415"}],"version-history":[{"count":10,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/phpstorm\/541415\/revisions"}],"predecessor-version":[{"id":565572,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/phpstorm\/541415\/revisions\/565572"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media\/541474"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media?parent=541415"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/categories?post=541415"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/tags?post=541415"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/cross-post-tag?post=541415"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}