{"id":412929,"date":"2023-12-04T15:26:16","date_gmt":"2023-12-04T14:26:16","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=phpstorm&#038;p=412929"},"modified":"2024-01-09T17:48:10","modified_gmt":"2024-01-09T16:48:10","slug":"php-annotated-november-2023","status":"publish","type":"phpstorm","link":"https:\/\/blog.jetbrains.com\/de\/phpstorm\/2023\/12\/php-annotated-november-2023","title":{"rendered":"PHP Annotated \u2013 November 2023"},"content":{"rendered":"<p><a href=\"https:\/\/blog.jetbrains.com\/phpstorm\/2023\/12\/php-annotated-november-2023\/\"><img decoding=\"async\" class=\"alignnone size-full\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/12\/php-annotated-featured_blog_1280x720.png\" alt=\"PHP Annotated Monthly\" width=\"900\"><\/a><\/p>\n<p>Welcome to the November edition of PHP Annotated! In it, we look back over some of the most interesting developments in the PHP community during the past month, featuring handpicked 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;} section.article-section a {color: #7755f3} code {color: red;} #roman-pronskiy,.copy-heading:has(#roman-pronskiy){margin-top: 0;}<\/style>\n<h2 id=\"highlights\">Highlights<\/h2>\n<ul>\n<li><strong>&#x1f389; <\/strong><a href=\"https:\/\/www.php.net\/releases\/8.3\/\" target=\"_blank\" rel=\"noopener\"><strong>PHP 8.3.0 released!<\/strong><\/a>\n<p>        PHP 8.3 is a major update of the PHP language. It contains new features, such as typed class constants, deep-cloning of readonly properties, and additions to the random functionality. As always, it also includes performance improvements, bug fixes, and a general cleanup.<\/p>\n<p>        For a detailed list of what\u2019s new in PHP 8.3, check out the <a href=\"https:\/\/www.php.net\/releases\/8.3\/\" target=\"_blank\" rel=\"noopener\"><strong>release page<\/strong><\/a>, the <a href=\"https:\/\/www.php.net\/manual\/en\/migration83.php\" target=\"_blank\" rel=\"noopener\"><strong>migration guide<\/strong><\/a><strong>, <\/strong>and learn a little more about the release in the PHP Foundation\u2019s <a href=\"https:\/\/thephp.foundation\/blog\/2023\/11\/23\/php-83\/\" target=\"_blank\" rel=\"noopener\"><strong>announcement<\/strong><\/a>.<\/p>\n<p>        <strong>Install or upgrade to PHP 8.3<\/strong><\/p>\n<ul>\n<li>Windows: Compiled binaries can be found at <a href=\"https:\/\/windows.php.net\/download\/\" target=\"_blank\" rel=\"noopener\">windows.php.net<\/a>. Alternatively, you can opt for a community build available <a href=\"https:\/\/community.chocolatey.org\/packages\/php\" target=\"_blank\" rel=\"noopener\">on Chocolatey<\/a>.<\/li>\n<li>Ubuntu\/Debian: PHP 8.3 is available on <a href=\"https:\/\/launchpad.net\/~ondrej\/+archive\/ubuntu\/php\/\" target=\"_blank\" rel=\"noopener\">ondrej\/php<\/a> PPA.<\/li>\n<li>Fedora\/RHEL\/CentOS: Available as a software collection (php83) from the <a href=\"https:\/\/blog.remirepo.net\/\" target=\"_blank\" rel=\"noopener\">Remi repo<\/a>.<\/li>\n<li>macOS: PHP 8.3 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.3 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&#038;name=8.3\" target=\"_blank\" rel=\"noopener\">8.3 tags<\/a>.<\/li>\n<\/ul>\n<p>        <a href=\"https:\/\/blog.jetbrains.com\/phpstorm\/2023\/11\/phpstorm-now-supports-php-8-3\/\"><strong>PhpStorm already supports PHP 8.3<\/strong><\/a><strong>.<\/strong><\/p>\n<p>        Watch a &#x1f4fa; <a href=\"https:\/\/www.youtube.com\/watch?v=VWryF035B6U\" target=\"_blank\" rel=\"noopener\">Celebrating PHP 8.3<\/a> stream with Freek, Brent, and Roman.\n    <\/li>\n<li><strong>&#x26a0;&#xfe0f; PHP 8.0 has reached end of life<\/strong>\n<p>        PHP 8.0.30 marked the last release of PHP 8.0. It will no longer receive official security updates.\n    <\/li>\n<li><a href=\"https:\/\/www.php.net\/ChangeLog-8.php#8.1.26\" target=\"_blank\" rel=\"noopener\"><strong>PHP 8.1.26<\/strong><\/a><strong> and <\/strong><a href=\"https:\/\/www.php.net\/ChangeLog-8.php#8.2.13\" target=\"_blank\" rel=\"noopener\"><strong>PHP 8.2.13<\/strong><\/a> have been released\n<p>        &#x1f41b; These are bug-fix releases. <\/p>\n<p>        The PHP 8.1 branch will receive one more release, PHP 8.1.27, which will be the last bug-fix release, with only security bug fixes being released thereafter.\n    <\/li>\n<li><strong>&#x1f382; The PHP Foundation turns two<\/strong><br \/>\n        The PHP Foundation was <a href=\"https:\/\/blog.jetbrains.com\/phpstorm\/2021\/11\/the-php-foundation\/\">established two years ago<\/a>.<\/p>\n<p>        Over the past year, the PHP Foundation has supported the work of six <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>        Check out the <a href=\"https:\/\/thephp.foundation\/blog\/2023\/11\/27\/php-foundation-update-november-2023\/\" target=\"_blank\" rel=\"noopener\"><strong>PHP Foundation\u2019s November 2023 Update<\/strong><\/a>.<\/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>.\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 make a few brief mentions:<\/p>\n<ul>\n<li>&#x1f4e3; <a href=\"https:\/\/wiki.php.net\/rfc\/resource_to_object_conversion\" target=\"_blank\" rel=\"noopener\"><strong>RFC: Resource to object conversion<\/strong><\/a><br \/>\n        <code>Resource<\/code> is an obsolete data structure in PHP that has long since been superseded by objects. Work on <a href=\"https:\/\/php.watch\/articles\/resource-object\" target=\"_blank\" rel=\"noopener\">replacing resources with objects<\/a> started back in 2013, but most extensions only migrated with the release of PHP 8.0.<\/p>\n<p>        M\u00e1t\u00e9 Kocsis suggests migrating the remaining extensions and defining a policy for future development.<\/p>\n<\/li>\n<li>&#x1f4e3; <a href=\"https:\/\/wiki.php.net\/rfc\/release_cycle_update\" target=\"_blank\" rel=\"noopener\"><strong>RFC: Release cycle update<\/strong><\/a><br \/>\n        Currently, the lifetime of a PHP version is 3 years. Many people consider this to be too short, and the pre-release phase, which is six months, excessively long.<\/p>\n<p>        Jakub Zelenka, the PHP 8.3 release manager, proposes to increase the PHP version lifetime to 4 years (2 years of maintenance and 2 years of security updates) and to revise the pre-release phase.<\/p>\n<\/li>\n<li>&#x1f4e3; <a href=\"https:\/\/wiki.php.net\/rfc\/improve_callbacks_dom_and_xsl\" target=\"_blank\" rel=\"noopener\"><strong>RFC: Improve callbacks in ext\/dom and ext\/xsl<\/strong><\/a><br \/>\n        Niels Dossche proposes to allow <code>XSLTProcessor::registerPHPFunctions()` and `DOMXPath::registerPhpFunctions()` methods to use `callable<\/code>.<\/p>\n<\/li>\n<li>&#x1f4e3; <a href=\"https:\/\/wiki.php.net\/rfc\/jit_config_defaults\" target=\"_blank\" rel=\"noopener\"><strong>RFC: Change how JIT is disabled by default<\/strong><\/a><br \/>\n        Currently, JIT is running in <code>tracing<\/code> mode, but disabled by default when <code>opcache.jit_buffer_size<\/code> is set to <code>0<\/code>. RFC suggests disabling JIT by default by setting <code>opcache.jit=disable<\/code>, and increasing the default <code>jit_buffer_size<\/code> value to <code>64m<\/code>.<\/p>\n<\/li>\n<li>&#x1f4e3; <a href=\"https:\/\/wiki.php.net\/rfc\/final_anonymous_classes\" target=\"_blank\" rel=\"noopener\"><strong>RFC: Final anonymous classes<\/strong><\/a><strong>\n<p>    <\/strong>The RFC proposes one of the three options to improve experience with anonymous classes:<\/p>\n<p>        1. Add support for final anonymous classes (<code>new final class {}<\/code> syntax, no breaking changes).<br \/>\n        2. <em>OR<\/em> Make all anonymous classes final by default, without the option to make them final (breaking change)<br \/>\n        3. <em>OR<\/em> Make all anonymous classes final by default, provide an optional `<kbd>open`<\/kbd> keyword to make them non-final (like in Kotlin, <code>new open class {}<\/code>, breaking changes).<\/p>\n<\/li>\n<li>&#x1f4e3; <a href=\"https:\/\/wiki.php.net\/rfc\/property-hooks\" target=\"_blank\" rel=\"noopener\"><strong>RFC: Property Hooks<\/strong><\/a><br \/>\n        In this RFC, Ilija Tovillo and Larry Garfield propose to declare virtual properties with get\/set functions.<\/p>\n<p>        The design and syntax is most similar to <a href=\"https:\/\/kotlinlang.org\/docs\/properties.html#getters-and-setters\" target=\"_blank\" rel=\"noopener\">Kotlin<\/a>, although it also draws influence from C# and <a href=\"https:\/\/docs.swift.org\/swift-book\/documentation\/the-swift-programming-language\/properties\/#Computed-Properties\" target=\"_blank\" rel=\"noopener\">Swift<\/a>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\" data-enlighter-title=\"\">\nclass User implements Named\n{\n    private bool $isModified = false;\n \n    public function __construct(private string $first, private string $last) {}\n \n    public string $fullName {\n        get =&gt; $this-&gt;first . &quot; &quot; . $this-&gt;last;\n \n        set($value) =&gt; [$this-&gt;first, $this-&gt;last] = explode(&#039; &#039;, $value);\n    }\n}\n<\/pre>\n<p>        Interesting side effect of this RFC is that it allows to declare abstract properties in interfaces:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\" data-enlighter-title=\"\">\nabstract class A\n{\n    abstract public string $readable { get; }\n    abstract protected string $writeable { set; }\n    abstract protected string $both { get; set; }   \n}\n \nclass C extends A\n{\n    public string $readable;\n    protected string $readable;\n    protected string $writeable {\n        set =&gt; $field = $value;\n    }\n    public string $both;\n}\n<\/pre>\n<p>        Thanks to <a href=\"https:\/\/github.com\/sponsors\/SjonHortensius\" target=\"_blank\" rel=\"noopener\">Sjon Hortensius<\/a>, you can already try property hooks on <a href=\"https:\/\/3v4l.org\/\" target=\"_blank\" rel=\"noopener\">3v4l.org<\/a>.<\/p>\n<p>        And you can also provide your feedback on <a href=\"https:\/\/rfc.stitcher.io\/\" target=\"_blank\" rel=\"noopener\">RFC Vote<\/a>: <a href=\"https:\/\/rfc.stitcher.io\/rfc\/property-hooks\" target=\"_blank\" rel=\"noopener\">Property Hooks<\/a>.\n    <\/li>\n<\/ul>\n<h2 id=\"tools\">Tools<\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/php-tui\/php-tui\" target=\"_blank\" rel=\"noopener\">php-tui\/php-tui<\/a> \u2013 A framework for creating console applications in PHP with pseudo graphical UI.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/Crell\/Serde\" target=\"_blank\" rel=\"noopener\">Crell\/Serde<\/a> \u2013 A robust serialization\/deserialization library for PHP 8.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/pestphp\/pest-plugin-stressless\" target=\"_blank\" rel=\"noopener\">pestphp\/pest-plugin-stressless<\/a> \u2013 A stress load testing plugin for Pest built on top of <a href=\"https:\/\/github.com\/grafana\/k6\" target=\"_blank\" rel=\"noopener\">grafana\/k6<\/a>. See the introductory video &#x1f4fa; <a href=\"https:\/\/www.youtube.com\/watch?v=SaMoPZwdOCY\" target=\"_blank\" rel=\"noopener\">Stressless: Stress Testing for PHP<\/a>.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/buggregator\/server\" target=\"_blank\" rel=\"noopener\">buggregator\/server<\/a> \u2013 A lightweight, standalone server that offers a range of debugging features for PHP applications, including XHprof profiler, Symfony VarDumper server, SMTP server, Sentry-compatibile server, Monolog server, and HTTP requests dump server.\n<p>        It comes with <a href=\"https:\/\/github.com\/buggregator\/trap\" target=\"_blank\" rel=\"noopener\">buggregator\/trap<\/a> \u2013 a console mini-server and helper for more convenient debugging in PHP.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/NoiseByNorthwest\/php-spx\" target=\"_blank\" rel=\"noopener\">NoiseByNorthwest\/php-spx<\/a> \u2013 A simple and straight-to-the-point PHP profiling extension with its built-in web UI.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/reliforp\/reli-prof\" target=\"_blank\" rel=\"noopener\">reliforp\/reli-prof<\/a> \u2013 A sampling profiler or a memory profiler for PHP written in PHP, which reads information about running PHP VM from outside the process. You can find performance bottlenecks or memory leaks in your scripts without changing the target script or loading extensions.\n<p>        Alternatively, you can try <a href=\"https:\/\/github.com\/arnaud-lb\/php-memory-profiler\" target=\"_blank\" rel=\"noopener\">arnaud-lb\/php-memory-profiler<\/a> \u2013 A memory profiler extension for PHP. It helps find memory leaks in PHP scripts.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/saloonphp\/xml-wrangler\" target=\"_blank\" rel=\"noopener\">saloonphp\/xml-wrangler<\/a> \u2013 A simplistic PHP library designed to make reading and writing XML easy. See also <a href=\"https:\/\/github.com\/veewee\/xml\" target=\"_blank\" rel=\"noopener\">veewee\/xml<\/a> \u2013 A package that provides all the tools you need for worry-free work with XML in PHP.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/jolicode\/JoliMarkdown\" target=\"_blank\" rel=\"noopener\">jolicode\/JoliMarkdown<\/a> \u2013 A syntax fixer for markdown content. Read <a href=\"https:\/\/jolicode.com\/blog\/introducing-jolimarkdown-for-a-more-robust-and-rigorous-markdown-content\" target=\"_blank\" rel=\"noopener\">Introducing JoliMarkdown<\/a> for more details.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/cerbero90\/lazy-json\" target=\"_blank\" rel=\"noopener\">cerbero90\/lazy-json<\/a> \u2013 A framework-agnostic package to recursively load JSON files of any dimension and any source into Laravel lazy collections.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/staabm\/phpstan-baseline-analysis\" target=\"_blank\" rel=\"noopener\">staabm\/phpstan-baseline-analysis<\/a> \u2013 Analyzes PHPStan baseline files and creates aggregated error trend-reports.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/spiral\/json-schema-generator\" target=\"_blank\" rel=\"noopener\">spiral\/json-schema-generator<\/a> \u2013 Provides the ability to generate JSON schemas from Data Transfer Object (DTO) classes.\n    <\/li>\n<\/ul>\n<h2 id=\"symfony\">Symfony<\/h2>\n<ul>\n<li><a href=\"https:\/\/symfony.com\/7\" target=\"_blank\" rel=\"noopener\"><strong>Symfony 7<\/strong><\/a><strong> <\/strong><strong>released<\/strong><br \/>\n        Check out the <a href=\"https:\/\/symfony.com\/blog\/category\/living-on-the-edge\/7.0-6.4\" target=\"_blank\" rel=\"noopener\">Living on the edge<\/a> list to learn about new features in this release. Or check out these <a href=\"https:\/\/slidr.io\/derrabus\/hello-symfony-7#1\" target=\"_blank\" rel=\"noopener\">Hello Symfony 7<\/a> slides by Alexander M. Turek.<\/p>\n<p>        <a href=\"https:\/\/symfony.com\/releases\/6.4\" target=\"_blank\" rel=\"noopener\">Symfony 6.4<\/a> has also been released along with 7.0. Both versions contain the same set of features, except for support for deprecated features.<\/p>\n<p>        Also, Symfony 6.4 is a long-term support version that will get bug fixes for 3 years and security bugs for another 1 year. Symfony 7.0 is a regular version that will only be supported for 8 months.<\/p>\n<\/li>\n<li><a href=\"https:\/\/jolicode.com\/blog\/making-a-single-page-application-with-htmx-and-symfony\" target=\"_blank\" rel=\"noopener\">Making a Single-Page Application with HTMX and Symfony<\/a> by Julien Cousin-Alliot.\n    <\/li>\n<li><a href=\"https:\/\/smaine-milianni.medium.com\/a-retry-mechanism-for-symfony-commands-15d48f9d4657\" target=\"_blank\" rel=\"noopener\">A retry mechanism for Symfony commands<\/a> by Smaine Milianni.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/phpyh\/service-dumper-bundle\" target=\"_blank\" rel=\"noopener\">phpyh\/service-dumper-bundle<\/a> \u2013 Symfony console command to dump dependency injection services.\n    <\/li>\n<\/ul>\n<h2 id=\"laravel\">Laravel<\/h2>\n<ul>\n<li><a href=\"https:\/\/pulse.laravel.com\/\" target=\"_blank\" rel=\"noopener\">Laravel Pulse announced<\/a> \u2013 The Laravel team revealed an upcoming free and open-source tool.  It will be a dashboard with key performance and usage metrics for your app.\n    <\/li>\n<li><a href=\"https:\/\/tinkerwell.app\/whats-new-in-tinkerwell-4\" target=\"_blank\" rel=\"noopener\">Tinkerwell v4 is now out<\/a> \u2013 Check out this &#x1f4fa; <a href=\"https:\/\/www.youtube.com\/watch?v=9FBBsnwRWJ4\" target=\"_blank\" rel=\"noopener\">Detail Dive<\/a>.\n    <\/li>\n<li><a href=\"https:\/\/www.mongodb.com\/blog\/post\/mongodb-laravel-integration-now-officially-supported\" target=\"_blank\" rel=\"noopener\">MongoDB Laravel Integration Now Officially Supported<\/a> \u2013 MongoDB has taken over development of the community-driven MongoDB integration for Laravel, making it a first-class citizen in their product portfolio.\n    <\/li>\n<li><a href=\"https:\/\/benjamincrozat.com\/how-laravel-works\" target=\"_blank\" rel=\"noopener\">How does Laravel work? A crystal clear explanation<\/a> by Benjamin Crozat.\n    <\/li>\n<li><a href=\"https:\/\/dcblog.dev\/my-process-for-writing-laravel-packages\" target=\"_blank\" rel=\"noopener\">My process for writing Laravel packages<\/a> by David Carr.<\/li>\n<li><a href=\"https:\/\/muhammedsari.me\/unorthodox-eloquent-2\" target=\"_blank\" rel=\"noopener\">Unorthodox Eloquent II<\/a> by Muhammed Sari.\n    <\/li>\n<li><a href=\"https:\/\/tighten.com\/insights\/overview-of-caching-strategies-in-laravel\/\" target=\"_blank\" rel=\"noopener\">Caching Strategies In Laravel<\/a> by Jamison Valenta.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/laravel\/pail\" target=\"_blank\" rel=\"noopener\">laravel\/pail<\/a> \u2013 A tool to view Laravel logs in the terminal in a convenient way.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/waterholeforum\/core\" target=\"_blank\" rel=\"noopener\">waterholeforum\/core<\/a> \u2013 A Laravel-powered community platform \/ forum.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/BookStackApp\/BookStack\" target=\"_blank\" rel=\"noopener\">BookStackApp\/BookStack<\/a> \u2013 A platform to create documentation\/wiki content built with PHP and Laravel.\n    <\/li>\n<\/ul>\n<h2 id=\"other_frameworks\">Other Frameworks<\/h2>\n<ul>\n<li><a href=\"https:\/\/wordpress.org\/news\/2023\/11\/shirley\/\" target=\"_blank\" rel=\"noopener\">WordPress 6.4 \u201cShirley\u201d is released<\/a>\n    <\/li>\n<\/ul>\n<h2 id=\"misc\">Misc<\/h2>\n<ul>\n<li><a href=\"https:\/\/jeffochoa.me\/php-enums-best-practices\" target=\"_blank\" rel=\"noopener\">Best Practices for Using PHP Enumerations<\/a> by Jeff Ochoa.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/php-fig\/per-coding-style\/blob\/master\/migration-2.0.md\" target=\"_blank\" rel=\"noopener\">Migrating from PER-CS v1.0 (PSR-12) to PER-CS v2.0<\/a> by PHP-FIG.\n    <\/li>\n<li><a href=\"https:\/\/php.watch\/articles\/php-curl-http3\" target=\"_blank\" rel=\"noopener\">HTTP\/3 Request with PHP Curl Extension<\/a> by Ayesh Karunaratne.\n    <\/li>\n<li><a href=\"https:\/\/php.watch\/articles\/caddy-php\" target=\"_blank\" rel=\"noopener\">How to use Caddy Server with PHP<\/a> by Ayesh Karunaratne.\n    <\/li>\n<li><a href=\"https:\/\/www.dereuromark.de\/2023\/11\/27\/working-with-decimals-in-php-apps\/\" target=\"_blank\" rel=\"noopener\">Working with decimals in PHP apps<\/a> by Mark Scherer.\n    <\/li>\n<li><a href=\"https:\/\/developer.vonage.com\/en\/blog\/type-safety-done-right-php-array-hacking\" target=\"_blank\" rel=\"noopener\">Type Safety Done Right &#8211; PHP Array Hacking<\/a> by James Seconde.\n    <\/li>\n<li><a href=\"https:\/\/staabm.github.io\/2023\/10\/30\/phpstan-filter-baseline.html\" target=\"_blank\" rel=\"noopener\">Phpstan Filter Baseline<\/a> by Markus Staab  \u2013 One way to work through a huge PHPStan baseline.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/php-youtubers\/directory\" target=\"_blank\" rel=\"noopener\">Curated a list of PHP YouTubers<\/a>.\n    <\/li>\n<li><a href=\"https:\/\/finixbit.github.io\/posts\/autonomous-Hacking-of-PHP-Web-Applications-at-the-Bytecode-Level\/\" target=\"_blank\" rel=\"noopener\">Autonomous Hacking of PHP Web Applications at the Bytecode Level<\/a> by Samuel Finixbit.\n    <\/li>\n<li><a href=\"https:\/\/bref.sh\/docs\/case-studies\/treezor\" target=\"_blank\" rel=\"noopener\">Bref case study: How Treezor runs a serverless banking platform with Bref<\/a> \u2013 They started with a legacy PHP monolith on servers, put the monolith in Lambda (aka &quot;a bank in a Lambda&quot;), and then transitioned to microservices.\n    <\/li>\n<li><a href=\"https:\/\/www.exakat.io\/en\/mastering-the-array-cast-operator-in-php-a-comprehensive-guide\/\" target=\"_blank\" rel=\"noopener\">Mastering the (array) Cast Operator in PHP: A Comprehensive Guide<\/a> by Damien Seguy.\n    <\/li>\n<li><a href=\"https:\/\/chat.openai.com\/g\/g-6cqBCrKTn-wp-plugin-architect\" target=\"_blank\" rel=\"noopener\">WP-Plugin-Architect<\/a> \u2013 Custom (Chat)GPT that can write WordPress plugins, while paying special attention to code security.\n    <\/li>\n<li>\n<blockquote class=\"twitter-tweet\">\n<p lang=\"en\" dir=\"ltr\">Cool <a href=\"https:\/\/twitter.com\/hashtag\/gpt?src=hash&amp;ref_src=twsrc%5Etfw\" target=\"_blank\" rel=\"noopener\">#gpt<\/a> trick I learned from a friend today:<\/p>\n<p>1) create a private GPT<br \/>2) upload your <a href=\"https:\/\/twitter.com\/hashtag\/php?src=hash&amp;ref_src=twsrc%5Etfw\" target=\"_blank\" rel=\"noopener\">#php<\/a> project in a zip<br \/>3) ask it questions on how to improve it<\/p>\n<p>Who knew this goes far beyond the 128k context window &#x1f60e;<\/p>\n<p>The results are impresive&#8230; feels like talking to myself with having\u2026 <a href=\"https:\/\/t.co\/nlOyFlmQ70\" target=\"_blank\">pic.twitter.com\/nlOyFlmQ70<\/a><\/p>\n<p>&mdash; Tomas Votruba (@VotrubaT) <a href=\"https:\/\/twitter.com\/VotrubaT\/status\/1725272310729306346?ref_src=twsrc%5Etfw\" target=\"_blank\" rel=\"noopener\">November 16, 2023<\/a><\/p>\n<\/blockquote>\n<\/li>\n<\/ul>\n<h2 id=\"fun\">Fun<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.kickstarter.com\/projects\/734475887\/sylius-elephpant\" target=\"_blank\" rel=\"noopener\">Sylius is now offering their ElePHPant<\/a> in a crowdfunding campaign on Kickstarter.<br \/>\n        <a href=\"https:\/\/www.kickstarter.com\/projects\/734475887\/sylius-elephpant\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" src=\"https:\/\/sylius.elephpant.com\/assets\/images\/main-photo-cropped-ead882b453e3227a738a15f4074f1410.jpg\" alt=\"\" width=\"400\"><\/a>\n    <\/li>\n<li><a href=\"https:\/\/www.vincentpontier.com\/elephpant\/produit\/the-ping-original-legend-numbered-certified\/\" target=\"_blank\" rel=\"noopener\">The Original Pink Elephpant<\/a> is available for sale.\n    <\/li>\n<\/ul>\n<h2 id=\"conferences\">Conferences<\/h2>\n<p>Check out these upcoming PHP gigs worth visiting and applying to present at:<\/p>\n<ul>\n<li><a href=\"https:\/\/live.symfony.com\/2023-brussels-con\/\" target=\"_blank\" rel=\"noopener\">SymfonyCon<\/a> \u2013 Brussels, Belgium, December 7\u20138, 2023.<\/li>\n<li><a href=\"https:\/\/laracon.eu\/\" target=\"_blank\" rel=\"noopener\">Laracon EU<\/a> \u2013 Amsterdam, The Netherlands, Feb 5\u20136, 2024.<\/li>\n<li><a href=\"https:\/\/www.phpconference.co.uk\/\" target=\"_blank\" rel=\"noopener\">PHP UK<\/a> \u2013 London, UK, February 15\u201316, 2024.<\/li>\n<li><a href=\"https:\/\/laracon.in\/\" target=\"_blank\" rel=\"noopener\">Laracon India<\/a> \u2013 Udaipur, India, March 23\u201324, 2024. <a href=\"https:\/\/docs.google.com\/forms\/d\/e\/1FAIpQLSdHBOswhGtvmrZLaeHDwdnksJ4oHCvNG58oTyC5roTNA99Qjw\/viewform\" target=\"_blank\" rel=\"noopener\">CFP<\/a><\/li>\n<li><a href=\"https:\/\/tek.phparch.com\/\" target=\"_blank\" rel=\"noopener\">PHP[TEK] 2024<\/a> \u2013 Chicago, IL, USA, April 23\u201325, 2024. <a href=\"https:\/\/sessionize.com\/phptek-2024\" target=\"_blank\" rel=\"noopener\">CFP<\/a><\/li>\n<li><a href=\"https:\/\/2024.phpday.it\/\" target=\"_blank\" rel=\"noopener\">phpday 2024<\/a> \u2013 Verona, Italy, May 16\u201317, 2024. <a href=\"https:\/\/sessionize.com\/phpday-2024\" target=\"_blank\" rel=\"noopener\">CFP<\/a><\/li>\n<li><a href=\"https:\/\/phpconference.com\/berlin-en\/\" target=\"_blank\" rel=\"noopener\">International PHP Conference<\/a> \u2013 Berlin, Germany, May 27\u201331, 2024 <a href=\"https:\/\/phpconference.com\/call-for-papers\/\" target=\"_blank\" rel=\"noopener\">CFP<\/a><\/li>\n<\/ul>\n<p>If you\u2019re wondering when the next PHP meetup near you is happening, <a href=\"https:\/\/twitter.com\/VotrubaT\" target=\"_blank\" rel=\"noopener\">Tomas Votruba<\/a> 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 <a href=\"https:\/\/www.php.net\/cal.php\" target=\"_blank\" rel=\"noopener\">calendar on php.net<\/a>.<\/p>\n<hr>\n<p>That&#8217;s all for today. Thanks for reading!<\/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 us a <a href=\"https:\/\/twitter.com\/pronskiy\" target=\"_blank\" rel=\"noopener\">tweet<\/a>.\n<\/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<p>\n    <script src=\"https:\/\/mastodon.social\/embed.js\" async=\"async\"><\/script><br \/>\n    <script async=\"\" src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script>\n<\/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 the <a href=\"https:\/\/twitter.com\/PhpStorm\" target=\"_blank\" rel=\"noopener\">@PhpStorm<\/a> team, Operation 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":412946,"comment_status":"closed","ping_status":"closed","template":"","categories":[],"tags":[2213,190,6755,8111,2323,2648,191],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/phpstorm\/412929"}],"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=412929"}],"version-history":[{"count":9,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/phpstorm\/412929\/revisions"}],"predecessor-version":[{"id":414125,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/phpstorm\/412929\/revisions\/414125"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media\/412946"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media?parent=412929"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/categories?post=412929"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/tags?post=412929"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/cross-post-tag?post=412929"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}