{"id":292931,"date":"2022-11-02T08:55:21","date_gmt":"2022-11-02T07:55:21","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=phpstorm&#038;p=292931"},"modified":"2024-01-09T17:58:38","modified_gmt":"2024-01-09T16:58:38","slug":"php-annotated-october-2022","status":"publish","type":"phpstorm","link":"https:\/\/blog.jetbrains.com\/phpstorm\/2022\/11\/php-annotated-october-2022\/","title":{"rendered":"PHP Annotated \u2013 October 2022"},"content":{"rendered":"<p><a href=\"https:\/\/blog.jetbrains.com\/phpstorm\/2022\/11\/php-annotated-october-2022\/\"><img decoding=\"async\" class=\"alignnone size-full\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/php-annotated-blog-featured-image-1280x600-1.png\" alt=\"PHP Annotated Monthly\" width=\"900\"><\/a><\/p>\n<p>Greetings everyone!<\/p>\n<p>Welcome to the October installment of PHP Annotated, where we\u2019ll catch up on the most exciting things that have happened in the PHP world over the last month, including curated news, articles, tools, and videos.<\/p>\n<p><!--more--><\/p>\n<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;}<\/style>\n<h2 id=\"news\">News<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.php.net\/archive\/2022.php#2022-10-27-1\" target=\"_blank\" rel=\"noopener\"><strong>PHP 8.2.0 <\/strong><\/a><a href=\"https:\/\/www.php.net\/archive\/2022.php#2022-10-27-1\" target=\"_blank\" rel=\"noopener\"><strong>RC 5<\/strong><\/a><strong> has been released<\/strong><strong><br>\n    <\/strong>Another release candidate has been delivered according to <a href=\"https:\/\/wiki.php.net\/todo\/php82\" target=\"_blank\" rel=\"noopener\">schedule<\/a>. The sixth RC is expected on November 10, and it\u2019ll be the last one before the final release of PHP 8.2.<p><\/p>\n<p>        For a detailed list of what\u2019s coming in PHP 8.2, take a look at <a href=\"https:\/\/php.watch\/versions\/8.2\" target=\"_blank\" rel=\"noopener\">PHP.Watch<\/a> or <a href=\"https:\/\/stitcher.io\/blog\/new-in-php-82\" target=\"_blank\" rel=\"noopener\">stitcher.io<\/a>.<\/p>\n<p>        You may also want to check out <a href=\"https:\/\/stitcher.io\/blog\/php-82-in-8-code-blocks\" target=\"_blank\" rel=\"noopener\">PHP 8.2 in 8 code blocks<\/a>.<\/p>\n<blockquote class=\"twitter-tweet\">\n<p lang=\"en\" dir=\"ltr\">Me: &#8220;Hey Joe! What do you think about modern PHP?&#8221;<\/p>\n<p>Joe: <a href=\"https:\/\/t.co\/r3Qh5vCr6h\" target=\"_blank\">pic.twitter.com\/r3Qh5vCr6h<\/a><\/p>\n<p>\u2014 Martin Joo (@mmartin_joo) <a href=\"https:\/\/twitter.com\/mmartin_joo\/status\/1575456607261102082?ref_src=twsrc%5Etfw\" target=\"_blank\" rel=\"noopener\">September 29, 2022<\/a><\/p>\n<\/blockquote>\n<\/li>\n<li><a href=\"https:\/\/www.php.net\/archive\/2022.php#2022-10-28-1\" target=\"_blank\" rel=\"noopener\"><strong>PHP 8.0.25<\/strong><\/a><strong> and <\/strong><a href=\"https:\/\/www.php.net\/archive\/2022.php#2022-10-28-2\" target=\"_blank\" rel=\"noopener\"><strong>PHP 8.1.12<\/strong><\/a><strong> have been released<\/strong><br>\n        &#x2757;These are security releases of currently supported branches. All users are encouraged to upgrade.<br>\n        The updates fix vulnerabilities in Phar extension and cookie integrity. You can learn more in this blog post <a href=\"https:\/\/php.watch\/news\/2022\/09\/php-releases-8.1.11-8.0.24-7.4.32\" target=\"_blank\" rel=\"noopener\">on PHP.Watch<\/a>.<strong><br>\n        <\/strong><\/li>\n<li><a href=\"https:\/\/aws.amazon.com\/about-aws\/whats-new\/2022\/09\/aws-x-ray-support-tracing-php-applications-opentelemetry-public-preview\/\" target=\"_blank\" rel=\"noopener\"><strong>AWS <\/strong><\/a><a href=\"https:\/\/aws.amazon.com\/about-aws\/whats-new\/2022\/09\/aws-x-ray-support-tracing-php-applications-opentelemetry-public-preview\/\" target=\"_blank\" rel=\"noopener\"><strong>X-Ray launches support for tracing PHP applications<\/strong><\/a> via OpenTelemetry in public preview.\n    <\/li>\n<li><a href=\"https:\/\/redmonk.com\/sogrady\/2022\/10\/20\/language-rankings-6-22\/\" target=\"_blank\" rel=\"noopener\"><strong>The RedMonk Programming Language Rankings: June 2022<\/strong><\/a><strong><br>\n    <\/strong><p><\/p>\n<blockquote class=\"twitter-tweet\">\n<p lang=\"en\" dir=\"ltr\">And RedMonk NEVER discusses it. They only talk about the languages hashing it out in the top 3, or when other &#8220;popular&#8221; languages rise or fall lower down the list.<\/p>\n<p>It&#8217;s part of how <a href=\"https:\/\/twitter.com\/hashtag\/php?src=hash&amp;ref_src=twsrc%5Etfw\" target=\"_blank\" rel=\"noopener\">#php<\/a> is relegated to &#8220;dead&#8221; or &#8220;uninteresting&#8221;.<a href=\"https:\/\/twitter.com\/hashtag\/tw?src=hash&amp;ref_src=twsrc%5Etfw\" target=\"_blank\" rel=\"noopener\">#tw<\/a><\/p>\n<p>\u2014 mwop (@mwop) <a href=\"https:\/\/twitter.com\/mwop\/status\/1584548421205200898?ref_src=twsrc%5Etfw\" target=\"_blank\" rel=\"noopener\">October 24, 2022<\/a><\/p>\n<\/blockquote>\n<\/li>\n<\/ul>\n<h2 id=\"php_core\">PHP Core<\/h2>\n<p>Most of the Core news is covered in detail in the <a href=\"https:\/\/thephp.foundation\/blog\/tag\/roundup\/\" target=\"_blank\" rel=\"noopener\"><strong>PHP Core Roundup series<\/strong><\/a> from the PHP Foundation, so we&#8217;ll only mention it briefly:<\/p>\n<ul>\n<li>&#x2705; <a href=\"https:\/\/wiki.php.net\/rfc\/json_validate\" target=\"_blank\" rel=\"noopener\"><strong>RFC: json_validate<\/strong><\/a> #PHP 8.3<br>\n        Juan Carlos Morales proposed adding a new function called <code>json_validate()<\/code> that verifies whether a string contains a valid JSON. It saves memory when you don\u2019t need to fully parse the string, but rather just check if it\u2019s a JSON.<p><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\" data-enlighter-title=\"\">var_dump(json_validate(&#039;{ &quot;test&quot;: { &quot;foo&quot;: &quot;bar&quot; } }&#039;));  \/\/ bool(true)\nvar_dump(json_validate(&#039;{ &quot;&quot;: &quot;&quot;: &quot;&quot; } }&#039;)); \t\t        \/\/ bool(false)\n<\/pre>\n<\/li>\n<li><strong>&#x274c;<\/strong>&#x2705;<strong> <\/strong><a href=\"https:\/\/wiki.php.net\/rfc\/improve_unserialize_error_handling\" target=\"_blank\" rel=\"noopener\"><strong>RFC: Improve <\/strong><\/a><a href=\"https:\/\/wiki.php.net\/rfc\/improve_unserialize_error_handling\" target=\"_blank\" rel=\"noopener\"><strong><code>unserialize()<\/code><\/strong><\/a><a href=\"https:\/\/wiki.php.net\/rfc\/improve_unserialize_error_handling\" target=\"_blank\" rel=\"noopener\"><strong> error handling<\/strong><\/a> #PHP 8.3<br>\n        Tim D\u00fcsterhus proposed throwing a new <code>UnserializationFailedException<\/code> when unserialization fails.<p><\/p>\n<p>        This RFC caused a massive <a href=\"https:\/\/twitter.com\/nicolasgrekas\/status\/1581023556707618818\" target=\"_blank\" rel=\"noopener\"><strong>discussion on Twitter<\/strong><\/a>, and ultimately the new exception part was not accepted. Instead, the severity of the thrown error will now be increased from <code>E_NOTICE<\/code> to <code>E_WARNING<\/code>.\n    <\/p>\n<\/li>\n<li><strong>&#x1f4e3; <\/strong><a href=\"https:\/\/wiki.php.net\/rfc\/randomizer_additions\" target=\"_blank\" rel=\"noopener\"><strong>RFC: Randomizer Additions<\/strong><\/a> #PHP 8.3<br>\n        Tim D\u00fcsterhus and Joshua R\u00fcsweg propose adding new \u201cbuilding block\u201d methods to <code>\\Random\\Randomizer.<\/code> These methods would implement commonly useful operations that are either verbose or very hard to implement in user land.<p><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\" data-enlighter-title=\"\">namespace Random; \nfinal class Randomizer {\n    \/\/ [\u2026]\n    public function getBytesFromAlphabet(string $alphabet, int $length): string {}\n    public function nextFloat(): float {}\n    public function getFloat(float $min, float $max): float {}\n}\n<\/pre>\n<\/li>\n<li><strong>&#x1f4e3; <\/strong><a href=\"https:\/\/wiki.php.net\/rfc\/destructuring_coalesce\" target=\"_blank\" rel=\"noopener\"><strong>RFC: Destructuring Coalesce<\/strong><\/a> #PHP 8.3<br>\n        Bob Weinand proposes adding an operator for default values in destructuring assignments.<p><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\" data-enlighter-title=\"\">$input = &#039;key=value&#039;;\n[$key, $val ?? &#039;default value&#039;] = explode(&#039;=&#039;, $input, 2);\n<\/pre>\n<p>        By the way, the defaults can now be appended to the array like so:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\" data-enlighter-title=\"\">[$key, $val] = explode(&#039;=&#039;, $input, 2) + [null, null]\n<\/pre>\n<p>        Thanks for the <a href=\"https:\/\/twitter.com\/SergiiShymko\/status\/1582746838729314306?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1582746838729314306%7Ctwgr%5E70efd4a968b7ab015a911d938bfc1d9479055c78%7Ctwcon%5Es1_&amp;ref_url=https%3A%2F%2Fpublish.twitter.com%2F%3Fquery%3Dhttps3A2F2Ftwitter.com2FSergiiShymko2Fstatus2F1582746838729314306widget%3DTweet\" target=\"_blank\" rel=\"noopener\">tip<\/a>, Sergii Shymko!\n    <\/p>\n<\/li>\n<li>\n<blockquote class=\"twitter-tweet\">\n<p lang=\"en\" dir=\"ltr\">This was supposed to be a secret, but it got documented &#8230;<\/p>\n<p>The <a href=\"https:\/\/twitter.com\/hashtag\/PHP?src=hash&amp;ref_src=twsrc%5Etfw\" target=\"_blank\" rel=\"noopener\">#PHP<\/a> CLI server can handle multiple requests concurrently if you set PHP_CLI_SERVER_WORKERS since 7.4 &#8230;<\/p>\n<p>This has been various kinds of broken, but might be alright in the latest versions of PHP *for development*.<\/p>\n<p>\u2014 Joe Watkins (@krakjoe) <a href=\"https:\/\/twitter.com\/krakjoe\/status\/1585174196371738625?ref_src=twsrc%5Etfw\" target=\"_blank\" rel=\"noopener\">October 26, 2022<\/a><\/p>\n<\/blockquote>\n<\/li>\n<\/ul>\n<h2 id=\"tools\">Tools<br>\n<\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/dunglas\/frankenphp\" target=\"_blank\" rel=\"noopener\">dunglas\/frankenphp<\/a> \u2013 The modern PHP app server, written in Go and embedded in Caddy web server.<br>\n        Kevin Dunglas summarized this server\u2019s main differences from <a href=\"https:\/\/github.com\/roadrunner-server\/roadrunner\" target=\"_blank\" rel=\"noopener\">RoadRunner<\/a>:<p><\/p>\n<p>        <iframe loading=\"lazy\" id=\"reddit-embed\" src=\"https:\/\/www.redditmedia.com\/r\/PHP\/comments\/y3xpqp\/frankenphp_an_app_server_for_php_written_in_go\/iscgp9s\/?depth=1&amp;showmore=false&amp;embed=true&amp;showmedia=false&amp;showedits=false&amp;created=2022-10-24T09%3A22%3A18.483Z\" sandbox=\"allow-scripts allow-same-origin allow-popups\" style=\"border: none;\" height=\"421\" width=\"640\" scrolling=\"no\"><\/iframe>\n    <\/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 8+. The extension follows Golang\u2019s philosophy on parallelism \u2013 \u201cDo not communicate by sharing memory; instead, share memory by communicating\u201d \u2013 and provides all the necessary bricks, like Channels, Events, and Futures.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/cachewerk\/relay\" target=\"_blank\" rel=\"noopener\">cachewerk\/relay<\/a> \u2013 A Redis client like PhpRedis and Predis, but much faster because it is written as a PHP extension. The authors also provide Laravel, WordPress, and Magento integrations for caching.\n    <\/li>\n<li><a href=\"https:\/\/saeghe.com\/\" target=\"_blank\" rel=\"noopener\">Saeghe<\/a> \u2013 A modern PHP package manager.<br>\n        PHP now has one more package manager! It uses GitHub links as dependencies. Additionally, it does not rely on PSR-autoloading, relying instead on a build stage.<p><\/p>\n<p>        Competition is always a good thing!\n    <\/p>\n<\/li>\n<li><a href=\"https:\/\/github.com\/composer-unused\/composer-unused\" target=\"_blank\" rel=\"noopener\">composer-unused\/composer-unused<\/a> \u2013 A package that scans your code to reveal unused composer dependencies.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/square\/pjson\" target=\"_blank\" rel=\"noopener\">square\/<\/a><a href=\"https:\/\/github.com\/square\/pjson\" target=\"_blank\" rel=\"noopener\">pjson<\/a> \u2013 This library helps deserialize JSON into actual objects of custom-defined classes. It does so by using PHP 8&#8217;s attributes on class properties.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/doctrine\/collections\/releases\/tag\/2.0.0\" target=\"_blank\" rel=\"noopener\">doctrine\/collections<\/a> <a href=\"https:\/\/github.com\/doctrine\/collections\/releases\/tag\/2.0.0\" target=\"_blank\" rel=\"noopener\">2.0.0<\/a> \u2013 A popular collections library that has received a major update adding more strict typing and native parameter and return types.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/heiglandreas\/holidayChecker\" target=\"_blank\" rel=\"noopener\">heiglandreas\/holidayChecker<\/a> \u2013 This package allows checking whether a given date is a holiday and is locale-aware.\n    <\/li>\n<li><a href=\"https:\/\/laragon.org\/\" target=\"_blank\" rel=\"noopener\">Laragon<\/a> \u2013 Another local dev environment tool \u2013 one that\u2019s a portable, isolated, fast, and powerful alternative to XAMPP and similar solutions. Learn more in this post on <a href=\"https:\/\/php.watch\/articles\/laragon-windows-php\" target=\"_blank\" rel=\"noopener\">PHP.Watch<\/a>.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/gacela-project\/gacela\" target=\"_blank\" rel=\"noopener\">gacela-project\/gacela<\/a> \u2013 This package helps you build modular PHP applications, by splitting your project into different modules in a unified way. Heavily inspired by <a href=\"https:\/\/github.com\/spryker\" target=\"_blank\" rel=\"noopener\">Spryker<\/a>.\n    <\/li>\n<\/ul>\n<h2 id=\"symfony\">Symfony<\/h2>\n<ul>\n<li><a href=\"https:\/\/tdutrion.dev\/symfony-translate-assert-custom-messages-from-entities-552088d5add4\" target=\"_blank\" rel=\"noopener\">Symfony: translate Assert custom messages from entities<\/a> by Thomas Dutrion.\n    <\/li>\n<li>&#x2757;&#xfe0f; <a href=\"https:\/\/symfony.com\/blog\/twig-security-release-possibility-to-load-a-template-outside-a-configured-directory-when-using-the-filesystem-loader\" target=\"_blank\" rel=\"noopener\">Twig security release: Possibility to load a template outside a configured directory when using the filesystem loader<\/a> by Fabien Potencier.\n    <\/li>\n<li><a href=\"https:\/\/medium.com\/beyn-technology\/cqrs-principle-with-symfony-messenger-6c0fb2c28917\" target=\"_blank\" rel=\"noopener\">CQRS Principle with Symfony Messenger<\/a> by Mert Simsek.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/emr-dev\/sf-bug-bundle\" target=\"_blank\" rel=\"noopener\">emr-dev\/sf-bug-bundle<\/a> \u2013 A package for sharing Symfony profiler pages. Here\u2019s <a href=\"https:\/\/sfbug.io\/\" target=\"_blank\" rel=\"noopener\">how it works<\/a>.\n    <\/li>\n<li><a href=\"https:\/\/medium.com\/the-sensiolabs-tech-blog\/emojis-are-new-symfonys-best-friends-7c084760c056\" target=\"_blank\" rel=\"noopener\">Emojis are new Symfony\u2019s best friends!<\/a> by Alexandre Daubois.\n    <\/li>\n<li><a href=\"https:\/\/symfony.com\/blog\/new-in-symfony-6-2-built-in-cache-security-template-and-doctrine-attributes\" target=\"_blank\" rel=\"noopener\">New in Symfony 6.2: Built-in Cache, Security, Template and Doctrine Attributes<\/a> by Javier Eguiluz.\n    <\/li>\n<\/ul>\n<h2 id=\"laravel\">Laravel<\/h2>\n<ul>\n<li><a href=\"https:\/\/benjamincrozat.com\/what-is-new-laravel-10\" target=\"_blank\" rel=\"noopener\">What&#8217;s new in Laravel 10?<\/a> by Benjamin Crozat \u2013 Laravel 10 will be released on February 7, 2023. Its development is still ongoing.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/spatie\/laravel-dynamic-servers\" target=\"_blank\" rel=\"noopener\">spatie\/laravel-dynamic-servers<\/a> \u2013 A package for dynamically creating and destroying servers. Here\u2019s <a href=\"https:\/\/laravel-news.com\/laravel-dynamic-servers\" target=\"_blank\" rel=\"noopener\">how to use it<\/a>.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/ryangjchandler\/laravel-feature-flags\" target=\"_blank\" rel=\"noopener\">ryangjchandler\/laravel-feature-flags<\/a> \u2013 An opinionated feature flags package for Laravel.  Learn <a href=\"https:\/\/ryangjchandler.co.uk\/posts\/adding-feature-flags-to-your-laravel-project\" target=\"_blank\" rel=\"noopener\">how to use it to add feature flags to your Laravel project<\/a>.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/creagia\/laravel-sign-pad\" target=\"_blank\" rel=\"noopener\">creagia\/laravel-sign-pad<\/a> \u2013 A package for signing documents and optionally generating certified PDFs associated with Eloquent models. Here\u2019s <a href=\"https:\/\/laravel-news.com\/laravel-pad-signature\" target=\"_blank\" rel=\"noopener\">how to use it<\/a>.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/hammerstonedev\/sidecar\" target=\"_blank\" rel=\"noopener\">hammerstonedev<\/a><a href=\"https:\/\/github.com\/hammerstonedev\/sidecar\" target=\"_blank\" rel=\"noopener\">\/sidecar<\/a> \u2013 A tool to deploy and execute AWS Lambda functions from your Laravel application.\n    <\/li>\n<li><a href=\"https:\/\/mailcoach.app\/blog\/5-using-jobs-instead-of-commands-in-the-schedule-of-a-laravel-app\" target=\"_blank\" rel=\"noopener\">Using jobs instead of commands in the schedule of a Laravel app<\/a> by Freek Van der Herten.\n    <\/li>\n<li><a href=\"https:\/\/planetscale.com\/blog\/laravels-safety-mechanisms?utm_content=laravel-safety\" target=\"_blank\" rel=\"noopener\">Laravel\u2019s safety mechanisms<\/a> by Aaron Francis.\n    <\/li>\n<li>&#x1f4fa; <a href=\"https:\/\/youtu.be\/1cPaw3QbOLA\" target=\"_blank\" rel=\"noopener\">Laravel Bootcamp: from start to finish<\/a> by Brent Roose.\n    <\/li>\n<li>&#x1f4fa; <a href=\"https:\/\/youtu.be\/p4pmsZxIzJA\" target=\"_blank\" rel=\"noopener\">What&#8217;s new in Laravel 9.32.0<\/a> by Christoph Rumpel.\n    <\/li>\n<li>&#x1f4fa; <a href=\"https:\/\/youtu.be\/as7qSB4WNHA\" target=\"_blank\" rel=\"noopener\">Laravel&#8217;s New Strict Mode (Everything You Need to Know)<\/a> by Jeffrey Way.<\/li>\n<\/ul>\n<h2 id=\"misc\">Misc<\/h2>\n<ul>\n<li><a href=\"https:\/\/medium.com\/@davert\/why-i-dont-enjoy-writing-php-anymore-aee8a85ca8aa\" target=\"_blank\" rel=\"noopener\">Why I Don\u2019t Enjoy Writing PHP Anymore<\/a> by Michael Bodnarchuk \u2013 Despite its click-baity title, this post raises a constructive concern regarding backward compatibility breaks in PHP versions.\n<p>        One of the Composer\u2019s authors, Jordi, posted a tip that might help work around some of the upgrade problems:<\/p>\n<blockquote class=\"twitter-tweet\">\n<p lang=\"en\" dir=\"ltr\">Also, please for safety use &#8211;ignore-platform-req=php+<\/p>\n<p>With the plus sign it allows using php 8.2 where 8.1 is required by a pkg, but not using php 8.0 if 8.1 is required.<\/p>\n<p>\u2014 Jordi Boggiano (@seldaek) <a href=\"https:\/\/twitter.com\/seldaek\/status\/1577349406382342144?ref_src=twsrc%5Etfw\" target=\"_blank\" rel=\"noopener\">October 4, 2022<\/a><\/p>\n<\/blockquote>\n<\/li>\n<li><a href=\"https:\/\/php.watch\/articles\/php-easter-eggs\" target=\"_blank\" rel=\"noopener\">All the Easter Eggs in PHP<\/a> by Ayesh Karunaratne.\n    <\/li>\n<li><a href=\"https:\/\/dev.to\/vladimir_mvs\/pragmatic-development-3-telegram-bot-ed1\" target=\"_blank\" rel=\"noopener\">Pragmatic development 3: Telegram bot<\/a> by Vladimir Martsul.\n    <\/li>\n<li><a href=\"https:\/\/blog.devgenius.io\/loosely-coupled-microservices-in-php-130699e80344\" target=\"_blank\" rel=\"noopener\">Loosely coupled Microservices in PHP<\/a> by Dariusz Gafka.\n    <\/li>\n<li><a href=\"https:\/\/www.exakat.io\/en\/unpacked-named-and-positional-arguments-are-in-a-call\/\" target=\"_blank\" rel=\"noopener\">Unpacked, named and positional arguments are in a call\u2026<\/a> by Damien Seguy.\n    <\/li>\n<li><a href=\"https:\/\/peakd.com\/hive-168588\/@crell\/extrinsic-sorting-benchmark\" target=\"_blank\" rel=\"noopener\">Extrinsic sorting: A benchmark<\/a> by Larry Garfield \u2013 In which he explains priority, group, topological, and other non-trivial sortings.\n    <\/li>\n<li><a href=\"https:\/\/www.kai-sassnowski.com\/post\/contract-tests\/\" target=\"_blank\" rel=\"noopener\">Contract Tests<\/a> by Kai Sassnowski \u2013 Guidance for writing tests to ensure consistent behavior across all implementations of an interface.<\/li>\n<li><a href=\"https:\/\/dev.to\/pmurzakov\/php-preload-vs-running-as-a-daemon-benchmarks-3bba\" target=\"_blank\" rel=\"noopener\">PHP preload VS running as a daemon (RoadRunner)<\/a> \u2013 Benchmarks by Pavel Murzakov.\n    <\/li>\n<li><a href=\"https:\/\/medium.com\/@vlreshet\/supporting-legacy-php-project-painless-switching-to-cloud-storage-ef6a1404f590\" target=\"_blank\" rel=\"noopener\">Supporting Legacy PHP project: painless switching to cloud storage<\/a> by Vlad Reshetilo \u2013 A neat trick for using PHP\u2019s native stream API.\n    <\/li>\n<li><a href=\"https:\/\/benjamincrozat.com\/php-artificial-intelligence\" target=\"_blank\" rel=\"noopener\">How to build your next PHP project with a touch of AI<\/a> by Benjamin Crozat.\n    <\/li>\n<li><a href=\"https:\/\/laravel-news.com\/modern-php-features-explained?utm_campaign=Modern+PHP+features+explained+Laravel+937+OpenAI+PHP+Client+and+more+-+433&amp;utm_source=email+marketing\" target=\"_blank\" rel=\"noopener\">Modern PHP features explained &#8211; PHP 8.0 and 8.1<\/a> by Steve McDougall.\n    <\/li>\n<li><a href=\"https:\/\/medium.com\/@thorstensuckow\/using-php-enums-as-method-calls-2d6b95fa8347\" target=\"_blank\" rel=\"noopener\">Using PHP enums as method calls<\/a> by Thorsten Suckow-Homberg \u2013 Dynamically mapping method calls to existing typed values \u2013 what a neat and unexpected usage of enums.\n    <\/li>\n<\/ul>\n<h2 id=\"videos\">Videos<\/h2>\n<ul>\n<li>&#x1f4fa; <a href=\"https:\/\/youtu.be\/vXjbgfqfUBk\" target=\"_blank\" rel=\"noopener\">My Top 10 PhpStorm Tricks<\/a> by Christoph Rumpel.\n    <\/li>\n<li>&#x1f4fa; <a href=\"https:\/\/youtu.be\/c2YJ6GmahJk\" target=\"_blank\" rel=\"noopener\">Tiny Refactors Make a Big Difference<\/a> by Jeffrey Way.\n    <\/li>\n<li>&#x1f4fa; <a href=\"https:\/\/laracasts.com\/series\/php-for-beginners-2023-edition\" target=\"_blank\" rel=\"noopener\">PHP For Beginners<\/a> by Jeffrey Way.\n    <\/li>\n<li>&#x1f4fa; <a href=\"https:\/\/youtu.be\/j9gfU_Vg2ME\" target=\"_blank\" rel=\"noopener\">What&#8217;s Changed in PHP 8.2<\/a> by Scott Keck-Warren.\n    <\/li>\n<\/ul>\n<h2 id=\"conferences\">Conferences<\/h2>\n<p>Check out these upcoming big PHP gigs, and consider visiting or submitting a talk idea:<\/p>\n<ul>\n<li><a href=\"https:\/\/live.symfony.com\/2022-paris-con\/\" target=\"_blank\" rel=\"noopener\">SymfonyCon<\/a> \u2013 Disneyland Paris (France), November 17\u201318, 2022.\n    <\/li>\n<li><a href=\"https:\/\/www.phpconference.co.uk\/\" target=\"_blank\" rel=\"noopener\">PHP UK Conference<\/a> \u2013 London (UK), February 14\u201316, 2023.\n    <\/li>\n<li><a href=\"https:\/\/twitter.com\/LaraconEU\/status\/1575836655055142913\" target=\"_blank\" rel=\"noopener\">Laracon EU<\/a> \u2013 Lisbon (Portugal), January 2023.\n    <\/li>\n<li><a href=\"https:\/\/tek.phparch.com\/\" target=\"_blank\" rel=\"noopener\">Php[tek]<\/a> \u2013 Chicago (US), May 16\u201318, 2023.\n<\/li>\n<\/ul>\n<p>And if you are wondering when the next PHP meetup is, Tomas Votruba has got you covered with his lovely <a href=\"https:\/\/friendsofphp.org\/\" target=\"_blank\" rel=\"noopener\">friendsofphp.org<\/a> meetup aggregator. There is also a calendar on <a href=\"https:\/\/www.php.net\/cal.php\" target=\"_blank\" rel=\"noopener\">php.ne<\/a><a href=\"https:\/\/www.php.net\/cal.php\" target=\"_blank\" rel=\"noopener\">t<\/a> \u2013 <a href=\"https:\/\/www.php.net\/cal.php\" target=\"_blank\" rel=\"noopener\">Events: November 2022<\/a>.<\/p>\n<p><\/p>\n<hr>\n<p>\n    That&#8217;s all for today, thanks for reading!\n<\/p>\n<p>\n    If you have any interesting or useful links to share via PHP Annotated, please leave a comment on this post or send<br>\n    me a <a href=\"https:\/\/twitter.com\/pronskiy\" target=\"_blank\" rel=\"noopener\">tweet<\/a>.\n<\/p>\n<p style=\"text-align: left;\" align=\"center\"><a 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<br>\n    to PHP Annotated<\/a><\/p>\n<p><em>Your JetBrains PhpStorm team<\/em><br>\n<em>The Drive to Develop<\/em><br>\n<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>Product marketing manager for <a href=\"https:\/\/twitter.com\/PhpStorm\" target=\"_blank\" rel=\"noopener\">@PhpStorm<\/a>, helped to launch <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\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-sergey.png\" alt=\"\" loading=\"lazy\">\n                        <\/div>\n                                        <div class=\"about-author__box-text\">\n                                                    <h4>Sergey Panteleev<\/h4>\n                                                <p>PHP 8.2 release manager, PHP Documentation maintainer.<\/p>\n<p><a href=\"https:\/\/twitter.com\/s_panteleev\" target=\"_blank\" rel=\"noopener\">Twitter<\/a> | <a href=\"https:\/\/github.com\/saundefined\" target=\"_blank\" rel=\"noopener\">GitHub<\/a><\/p>\n                    <\/div>\n                            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":869,"featured_media":292932,"comment_status":"closed","ping_status":"closed","template":"","categories":[],"tags":[2213,190,6755,2323,359,2648,191],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/phpstorm\/292931"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/phpstorm"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/types\/phpstorm"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/users\/869"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/comments?post=292931"}],"version-history":[{"count":11,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/phpstorm\/292931\/revisions"}],"predecessor-version":[{"id":295882,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/phpstorm\/292931\/revisions\/295882"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media\/292932"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media?parent=292931"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/categories?post=292931"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/tags?post=292931"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/cross-post-tag?post=292931"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}