{"id":490890,"date":"2024-07-05T16:25:50","date_gmt":"2024-07-05T15:25:50","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=phpstorm&#038;p=490890"},"modified":"2025-02-05T11:52:25","modified_gmt":"2025-02-05T10:52:25","slug":"php-annotated-june-2024","status":"publish","type":"phpstorm","link":"https:\/\/blog.jetbrains.com\/de\/phpstorm\/2024\/07\/php-annotated-june-2024","title":{"rendered":"PHP Annotated \u2013 June 2024"},"content":{"rendered":"<p><a href=\"https:\/\/blog.jetbrains.com\/phpstorm\/2024\/07\/php-annotated-june-2024\/\"><img decoding=\"async\" class=\"alignnone size-full\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/ant-social-social_share_blog_1280x720_en-1.png\" alt=\"PHP Annotated\" width=\"900\" \/><\/a><br \/>Welcome to the June edition of PHP Annotated! We&#8217;ll recap the most interesting developments in the PHP community over the past couple of months, featuring handpicked news, articles, tools, and videos.<br \/>\n<!--more--><\/p>\n<p><style>img.alignico {margin-right: 10px;margin-top: 5px;float: left;}  main ul:not([class]):not([id]) li, main .article-section .content ul:not([class]):not([id]) > li {padding-bottom: 18px;}  summary {display: list-item;cursor: pointer;font-style: italic; } main ul:not([class]):not([id]) li, main .article-section .content ul:not([class]):not([id]) > li ul li { padding-bottom: 0;} section.article-section a {color: #7755f3} code {color: red;} #roman-pronskiy,.copy-heading:has(#roman-pronskiy){margin-top: 0;}<\/style>\n<\/p>\n<h2 id=\"highlights\">Highlights<\/h2>\n<ul>\n<li><strong><a href=\"https:\/\/www.php.net\/ChangeLog-8.php#8.1.29\" target=\"_blank\" rel=\"noopener\">PHP 8.1.29<\/a>, <a href=\"https:\/\/www.php.net\/ChangeLog-8.php#8.2.20\" target=\"_blank\" rel=\"noopener\">PHP 8.2.20<\/a>, and <a href=\"https:\/\/www.php.net\/ChangeLog-8.php#8.3.8\" target=\"_blank\" rel=\"noopener\">PHP 8.3.8<\/a> released<\/strong>\n<p>\u2757\ufe0fThese security updates fix <a href=\"https:\/\/github.com\/advisories\/GHSA-vxpp-6299-mxw3\" target=\"_blank\" rel=\"noopener\">CVE-2024-4577<\/a>, <a href=\"https:\/\/github.com\/php\/php-src\/security\/advisories\/GHSA-w8qr-v226-r27w\" target=\"_blank\" rel=\"noopener\">CVE-2024-5458<\/a>, <a href=\"https:\/\/github.com\/php\/php-src\/security\/advisories\/GHSA-9fcc-425m-g385\" target=\"_blank\" rel=\"noopener\">CVE-2024-5585<\/a>, and vulnerability in openssl_private_decrypt() function known as the Marvin attack.<\/p>\n<\/li>\n<li><strong>Happy 29th birthday, PHP!<\/strong><br \/>On June 8, PHP turned 29 years old! For a throwback, check out Rasmus Lerdorf\u2019s <a href=\"https:\/\/groups.google.com\/g\/comp.infosystems.www.authoring.cgi\/c\/PyJ25gZ6z7A\/m\/M9FkTUVDfcwJ\" target=\"_blank\" rel=\"noopener\">initial public announcement of PHP<\/a>.\n<p>I published a video where I compiled and ran the very first version of the language. Witness what PHP was like 29 years ago:<\/p>\n<p><iframe loading=\"lazy\" title=\"YouTube video player\" src=\"https:\/\/www.youtube.com\/embed\/0BPExYh5Anw?si=IpeDWUsdDFHHhxHT\" width=\"560\" height=\"315\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p>Here\u2019s to many more years of empowering developers and pushing the boundaries of web technology. Happy Birthday, PHP! ???<\/p>\n<\/li>\n<li><strong>PHP 8.4<\/strong>\n<p>The next version of the language is shaping up nicely, and the first Alpha has already been tagged. Here\u2019s what\u2019s coming:<\/p>\n<ul>\n<li>Property Hooks<\/li>\n<li><code>new<\/code> without parentheses<\/li>\n<li>New DOM HTML5 support<\/li>\n<li>Many new functions: <code>array_find()<\/code>, <code>array_find_key()<\/code>, <code>array_any()<\/code>, <code>array_all()<\/code>, <code>grapheme_str_split()<\/code>, <code>DateTime(Immutable)::get\/setMicrosecond()<\/code>, <code>DateTime(Immutable)::createFromTimestamp()<\/code>, <code>mb_ucfirst()<\/code>, <code>mb_lcfirst()<\/code>, <code>mb_trim()<\/code>, <code>mb_ltrim()<\/code>, <code>mb_rtrim()<\/code>, <code>http_(get|clear)_last_response_headers()<\/code>, <code>request_parse_body()<\/code>.<\/li>\n<\/ul>\n<p>And on top of that, there are many more cool tidbits. Here are a couple lesser-known ones:<\/p>\n<ul>\n<li><a href=\"https:\/\/php.watch\/versions\/8.4\/pcre2-regexp-syntax-changes\" target=\"_blank\" rel=\"noopener\">PCRE2 Upgrade and Regular Expression Changes<\/a> by PHP.Watch.<\/li>\n<li><a href=\"https:\/\/tideways.com\/profiler\/blog\/new-in-php-8-4-engine-optimization-of-sprintf-to-string-interpolation\" target=\"_blank\" rel=\"noopener\">Engine optimization of sprintf() to string interpolation<\/a> by Benjamin Eberlei.<\/li>\n<\/ul>\n<\/li>\n<li><strong>How many PHP developers are there in the world?<\/strong>\n<p>SlashData, a company specializing in developer surveys, <a href=\"https:\/\/www.slashdata.co\/post\/59-of-developers-use-ai-tools-25-2m-javascript-users\" target=\"_blank\" rel=\"noopener\">has published<\/a> a <a href=\"https:\/\/dashboard-tool-report.cdn.prismic.io\/dashboard-tool-report\/ZmMmh5m069VX1jxc_-W.Kodluyoruz-Programminglanguagecommunities.pdf\" target=\"_blank\" rel=\"noopener\">report<\/a> assessing the demand for programming languages and predicting the size of programming language communities.<\/p>\n<p>According to the report, PHP ranks sixth with 9.8 million developers worldwide.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/slashdata_report_2024.png\" alt=\"\" width=\"800\" \/><\/p>\n<\/li>\n<li><a href=\"https:\/\/dev.mysql.com\/doc\/refman\/9.0\/en\/mysql-nutshell.html\" target=\"_blank\" rel=\"noopener\"><strong>MySQL 9.0 is available<\/strong><\/a><br \/>There aren&#8217;t many new features in it, but the new <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/9.0\/en\/vector.html\" target=\"_blank\" rel=\"noopener\">VECTOR<\/a> column type is probably the most notable one.<\/li>\n<\/ul>\n<h2 id=\"php_core\">PHP Core<\/h2>\n<ul>\n<li><strong>\u2705 <a href=\"https:\/\/wiki.php.net\/rfc\/xmlreader_writer_streams\" target=\"_blank\" rel=\"noopener\">RFC: Add stream open functions to XML{Reader,Writer}<\/a><\/strong><br \/>Thanks to Niels Dossche, PHP 8.4 will have two new methods to create instances of the respective classes from an already open stream: <code>XMLReader::fromStream()<\/code>, <code>XMLWriter::toStream()<\/code>.<\/li>\n<li><strong>? <a href=\"https:\/\/wiki.php.net\/rfc\/static_constructor\" target=\"_blank\" rel=\"noopener\">RFC: Static Constructors<\/a><\/strong><br \/>Erick de Azevedo Lima suggests adding a new <code>__staticConstruct()<\/code> method to initialize static properties of a class before creating an instance.\n<p>Erick demonstrates the current workarounds people use, including in Composer, and analyzes how other languages solve this problem. The suggested solution is inspired by C#.<\/p>\n<\/li>\n<li><strong>? <a href=\"https:\/\/wiki.php.net\/rfc\/static_class\" target=\"_blank\" rel=\"noopener\">RFC: Static class<\/a><\/strong><br \/>Paul Morris suggests adding a new type of class \u2013 static. A static class is declared with the static keyword, and all methods and properties of that class are automatically static.<\/li>\n<li><strong>? <a href=\"https:\/\/wiki.php.net\/rfc\/lazy-objects\" target=\"_blank\" rel=\"noopener\">RFC: Lazy Objects<\/a><\/strong><br \/>Arnaud Le Blanc and Nicolas Grekas propose adding lazy objects to PHP. These objects will be initialized and consume resources only when reading or modifying a property occurs.\n<p>While lazy objects won\u2019t be used directly by most users, they are primarily intended for library and framework authors, allowing them to remove a lot of boilerplate code.<\/p>\n<\/li>\n<li><strong>? <a href=\"https:\/\/wiki.php.net\/rfc\/deprecations_php_8_4\" target=\"_blank\" rel=\"noopener\">RFC: Deprecations for PHP 8.4<\/a><\/strong><br \/>Niels Dossche, Gina Peter Banyard, M\u00e1t\u00e9 Kocsis, Tim D\u00fcsterhus, Kamil Tekiela, and Jorg Sowa have launched an RFC discussion to determine which functionality should be deprecated in PHP 8.4 and removed in PHP 9.0.\n<p>Beware, it has a few controversial suggestions that might affect your projects. Such as deprecating <code>uniqid()<\/code>, <code>md5()<\/code>, <code>sha1()<\/code>, <code>md5_file()<\/code>, and <code>sha1_file()<\/code> functions. So if you disagree with the proposed changes, make sure to voice out your concerns on <a href=\"https:\/\/externals.io\/message\/123816\" target=\"_blank\" rel=\"noopener\">the mailing list<\/a>.<\/p>\n<\/li>\n<\/ul>\n<h2 id=\"phpstorm\">PhpStorm<\/h2>\n<ul>\n<li><a href=\"https:\/\/blog.jetbrains.com\/security\/2024\/06\/updates-for-security-issue-affecting-intellij-based-ides-2023-1-and-github-plugin\/\">Updates for security issue affecting IntelliJ-based IDEs 2023.1+ and JetBrains GitHub Plugin<\/a>.<\/li>\n<li>? <a href=\"https:\/\/youtu.be\/bkdcMa5-RM4\" target=\"_blank\" rel=\"noopener\">PhpStorm for Laravel Developers<\/a> \u2013 3-Hour Full MasterClass by Jeffrey Way.<\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/phpstorm\/2024\/07\/phpstorm-2024-2-eap-highlights\/\">PhpStorm 2024.2 EAP Highlights<\/a> \u2013 The upcoming release of PhpStorm will include support for viewing log files with highlighting and other perks.<\/li>\n<\/ul>\n<h2 id=\"tools\">Tools<\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/dunglas\/frankenphp\/releases\/tag\/v1.2.0\" target=\"_blank\" rel=\"noopener\">FrankenPHP v1.2.0<\/a> \u2013 This update of the PHP application server comes with a built-in Caddy 2.8 web server, support for full-duplex HTTP\/1 connections, and other features.<\/li>\n<li><a href=\"https:\/\/github.com\/buggregator\/server\" target=\"_blank\" rel=\"noopener\">buggregator\/server<\/a> \u2013 Buggregator is the ultimate debugging tool that works as a VarDumper server, Xhprof profiler, local SMTP server, local Sentry, and much more.\n<p>Check out Pavel Buchnev\u2019s post on <a href=\"https:\/\/butschster.medium.com\/profiling-php-applications-with-xhprof-finding-bottlenecks-9ba8cf8944f2\" target=\"_blank\" rel=\"noopener\">Profiling PHP (Laravel)Applications with xhprof<\/a>.<\/p>\n<p>And for some inspo, see <a href=\"https:\/\/gist.github.com\/soderlind\/9b95fa498a4ba1c563cc3d30b03260ab\" target=\"_blank\" rel=\"noopener\">Buggregator for local WordPress development<\/a> configs.<\/p>\n<\/li>\n<li><a href=\"https:\/\/github.com\/php-soap\" target=\"_blank\" rel=\"noopener\">php-soap<\/a> \u2013 A drop-in pure PHP replacement for the ext-soap extension.<\/li>\n<li><a href=\"https:\/\/github.com\/davecheney\/httpstat\" target=\"_blank\" rel=\"noopener\">davecheney\/httpstat<\/a> \u2013 A neat visualization tool for HTTP requests. #notphp<\/li>\n<li><a href=\"https:\/\/github.com\/php-static-analysis\/attributes\" target=\"_blank\" rel=\"noopener\">php-static-analysis\/attributes<\/a> \u2013 This package allows using Attributes instead of PHPDoc annotations for static analysis with PHPStan.\n<p>And if you\u2019re new to attributes, check out this <a href=\"https:\/\/www.honeybadger.io\/blog\/php-attributes-guide\/\" target=\"_blank\" rel=\"noopener\">guide to PHP attributes<\/a> by Ashley Allen.<\/p>\n<\/li>\n<li><a href=\"https:\/\/github.com\/rectorphp\/type-perfect\/\" target=\"_blank\" rel=\"noopener\">rectorphp\/type-perfect<\/a> \u2013 Next level type declaration check PHPStan rules.<\/li>\n<li><a href=\"https:\/\/github.com\/phpstan\/phpstan-doctrine\" target=\"_blank\" rel=\"noopener\">phpstan\/phpstan-doctrine<\/a> \u2013 Doctrine extensions for PHPStan.<br \/>If you\u2019re hesitant to use it, check out this thread about possible problems with types returned from database:<br \/>\n<blockquote class=\"twitter-tweet\" data-dnt=\"true\">\n<p dir=\"ltr\" lang=\"en\">? <a href=\"https:\/\/twitter.com\/hashtag\/phpstan?src=hash&amp;ref_src=twsrc%5Etfw\" target=\"_blank\" rel=\"noopener\">#phpstan<\/a>&#8211;<a href=\"https:\/\/twitter.com\/hashtag\/doctrine?src=hash&amp;ref_src=twsrc%5Etfw\" target=\"_blank\" rel=\"noopener\">#doctrine<\/a> 1.4.4 just received major improvements ?<\/p>\n<p>In <a href=\"https:\/\/twitter.com\/hashtag\/PHP?src=hash&amp;ref_src=twsrc%5Etfw\" target=\"_blank\" rel=\"noopener\">#PHP<\/a>, types returned from database:<br \/>&#8211; differ per platform<br \/>&#8211; differ per driver<br \/>&#8211; changes with PHP versions <br \/>&#8211; changes with driver setup<br \/>&#8211; functions alter those types<\/p>\n<p>What a MESS! Lets continue&#8230;?<\/p>\n<p>\u2014 Jan Nedbal (@janedbal) <a href=\"https:\/\/twitter.com\/janedbal\/status\/1807693081459745065?ref_src=twsrc%5Etfw\" target=\"_blank\" rel=\"noopener\">July 1, 2024<\/a><\/p>\n<\/blockquote>\n<\/li>\n<li><a href=\"https:\/\/github.com\/koriym\/spaceman\" target=\"_blank\" rel=\"noopener\">koriym\/spaceman<\/a> \u2013 Give namespace to un-namespaced legacy PHP code.<\/li>\n<li><a href=\"https:\/\/github.com\/olinox14\/path-php\" target=\"_blank\" rel=\"noopener\">olinox14\/path-php<\/a> \u2013 Object-oriented file and path operations, inspired by the path.py python library.<\/li>\n<li><a href=\"https:\/\/github.com\/cognesy\/instructor-php\" target=\"_blank\" rel=\"noopener\">cognesy\/instructor-php<\/a> \u2013 Structured data outputs with LLMs, in PHP. Designed for simplicity, transparency, and control.<\/li>\n<li><a href=\"https:\/\/github.com\/NumPower\/numpower\" target=\"_blank\" rel=\"noopener\">NumPower\/numpower<\/a> \u2013 A PHP extension for efficient scientific computing and array manipulation with GPU support.\n<p>Check this <a href=\"https:\/\/www.reddit.com\/r\/PHP\/comments\/1dji6s6\/simple_neural_net_in_php_from_scratch_using\/\" target=\"_blank\" rel=\"noopener\">simple neural net build in PHP from scratch using NumPower<\/a>.<\/p>\n<\/li>\n<li><a href=\"https:\/\/github.com\/krakjoe\/parallel\" target=\"_blank\" rel=\"noopener\">krakjoe\/parallel<\/a> \u2013 A succinct parallel concurrency API for PHP. This extension has been updated recently and is now compatible with PHP 8.2 and 8.3.\n<p>Curious about use cases? Check out this example: <a href=\"https:\/\/dev.to\/realflowcontrol\/processing-one-billion-rows-in-php-3eg0\" target=\"_blank\" rel=\"noopener\">Processing One Billion Rows in PHP<\/a>.<\/p>\n<\/li>\n<li><a href=\"https:\/\/github.com\/swoole\/swoole-src\/releases\/tag\/v6.0.0-alpha\" target=\"_blank\" rel=\"noopener\">Swoole<\/a> v6.0.0-alpha \u2013 This alpha release showcases significant changes coming to Swoole, such as multi-threading mode, and support for <a href=\"https:\/\/en.wikipedia.org\/wiki\/Io_uring\" target=\"_blank\" rel=\"noopener\">io_uring<\/a> for file operations.<\/li>\n<li><a href=\"https:\/\/github.com\/seanmorris\/php-wasm\" target=\"_blank\" rel=\"noopener\">seanmorris\/php-wasm<\/a> \u2013 PHP in Browser, powered by WebAssembly. The maintainer is now supported by WordPress, so it has received quite a few interesting updates recently, such as <a href=\"https:\/\/github.com\/seanmorris\/php-wasm?tab=readme-ov-file#loading-extensions-at-runtime\" target=\"_blank\" rel=\"noopener\">loading extensions dynamically<\/a>.\n<p>Version v0.0.9 also includes <code>php-cgi-wasm<\/code>, which executes the php-cgi SAPI and behaves more like the PHP that runs under Apache, and less like the PHP you invoke on the CLI. This allows you to run almost any PHP application completely client-side.<\/p>\n<\/li>\n<\/ul>\n<h2 id=\"symfony\">Symfony<\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/zenstruck\/foundry\" target=\"_blank\" rel=\"noopener\">zenstruck\/foundry<\/a> \u2013 A model factory library for creating expressive, auto-completable, on-demand dev\/test fixtures with Symfony and Doctrine.<\/li>\n<li><a href=\"https:\/\/tomasvotruba.com\/blog\/2-tricks-to-get-your-symfony-configs-lines-to-minimum\/\" target=\"_blank\" rel=\"noopener\">2 Tricks to get your Symfony configs lines to minimum<\/a> by Tomas Votruba.<\/li>\n<li><a href=\"https:\/\/medium.com\/@fernando_28520\/extend-your-symfony-console-app-with-events-and-attributes-ca8ec6321430\" target=\"_blank\" rel=\"noopener\">Extend your Symfony Console app with events and attributes<\/a> by Fernando Castillo.<\/li>\n<li><a href=\"https:\/\/medium.com\/@cyrilgeorgespereira\/multi-tenant-and-symfony-b4b69c187f36\" target=\"_blank\" rel=\"noopener\">Multi-tenant and Symfony<\/a> by Cyril Pereira.<\/li>\n<li>Symfony core member <a href=\"https:\/\/x.com\/OskarStark\" target=\"_blank\">Oskar Stark<\/a> shares nice pull request overviews on his X:<br \/>\n<blockquote class=\"twitter-tweet\" data-dnt=\"true\">\n<p dir=\"ltr\" lang=\"en\">Symfony Pull Request Review?<\/p>\n<p>Starting from <a href=\"https:\/\/twitter.com\/symfony?ref_src=twsrc%5Etfw\" target=\"_blank\" rel=\"noopener\">@symfony<\/a> 7.2, a new mailomat bridge has been added to the Mailer component, enhancing email handling capabilities by integrating with Mailomat&#8217;s remote events. This feature aims to provide a seamless experience for developers working\u2026 <a href=\"https:\/\/t.co\/XAmCYal4Py\" target=\"_blank\">pic.twitter.com\/XAmCYal4Py<\/a><\/p>\n<p>\u2014 Oskar Stark (@OskarStark) <a href=\"https:\/\/twitter.com\/OskarStark\/status\/1808370771837768119?ref_src=twsrc%5Etfw\" target=\"_blank\" rel=\"noopener\">July 3, 2024<\/a><\/p>\n<\/blockquote>\n<\/li>\n<\/ul>\n<h2 id=\"laravel\">Laravel<\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/thedevdojo\/auth\" target=\"_blank\" rel=\"noopener\">thedevdojo\/auth<\/a> \u2013 A plug&#8217;n\u2019play authentication package for any Laravel applicaiton.<\/li>\n<li><a href=\"https:\/\/github.com\/corcel\/corcel\" target=\"_blank\" rel=\"noopener\">corcel\/corcel<\/a> \u2013 A collection of PHP classes built on top of Eloquent ORM to get data directly from a WordPress database.<\/li>\n<li><a href=\"https:\/\/github.com\/kitloong\/laravel-migrations-generator\" target=\"_blank\" rel=\"noopener\">kitloong\/laravel-migrations-generator<\/a> \u2013 Automatically generate your migrations from an existing database schema.<\/li>\n<li><a href=\"https:\/\/alsterholm.com\/blog\/2024\/using-models-as-flags\" target=\"_blank\" rel=\"noopener\">Using Models as Flags<\/a> by Andreas Alsterholm.<\/li>\n<li><a href=\"https:\/\/laravel-news.com\/laravel-validation\" target=\"_blank\" rel=\"noopener\">The ultimate guide to Laravel Validation<\/a> by Ashley Allen.<\/li>\n<li><a href=\"https:\/\/tighten.com\/insights\/use-htmx-to-create-laravel-single-page-apps-without-writing-javascript\/\" target=\"_blank\" rel=\"noopener\">Use HTMX to Create Laravel Single-Page Apps Without Writing JavaScript<\/a> by Nico Devs.<\/li>\n<li><a href=\"https:\/\/msamgan.com\/how-to-contribute-to-laravel-a-step-by-step-guide\" target=\"_blank\" rel=\"noopener\">How to Contribute to Laravel: A Step-by-Step Guide<\/a> by Mohammed Samgan Khan.<\/li>\n<\/ul>\n<h2 id=\"other-frameworks\">Other Frameworks<\/h2>\n<ul>\n<li><a href=\"https:\/\/getlaminas.org\/blog\/2024-07-02-dotkernel-a-replacement-for-laminas-api-tools.html\" target=\"_blank\" rel=\"noopener\">Dotkernel API: a replacement for legacy Laminas API Tools<\/a> \u2013 We don&#8217;t hear much from Laminas Project (formerly Zend Framework) these days, but the team and community are active.\n<p><a href=\"https:\/\/www.dotkernel.com\" target=\"_blank\" rel=\"noopener\">Dotkernel<\/a> is an example of that \u2013 a collection of PSR-7 middleware applications based on Laminas and Mezzio microframework. And <a href=\"https:\/\/www.dotkernel.org\" target=\"_blank\" rel=\"noopener\">Dotkernel API ()<\/a> is one such application.<\/p>\n<\/li>\n<\/ul>\n<h2 id=\"misc\">Misc<\/h2>\n<ul>\n<li>? <a href=\"https:\/\/www.youtube.com\/watch?v=Fgfaa4N-gso\" target=\"_blank\" rel=\"noopener\">Story of PHPUnit, PEST PHP, And More<\/a> with Nuno Maduro and Sebastian Bergmann.<\/li>\n<li><a href=\"https:\/\/towardsdev.com\/use-openais-assistant-to-chat-with-your-whole-codebase-fb7f4b67cad3\" target=\"_blank\" rel=\"noopener\">Use OpenAIs Assistant to Chat with Your whole Codebase<\/a> by Micha(el) Bladowski.<\/li>\n<li><a href=\"https:\/\/paulund.co.uk\/performance-metrics-using-guzzle\" target=\"_blank\" rel=\"noopener\">Performance Metrics Using Guzzle<\/a> by Paul Underwood.<\/li>\n<li><a href=\"https:\/\/localheinz.com\/articles\/2020\/05\/19\/avoiding-imports-and-aliases-in-php\/\" target=\"_blank\" rel=\"noopener\">Avoiding imports and aliases in PHP<\/a> by Andreas M\u00f6ller.<\/li>\n<li><a href=\"https:\/\/www.crwlr.software\/blog\/php-generators-quickstart-tutorial\" target=\"_blank\" rel=\"noopener\">A Quickstart Tutorial on PHP Generators<\/a> by Christian Olear.<\/li>\n<li><a href=\"https:\/\/ashallendesign.co.uk\/blog\/the-difference-between-self-static-and-parent-in-php\" target=\"_blank\" rel=\"noopener\">The Difference Between self::, static::, and parent:: in PHP<\/a> by Ashley Allen.<\/li>\n<li><a href=\"https:\/\/getrector.com\/blog\/success-story-of-automated-framework-migration-from-fuelphp-to-laravel-of-400k-lines-application\" target=\"_blank\" rel=\"noopener\">Success Story of Automated Framework Migration from FuelPHP to Laravel of 400k+lines Application<\/a> by Tomas Votruba.<\/li>\n<li><a href=\"https:\/\/sergheipogor.medium.com\/how-well-do-you-really-understand-php-generators-3742254ecdbe\" target=\"_blank\" rel=\"noopener\">How Well Do You Really Understand PHP Generators?<\/a> by Serghei Pogor.<\/li>\n<li><a href=\"https:\/\/staabm.github.io\/2024\/06\/28\/readable-phpstan-end-to-end-tests-with-bashunit.html\" target=\"_blank\" rel=\"noopener\">Readable end-to-end tests for PHPStan with bashunit<\/a> by Markus Staab.<\/li>\n<li><a href=\"https:\/\/betterstack.com\/community\/guides\/logging\/php-logging-opentelemetry\/\" target=\"_blank\" rel=\"noopener\">Practical Logging for PHP Applications with OpenTelemetry<\/a> by Marin Bezhanov.<\/li>\n<li><a href=\"https:\/\/flareapp.io\/blog\/weakmaps-a-hidden-gem-in-php\" target=\"_blank\" rel=\"noopener\">WeakMaps a hidden gem in PHP<\/a> by Flare Team.<\/li>\n<li><a href=\"https:\/\/spiralscout.com\/blog\/leveraging-temporal-for-efficient-document-life-cycle-management\" target=\"_blank\" rel=\"noopener\">How to leverage Temporal Workflows for efficient document lifecycle management<\/a> by Anton Titov.<\/li>\n<li><a href=\"https:\/\/withinboredom.info\/2024\/06\/26\/algorithms-in-php-deques-and-circular-buffers-linked-lists\/\" target=\"_blank\" rel=\"noopener\">Algorithms in PHP: Deques (and circular buffers + linked lists)<\/a> by Robert Landers.<\/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:\/\/cakefest.org\/\" target=\"_blank\" rel=\"noopener\">CakeFest<\/a> \u2013 Luxembourg, July 24\u201326.<\/li>\n<li><a href=\"https:\/\/laracon.us\/\" target=\"_blank\" rel=\"noopener\">Laracon 2024<\/a> \u2013 Dallas, TX, USA, August 27\u201328.<\/li>\n<li><a href=\"https:\/\/2024.phpsrbija.rs\/\" target=\"_blank\" rel=\"noopener\">PHP Serbia 2024<\/a> \u2013 Belgrade, Serbia, September 6-7. <a href=\"https:\/\/2024.phpsrbija.rs\/cfp#phpserbia2024\" target=\"_blank\" rel=\"noopener\">CFP<\/a><\/li>\n<li><a href=\"https:\/\/cascadiaphp.com\/\" target=\"_blank\" rel=\"noopener\">CascadiaPHP 2024<\/a> \u2013 Portland, OR, USA, October 24-26. ?<\/li>\n<li><a href=\"https:\/\/2024.phpcon.pl\/en\/\" target=\"_blank\" rel=\"noopener\">PHPCon Poland 2024<\/a> \u2013 Wis\u0142a, Poland, October 25\u201326. <a href=\"https:\/\/cfp-en.phpcon.pl\/\" target=\"_blank\" rel=\"noopener\">CFP<\/a><\/li>\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. <a href=\"https:\/\/live.symfony.com\/2024-vienna-con\/cfp\" target=\"_blank\" rel=\"noopener\">CFP<\/a><\/li>\n<\/ul>\n<h2 id=\"community\">Community<\/h2>\n<ul>\n<li>PHP has the nicest community!<br \/><iframe loading=\"lazy\" title=\"YouTube video player\" src=\"https:\/\/www.youtube.com\/embed\/7ySVWcFHz98?si=L3A6r84ymrSdAm7B&amp;clip=Ugkx1uCh2Nm0-FmZEjn6su9feBm5X2EWhIC5&amp;clipt=EPLLRRjk8kg\" width=\"560\" height=\"315\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/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<\/a> (formerly Twitter).<\/p>\n<p style=\"text-align: left;\" align=\"center\"><a class=\"jb-download-button\" style=\"color: white;\" 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<p><script async src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><\/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>, Operations Manager 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":490909,"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\/490890"}],"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=490890"}],"version-history":[{"count":10,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/phpstorm\/490890\/revisions"}],"predecessor-version":[{"id":508287,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/phpstorm\/490890\/revisions\/508287"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media\/490909"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media?parent=490890"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/categories?post=490890"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/tags?post=490890"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/cross-post-tag?post=490890"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}