{"id":309316,"date":"2022-12-20T18:08:35","date_gmt":"2022-12-20T17:08:35","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=phpstorm&#038;p=309316"},"modified":"2024-01-09T17:57:46","modified_gmt":"2024-01-09T16:57:46","slug":"php-annotated-december-2022","status":"publish","type":"phpstorm","link":"https:\/\/blog.jetbrains.com\/phpstorm\/2022\/12\/php-annotated-december-2022\/","title":{"rendered":"PHP Annotated \u2013 December 2022"},"content":{"rendered":"<p><a href=\"https:\/\/blog.jetbrains.com\/phpstorm\/2022\/12\/php-annotated-decemeber-2022\/\"><img decoding=\"async\" class=\"alignnone size-full\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/12\/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 December 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>&#x1f389; <a href=\"https:\/\/www.php.net\/archive\/2022.php#2022-12-08-1\" target=\"_blank\" rel=\"noopener\"><strong>PHP 8.2.0<\/strong><\/a><strong> <\/strong><strong>released!<\/strong><strong><br>\n    <\/strong><br>\n        PHP 8.2 is a major update of the PHP language.It contains new features, including readonly classes, DNF types, <code>null<\/code>\/<code>false<\/code>\/<code>true<\/code> as stand-alone types, a new randomizer API, and constant in traits.<p><\/p>\n<p>        The release comes with a few deprecations, with the deprecated dynamic properties being probably the most significant one. There are also performance improvements, as usual.<\/p>\n<p>        For a detailed list of what\u2019s new in PHP 8.2, check out the <a href=\"https:\/\/www.php.net\/releases\/8.2\/\" target=\"_blank\" rel=\"noopener\"><strong>release<\/strong><\/a><a href=\"https:\/\/www.php.net\/releases\/8.2\/\" target=\"_blank\" rel=\"noopener\"><strong> page<\/strong><\/a>.<br>\n            Also check out <a href=\"https:\/\/php.watch\/articles\/PHP-8.2\" target=\"_blank\" rel=\"noopener\">PHP 8.2 Highlights on PHP.Watch<\/a> and a <a href=\"https:\/\/www.youtube.com\/watch?v=KBcZIY_v9VQ\" target=\"_blank\" rel=\"noopener\">video overview of PHP 8.2<\/a> by my colleague Brent.<\/p>\n<details>\n<summary><strong>Installing\/Upgrading to PHP 8.2<\/strong><\/summary>\n<ul>\n<li>Windows: Compiled binaries are available at <a href=\"https:\/\/windows.php.net\/download\/\" target=\"_blank\" rel=\"noopener\">windows.php.net<\/a>.<\/li>\n<li>Ubuntu\/Debian: PHP 8.2 is available on ondrej\/php PPA. A detailed <a href=\"https:\/\/php.watch\/articles\/install-php82-ubuntu-debian\" target=\"_blank\" rel=\"noopener\">installation\/upgrade guide is available on PHP.Watch<\/a>.<\/li>\n<li>Fedora\/RHEL\/CentOS\/Alma\/Rocky: Available as a software collection php82 from the <a href=\"https:\/\/blog.remirepo.net\/\" target=\"_blank\" rel=\"noopener\">Remi repo<\/a>.<\/li>\n<li>Mac OS: PHP 8.2 can be installed via Homebrew with <a href=\"https:\/\/github.com\/shivammathur\/homebrew-php\/packages\" target=\"_blank\" rel=\"noopener\">shivammathur\/homebrew-php tap<\/a>.<\/li>\n<li>Docker: PHP 8.2 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.2\" target=\"_blank\" rel=\"noopener\">8.2* tags<\/a>.\n                <\/li>\n<\/ul>\n<\/details>\n<\/li>\n<li>&#x26a0;&#xfe0f; <a href=\"https:\/\/php.watch\/news\/2021\/11\/php7-eol\" target=\"_blank\" rel=\"noopener\"><strong>PHP 7 has reached end of life<\/strong><\/a><br>\n        <a href=\"https:\/\/www.php.net\/archive\/2022.php#2022-11-03-1\" target=\"_blank\" rel=\"noopener\"><strong>PHP 7.4.33<\/strong><\/a> was the last release of PHP 7. PHP 7 will no longer receive official security updates.<p><\/p>\n<p>        However, major distributions like RedHat or Ubuntu will deliver security updates for PHP 7.4 as part of their LTS premise.<\/p>\n<\/li>\n<li><a href=\"https:\/\/www.php.net\/archive\/2022.php#2022-11-26-1\" target=\"_blank\" rel=\"noopener\"><strong>PHP 8.0.26<\/strong><\/a><strong> and <\/strong><a href=\"https:\/\/www.php.net\/archive\/2022.php#2022-11-24-1\" target=\"_blank\" rel=\"noopener\"><strong>PHP 8.1.13<\/strong><\/a><strong> <\/strong><strong>have been released<\/strong><br>\n        &#x1f41b; These are bug fix releases<strong>.<\/strong><strong><p><\/p>\n<\/strong><p><strong><\/strong><\/p>\n<p><strong><\/strong><\/p>\n<p><strong>        <\/strong><\/p>\n<p><strong><\/strong><\/p>\n<p><strong><\/strong><\/p>\n<p><strong><\/strong><\/p>\n<p><strong>        <\/strong>The PHP 8.0 branch has ended active support, and will only receive security-fix updates.\n        <\/p>\n<\/li>\n<li><strong>&#x1f382; PHP Foundation turns 1 year<\/strong><br>\n        The PHP Foundation was <a href=\"https:\/\/blog.jetbrains.com\/phpstorm\/2021\/11\/the-php-foundation\/\">established a year ago<\/a>.<p><\/p>\n<p>        Over the past year, the PHP Foundation has supported the work of 6 <a href=\"https:\/\/thephp.foundation\/structure\/\" target=\"_blank\" rel=\"noopener\">core developers<\/a>, and made a significant contribution to the PHP language.<\/p>\n<p>        Check out the <a href=\"https:\/\/thephp.foundation\/blog\/2022\/11\/22\/transparency-and-impact-report-2022\/\" target=\"_blank\" rel=\"noopener\">Impact and Transparency Report 2022<\/a> to learn what has been achieved and see the high-level goals for 2023.<\/p>\n<p>        Consider supporting the PHP Foundation via <a href=\"https:\/\/opencollective.com\/phpfoundation\" target=\"_blank\" rel=\"noopener\">OpenCollective<\/a>.\n        <\/p>\n<\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/phpstorm\/2022\/12\/phpstorm-2022-3-whats-new\/\"><strong>PhpStorm 2022.3 is out<\/strong><\/a><br>\n        This major update brings a preview of the new UI, complete PHP 8.2 support, Redis support in database tools, Code Vision for PHP, a quick-fix preview, Xdebug config validation, support for ParaTest, reader mode for PHPDoc, and many other features.\n    <\/li>\n<li><a href=\"https:\/\/symfony.com\/blog\/symfony-6-2-0-released\" target=\"_blank\" rel=\"noopener\"><strong>Symfony 6.2 is out<\/strong><\/a><br>\n        Better emoji support, an access token authenticator, built-in Cache+Security+Template+Doctrine Attributes, improved enum support, and more.<p><\/p>\n<p>        Check out the <a href=\"https:\/\/symfony.com\/blog\/symfony-6-2-curated-new-features\" target=\"_blank\" rel=\"noopener\">Curated New Features<\/a> list to learn about the highlights of this new release.<\/p>\n<\/li>\n<li>&#x1f4fa; <a href=\"https:\/\/www.youtube.com\/@phpannotated\" target=\"_blank\" rel=\"noopener\"><strong>PHP Annotated on YouTube<\/strong><\/a><br>\n        In addition to this PHP Annotated Newsletter, we now also have a dedicated PHP Annotated channel on YouTube.<p><\/p>\n<p>        The channel is all about PHP and community, and you can check out the first videos by Brent Roose.<\/p>\n<\/li>\n<li>&#x2705; <a href=\"https:\/\/www.php-fig.org\/psr\/psr-20\/\" target=\"_blank\" rel=\"noopener\"><strong>PSR-20: Clock<\/strong><\/a><strong> accepted<\/strong><br>\n        The PHP-FIG group has accepted and tagged a PSR-20 with the recommended <code>ClockInterface<\/code> for date and time.\n    <\/li>\n<li>&#x1f389; <a href=\"https:\/\/psalm.dev\/articles\/psalm-5\" target=\"_blank\" rel=\"noopener\"><strong>Psalm 5 is out<\/strong><\/a><br>\n        There are a few new features available in this release: <code>list{int, string, float}<\/code>, <code>properties-of<\/code>, variable templates, and <code>int-range&lt;x, y&gt;<\/code>.\n    <\/li>\n<li><a href=\"https:\/\/xdebug.org\/announcements\/2022-12-08\" target=\"_blank\" rel=\"noopener\"><strong>Xdebug 3.2.0 is out<\/strong><\/a><br>\n        This release adds support for PHP 8.2, and drops support for PHP 7.2-7.4. It has the new ability to <a href=\"https:\/\/www.youtube.com\/watch?v=TNOGhUgY6Sc\" target=\"_blank\" rel=\"noopener\">inspect function return values<\/a>, and comes with better warning messages.\n    <\/li>\n<li><a href=\"https:\/\/phpstan.org\/blog\/phpstan-1-9-0-with-phpdoc-asserts-list-type\" target=\"_blank\" rel=\"noopener\"><strong>PHPStan 1.9.0 has been released<\/strong><\/a><br>\n        The update brings PHPDoc asserts, list types, @param-out tag for parameters assigned by referenc\u0443, and other improvements.\n    <\/li>\n<li><a href=\"https:\/\/www.drupal.org\/blog\/drupal-10-0-0\" target=\"_blank\" rel=\"noopener\"><strong>Drupal 10 is available<\/strong><\/a><br>\n        It requires Symfony 6.2 and PHP 8.1 and adds many improvements across all systems.\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>&#x1f4e3; <a href=\"https:\/\/wiki.php.net\/rfc\/dynamic_class_constant_fetch\" target=\"_blank\" rel=\"noopener\"><strong>PHP RFC: Dynamic class constant fetch<\/strong><\/a> #PHP 8.3<br>\n        Ilija Tovilo proposed introducing a syntax for looking up class constants.<p><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\" data-enlighter-title=\"\">class Foo {    \n    const BAR = &#039;bar&#039;;\n}\n$bar = &#039;BAR&#039;;\n \n\/\/ This is currently a syntax error\necho Foo::{$bar}; \n \n\/\/ Instead, the `constant` function must be used\necho constant(Foo::class . &#039;::&#039; . $bar);\n<\/pre>\n<\/li>\n<li>&#x1f4e3; <a href=\"https:\/\/wiki.php.net\/rfc\/arbitrary_static_variable_initializers\" target=\"_blank\" rel=\"noopener\"><strong>RFC: Arbitrary static variable initializers<\/strong><\/a> #PHP 8.3<br>\n        Ilija Tovilo proposed extending the syntax that allows the static variable initializer to contain arbitrary expressions.<p><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\" data-enlighter-title=\"\">function bar() {    \n    echo &quot;bar() called\\n&quot;;\n    return 1;\n}\n \nfunction foo() {\n    static $i = bar();\n    echo $i++, &quot;\\n&quot;;\n}\n \nfoo();\n<\/pre>\n<\/li>\n<li>&#x1f4e3; <a href=\"https:\/\/wiki.php.net\/rfc\/readonly_amendments\" target=\"_blank\" rel=\"noopener\"><strong>RFC: Readonly amendments<\/strong><\/a> #PHP 8.3<br>\n        Nicolas Grekas and M\u00e1t\u00e9 Kocsis proposed improving readonly properties and classes, allowing non-readonly classes to extend readonly classes and allowing readonly properties to reinitialize during cloning:<p><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\" data-enlighter-title=\"\">readonly class Foo {\n    public function __construct(\n        public DateTime $bar\n    ) {}\n \n    public function __clone()\n    {\n        $this-&gt;bar = clone $this-&gt;bar;\n    }\n}\n \n$foo = new Foo(new DateTime());\n$foo2 = clone $foo;\n<\/pre>\n<\/li>\n<li><strong>&#x1f4ca; <\/strong><a href=\"https:\/\/wiki.php.net\/rfc\/datetime-exceptions\" target=\"_blank\" rel=\"noopener\"><strong>RFC: More Appropriate Date\/Time Exceptions<\/strong><\/a> #PHP 8.3<br>\n        Derick Rethans proposed introducing Date\/Time extension specific exceptions and errors where this makes sense.\n    <\/li>\n<li><strong>&#x1f4e3; <\/strong><a href=\"https:\/\/wiki.php.net\/rfc\/list_assoc_unique\" target=\"_blank\" rel=\"noopener\"><strong>RFC: <\/strong><\/a><a href=\"https:\/\/wiki.php.net\/rfc\/list_assoc_unique\" target=\"_blank\" rel=\"noopener\"><strong><code>List\\unique()<\/code><\/strong><\/a><a href=\"https:\/\/wiki.php.net\/rfc\/list_assoc_unique\" target=\"_blank\" rel=\"noopener\"><strong> and <\/strong><\/a><a href=\"https:\/\/wiki.php.net\/rfc\/list_assoc_unique\" target=\"_blank\" rel=\"noopener\"><strong><code>Assoc\\unique()<\/code><\/strong><\/a><code> <\/code>#PHP 8.3<br>\n        Ilija Tovilo proposed adding two new functions for the cases that are not supported by  <code>array_unique()<\/code>:<p><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\" data-enlighter-title=\"\">List\\unique([1, 2, 3, 1, &#039;2&#039;, 3.0, new Foo, [&#039;bar&#039;]]);\n\/\/ &gt; [1, 2, 3, &#039;2&#039;, 3.0, Foo, [&#039;bar&#039;]]\n\nAssoc\\unique([&#039;foo&#039; =&gt; &#039;foo&#039;, &#039;bar&#039; =&gt; &#039;bar&#039;, &#039;baz&#039; =&gt; &#039;foo&#039;]);\n\/\/ &gt; [&#039;foo&#039; =&gt; &#039;foo&#039;, &#039;bar&#039; =&gt; &#039;bar&#039;]\n        <\/pre>\n<\/li>\n<li><strong>&#x1f4e3; <\/strong><a href=\"https:\/\/wiki.php.net\/rfc\/unicode_text_processing\" target=\"_blank\" rel=\"noopener\"><strong>RFC: Unicode Text Processing<\/strong><\/a><strong> <\/strong>#PHP 8.3<br>\n        Derick Rethans suggests introducing a new <code>Text<\/code> class to make using and processing Unicode text significantly more developer friendly and without having to know all the intricacies of Unicode text processing.<p><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\" data-enlighter-title=\"\">$content = new Text(&#039;\u0928\u092e\u0938\u094d\u0924\u0947 \u0926\u0941\u0928\u093f\u092f\u093e&#039;);\nif ($content-&gt;toLower()-&gt;startsWith(&#039;\u0928\u092e\u0938\u094d\u0924\u0947&#039;)) {\n  \/\/ ...\n}\n<\/pre>\n<\/li>\n<\/ul>\n<h2 id=\"tools\">Tools<\/h2>\n<ul>\n<li><a href=\"https:\/\/twitter.com\/marcelpociot\/status\/1593371441591947265\" target=\"_blank\" rel=\"noopener\">Marcel Pociot<\/a> built a neat GitHub bot that evaluates PHP code blocks in GH issues if you mention it <a href=\"https:\/\/github.com\/phptinker\" target=\"_blank\" rel=\"noopener\">@phptinker<\/a>:<br>\n        <img decoding=\"async\" loading=\"lazy\" width=\"1838\" height=\"874\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/12\/phptinker.png\" alt=\"\" class=\"wp-image-309514\">\n    <\/li>\n<li><a href=\"https:\/\/github.com\/ramsey\/uuid\" target=\"_blank\" rel=\"noopener\">ramsey\/uuid<\/a> \u2013 A new version of package for generating universally unique identifiers comes with support for UUID v8 and custom UUIDs.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/loophp\/collection\" target=\"_blank\" rel=\"noopener\">loophp\/collection<\/a> \u2013 A memory friendly and modular collection class released a new major version, 7.0.0.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/php-rust-tools\/parser\" target=\"_blank\" rel=\"noopener\">php-rust-tools\/parser<\/a> \u2013 A work-in-progress PHP parser written in Rust by <a href=\"https:\/\/twitter.com\/ryangjchandler\" target=\"_blank\" rel=\"noopener\">Ryan Chandler<\/a> and <a href=\"https:\/\/twitter.com\/azjezz\" target=\"_blank\" rel=\"noopener\">Saif Eddin<\/a>.\n<p>        You may also be interested in <a href=\"https:\/\/docs.rs\/phper\/latest\/phper\/\" target=\"_blank\" rel=\"noopener\">phper<\/a>, a tool that allows writing PHP extensions using pure and safe Rust whenever possible.\n        <\/p>\n<\/li>\n<li><a href=\"https:\/\/github.com\/ScriptFUSION\/Porter\" target=\"_blank\" rel=\"noopener\">ScriptFUSION\/Porter<\/a> \u2013 Durable and asynchronous data imports for consuming data at scale and publishing testable SDKs.\n    <\/li>\n<li>ChatGPT is taking over everything, so you may want to check out the PHP client for OpenAI:\n<ul>\n<li><a href=\"https:\/\/github.com\/openai-php\/client\" target=\"_blank\" rel=\"noopener\">openai-php\/client<\/a> \u2013  A supercharged PHP API client that allows you to interact with OpenAI API.<\/li>\n<li><a href=\"https:\/\/github.com\/orhanerday\/open-ai\" target=\"_blank\" rel=\"noopener\">orhanerday\/open-ai<\/a> \u2013 A PHP SDK for accessing the OpenAI GPT-3 API.<\/li>\n<\/ul>\n<\/li>\n<li><a href=\"https:\/\/github.com\/qossmic\/deptrac\" target=\"_blank\" rel=\"noopener\">qossmic\/deptrac<\/a> 1.0 \u2013 Project architecture analysis tool for determining dependencies between application layers.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/revoltphp\/event-loop\/discussions\/66\" target=\"_blank\" rel=\"noopener\">revoltphp\/event-loop 1.0.0<\/a> \u2013 This event loop is a joint effort between ReactPHP and Amphp maintainers. It is now ready for production use, has been tested in various different applications and scenarios, and fully supports fibers.\n    <\/li>\n<li>\n<blockquote class=\"twitter-tweet\">\n<p lang=\"en\" dir=\"ltr\">Since years, I am annoyed about <a href=\"https:\/\/twitter.com\/hashtag\/PHP?src=hash&amp;ref_src=twsrc%5Etfw\" target=\"_blank\" rel=\"noopener\">#PHP<\/a> extensions with <a href=\"https:\/\/twitter.com\/hashtag\/docker?src=hash&amp;ref_src=twsrc%5Etfw\" target=\"_blank\" rel=\"noopener\">#docker<\/a>. install-php-extensions helps, but still I need to compile the extensions.<\/p>\n<p>So I build a docker registry, which magically adds a docker layer for each extension requested with image. This is experimental! <a href=\"https:\/\/t.co\/EjoptGhvRm\" target=\"_blank\">pic.twitter.com\/EjoptGhvRm<\/a><\/p>\n<p>\u2014 Shyim (@shyim@phpc.social) (@Shyim97) <a href=\"https:\/\/twitter.com\/Shyim97\/status\/1598133126337024000?ref_src=twsrc%5Etfw\" target=\"_blank\" rel=\"noopener\">December 1, 2022<\/a><\/p>\n<\/blockquote>\n<\/li>\n<li><a href=\"https:\/\/github.com\/rob893\/emoji-cache\" target=\"_blank\" rel=\"noopener\">rob893\/emoji-cache<\/a> \u2013 LRU cache implementation, but all identifiers are emojis.\n<p>        <img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/12\/cache.png\" alt=\"\" class=\"wp-image-309525\" width=\"350\">\n        <\/p>\n<\/li>\n<\/ul>\n<h2 id=\"symfony\">Symfony<\/h2>\n<ul>\n<li><a href=\"https:\/\/devblog.ravetracer.de\/blog\/api-rate-liming-per-route-in-symfony-6-1\" target=\"_blank\" rel=\"noopener\">API rate liming per route in Symfony 6.1<\/a> by Christian Nielebock.\n    <\/li>\n<li><a href=\"https:\/\/localheinz.com\/articles\/2022\/08\/29\/asserting-the-output-of-symfony-console-commands\/\" target=\"_blank\" rel=\"noopener\">Asserting the output of Symfony console commands<\/a> by Andreas M\u00f6ller.\n    <\/li>\n<li><a href=\"https:\/\/blog.alphpaca.io\/discover-symfony-ux-components-and-enhance-your-front-end-ffff3a7c0177\" target=\"_blank\" rel=\"noopener\">Discover Symfony UX components and enhance your front-end<\/a> by Jakub Tobiasz.\n    <\/li>\n<li><a href=\"https:\/\/angelovdejan.me\/2022\/11\/24\/centralized-exception-handling-with-symfony-and-custom-php-attributes.html\" target=\"_blank\" rel=\"noopener\">Centralized exception handling with Symfony and custom PHP attributes<\/a> by Dejan Angelov.\n    <\/li>\n<\/ul>\n<h2 id=\"laravel\">Laravel<\/h2>\n<ul>\n<li><a href=\"https:\/\/benjamincrozat.com\/laravel-best-practices\" target=\"_blank\" rel=\"noopener\">Laravel best practices: the definitive guide for 2022<\/a> by Benjamin Crozat.\n    <\/li>\n<li><a href=\"https:\/\/tighten.com\/blog\/are-your-queue-workers-working\/\" target=\"_blank\" rel=\"noopener\">Are Your Queue Workers &#8230; Working?<\/a> by Jamison Valenta.\n    <\/li>\n<li><a href=\"https:\/\/bannister.me\/blog\/using-generators-for-pagination\" target=\"_blank\" rel=\"noopener\">Using Generators for Pagination<\/a> by James Bannister.\n    <\/li>\n<li><a href=\"https:\/\/timacdonald.me\/unique-jobs-and-reserving-resources-on-the-queue\/\" target=\"_blank\" rel=\"noopener\">Unique jobs and reserving resources on the queue<\/a> by Tim MacDonald.\n    <\/li>\n<li><a href=\"https:\/\/laravel-news.com\/laravel-10\" target=\"_blank\" rel=\"noopener\">A Look at What&#8217;s Coming to Laravel 10<\/a> by Paul Redmond.\n    <\/li>\n<li><a href=\"https:\/\/inspector.dev\/save-1-2-million-queries-per-day-with-laravel-eager-loading\/\" target=\"_blank\" rel=\"noopener\">Save 1 million queries with Laravel Eager Loading<\/a> by Valerio Barbera.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/driftingly\/rector-laravel\/blob\/main\/docs\/rector_rules_overview.md?utm_content=65392938\" target=\"_blank\" rel=\"noopener\">Rector rule set for Laravel<\/a> \u2013 Even if you don&#8217;t use <a href=\"https:\/\/github.com\/rectorphp\/rector\" target=\"_blank\" rel=\"noopener\">Rector<\/a>, check out this link anyway! It has some interesting refactoring examples (diffs) for Laravel projects.<\/li>\n<\/ul>\n<h2 id=\"other_frameworks\">Other Frameworks<\/h2>\n<ul>\n<li><a href=\"https:\/\/opencollective.com\/yiisoft\/updates\/yii-news-2022-issue-2\" target=\"_blank\" rel=\"noopener\">Yii news 2022, issue 2<\/a> by Alexander Makarov.\n    <\/li>\n<li><a href=\"https:\/\/opencollective.com\/yiisoft\/updates\/yii3-overview-1-intro\" target=\"_blank\" rel=\"noopener\">Yii3 Overview 1. Intro<\/a>.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/spiral\/framework\/releases\/tag\/3.3.0\" target=\"_blank\" rel=\"noopener\">Spiral 3.3.0 has been released<\/a> \u2013 With a built-in OpenTelemetry support.<\/li>\n<\/ul>\n<h2 id=\"misc\">Misc<\/h2>\n<ul>\n<li><a href=\"https:\/\/24daysindecember.net\/\" target=\"_blank\" rel=\"noopener\"><strong>24 Days in December<\/strong><\/a><strong><br>\n    <\/strong>Every year, for the first 24 days in December, members of the PHP community share their thoughts with us. Here are just a few worth mentioning:<p><\/p>\n<ul>\n<li><a href=\"https:\/\/24daysindecember.net\/2022\/12\/06\/evolving-php\/\" target=\"_blank\" rel=\"noopener\">Evolving PHP<\/a> by Edward Barnard. \u201cWith the current pace of PHP development, userland cannot keep up. Something needs to give.\u201d\n            <\/li>\n<li><a href=\"https:\/\/24daysindecember.net\/2022\/12\/02\/being-a-developer-is-not-the-same-as-knowing-how-to-code\/\" target=\"_blank\" rel=\"noopener\">Being a developer is not the same as knowing how to code<\/a> by Ben Scheffer.\n            <\/li>\n<li><a href=\"https:\/\/24daysindecember.net\/2022\/12\/07\/the-php-8-2-release-managers\/\" target=\"_blank\" rel=\"noopener\">The PHP 8.2 Release Managers<\/a> by Sergey Panteleev.\n            <\/li>\n<li><a href=\"https:\/\/24daysindecember.net\/2022\/12\/08\/an-ode-to-php\/\" target=\"_blank\" rel=\"noopener\">An Ode to PHP<\/a> by Nigel James.\n            <\/li>\n<\/ul>\n<\/li>\n<li><a href=\"https:\/\/pronskiy.com\/blog\/generics-via-attributes-in-php\/\" target=\"_blank\" rel=\"noopener\">Generics via Attributes in PHP<\/a> by Roman Pronskiy.\n    <\/li>\n<li><a href=\"https:\/\/www.doctrine-project.org\/2022\/11\/04\/annotations-to-attributes.html\" target=\"_blank\" rel=\"noopener\">From annotations to attributes<\/a> by Gr\u00e9goire Paris.\n    <\/li>\n<li><a href=\"https:\/\/tomasvotruba.com\/blog\/how-to-measure-your-type-coverage\/\" target=\"_blank\" rel=\"noopener\">How to Measure Your Type Coverage<\/a> by Tomas Votruba.\n    <\/li>\n<li><a href=\"https:\/\/tideways.com\/profiler\/blog\/a-story-of-lazy-loading-file-system-operations-for-better-dev-system-performance\" target=\"_blank\" rel=\"noopener\">A story of Lazy Loading File System Operations for better dev system performance<\/a> by Benjamin Eberlei.<\/li>\n<\/ul>\n<h2 id=\"video\">Video<\/h2>\n<ul>\n<li><strong>&#x1f4fa; <\/strong><a href=\"https:\/\/youtu.be\/-K8u_3-KCvU\" target=\"_blank\" rel=\"noopener\">Writing declarative PHP<\/a> by Andrew Schmelyun.\n    <\/li>\n<li><strong>&#x1f4fa; <\/strong><a href=\"https:\/\/www.youtube.com\/live\/ceEy8i-zGQI\" target=\"_blank\" rel=\"noopener\">What&#8217;s New in PHP 8.2<\/a> by MergePHP.\n    <\/li>\n<li><strong>&#x1f4fa; <\/strong>Guido van Rossum (creator of Python) and Lex Fridman discuss the $ sign in PHP variable names: <a href=\"https:\/\/www.youtube.com\/watch?v=ovkW3AxzOWc\" target=\"_blank\" rel=\"noopener\"><strong>Lex Fridman on PHP programming<\/strong><\/a>.\n    <\/li>\n<\/ul>\n<h2 id=\"conferences\">Conferences<\/h2>\n<ul>\n<li><a href=\"https:\/\/laracon.eu\/\" target=\"_blank\" rel=\"noopener\">Laracon EU<\/a> \u2013 Lisbon (Portugal), January 26\u201327, 2023.\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:\/\/tek.phparch.com\/\" target=\"_blank\" rel=\"noopener\">Php[tek]<\/a> \u2013 Chicago (US), May 16\u201318, 2023.\n    <\/li>\n<li><a href=\"https:\/\/laracon.us\/\" target=\"_blank\" rel=\"noopener\">Laracon US<\/a> \u2013 Nashville, TN, July 19\u201320, 2023.\n    <\/li>\n<\/ul>\n<hr>\n<p>\n    Happy holidays, PHPers! &#x1f384;&#x1f418;\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 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><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","protected":false},"author":869,"featured_media":309318,"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\/309316"}],"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=309316"}],"version-history":[{"count":10,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/phpstorm\/309316\/revisions"}],"predecessor-version":[{"id":309871,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/phpstorm\/309316\/revisions\/309871"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media\/309318"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media?parent=309316"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/categories?post=309316"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/tags?post=309316"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/cross-post-tag?post=309316"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}