{"id":221396,"date":"2022-01-27T16:27:39","date_gmt":"2022-01-27T15:27:39","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=phpstorm&#038;p=221396"},"modified":"2022-08-09T17:14:53","modified_gmt":"2022-08-09T16:14:53","slug":"php-annotated-january-2022","status":"publish","type":"phpstorm","link":"https:\/\/blog.jetbrains.com\/en\/phpstorm\/2022\/01\/php-annotated-january-2022","title":{"rendered":"PHP Annotated \u2014 January 2022"},"content":{"rendered":"<p><a href=\"https:\/\/blog.jetbrains.com\/phpstorm\/2022\/01\/php-annotated-january-2022\/\"><img decoding=\"async\" class=\"alignnone size-full\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/01\/phpstorm-PHP_Annotated_blog_1600x800.png\" alt=\"PHP Annotated Monthly\" width=\"800\"><\/a><\/p>\n<p>Greetings everyone,<br \/>\nCatch up on the latest from the PHP world with our specially curated news, articles, tools, and videos.<\/p>\n<p><!--more--><\/p>\n<style>\n    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: 12px;}  summary {display: list-item;cursor: pointer;font-style: italic;}<\/style>\n<h2>News<\/h2>\n<ul>\n<li><strong><a href=\"https:\/\/opencollective.com\/phpfoundation\/updates\/the-php-foundation-update\" target=\"_blank\" rel=\"noopener\">The PHP Foundation Update, January 2022<\/a><\/strong><br \/>\n<a href=\"https:\/\/opencollective.com\/phpfoundation\" target=\"_blank\" rel=\"noopener\">The PHP Foundation<\/a> started its work at the end of November as a non-profit organization whose mission is to ensure the long life and prosperity of the PHP language.<\/p>\n<p>We already have the first results. Applications for sponsorship from core developers have been received and are being processed.<\/p>\n<p>The foundation team will be publishing monthly updates so you can subscribe to our Twitter <a href=\"https:\/\/twitter.com\/thephpf\" target=\"_blank\" rel=\"noopener\">@thephpf<\/a> to stay up to date with the news.<\/p>\n<p>To learn more about The PHP Foundation check out the <a href=\"https:\/\/voicesoftheelephpant.com\/2021\/12\/17\/interview-with-the-php-foundation\/\" target=\"_blank\" rel=\"noopener\">Voices of the ElePHPant Ep 366<\/a> podcast with Joe Watkins, Sara Golemon, and Sebastian Bergmann.<\/li>\n<li><strong><a href=\"https:\/\/www.php.net\/ChangeLog-8.php#8.0.15\" target=\"_blank\" rel=\"noopener\">PHP 8.0.15<\/a>, <a href=\"https:\/\/www.php.net\/ChangeLog-8.php#8.1.2\" target=\"_blank\" rel=\"noopener\">PHP 8.1.2<\/a>, <a href=\"https:\/\/www.php.net\/ChangeLog-7.php#7.4.27\" target=\"_blank\" rel=\"noopener\">PHP 7.4.27<\/a><\/strong><br \/>\nBug fixes for current PHP branches have been released. In the case of PHP 7.4 this is the last regular release, and from now on only security updates will be issued for the PHP 7.4 branch.<\/li>\n<li><strong><a href=\"https:\/\/stitcher.io\/blog\/php-version-stats-january-2022\" target=\"_blank\" rel=\"noopener\">PHP version stats: January, 2022<\/a><\/strong><br \/>\nHere are some fresh stats for PHP versions according to <a href=\"https:\/\/packagist.org\/php-statistics\" target=\"_blank\" rel=\"noopener\">packagist.org<\/a>. Version 8.1 only came out two months ago, but it&#8217;s already gained a 9.1% share. However, there&#8217;s still a lot of PHP 7.4 (44%).<br \/>\n<img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/01\/php_versions.png\" width=\"500\"><\/li>\n<li><strong><a href=\"https:\/\/wiki.php.net\/rfc\/user_defined_operator_overloads#vote\" target=\"_blank\" rel=\"noopener\">[RFC] User Defined Operator Overloads<\/a><\/strong><br \/>\nA proposal to add operator overloading to PHP failed to pass the vote. You can, however, listen to the <a href=\"https:\/\/phpinternals.news\/96\" target=\"_blank\" rel=\"noopener\">PHP Internals News<\/a> podcast with the author Jordan LeDoux to learn the details.<br \/>\nJordan also published very thorough instructions on <a href=\"https:\/\/www.reddit.com\/r\/PHP\/comments\/s0pv1e\/how_to_make_an_rfc_for_php\/\" target=\"_blank\" rel=\"noopener\"><em>How to make an RFC for PHP<\/em><\/a>.<\/p>\n<p>In the meantime, operator overloading can already be used in PHP thanks to <a href=\"https:\/\/github.com\/lisachenko\/z-engine\" target=\"_blank\" rel=\"noopener\">lisachenko\/z-engine<\/a> and FFI. For an example of the implementation of operators for matrices, see: <a href=\"https:\/\/github.com\/lisachenko\/native-php-matrix\" target=\"_blank\" rel=\"noopener\">lisachenko\/native-php-matrix<\/a>.<\/li>\n<\/ul>\n<h2>Releases<\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/thephpleague\/flysystem\" target=\"_blank\" rel=\"noopener\">thephpleague\/flysystem 3.0.0<\/a> \u2013 A major update of the popular library for working with file systems. Check out the <a href=\"https:\/\/blog.frankdejonge.nl\/flysystem-3-0-0-is-released\/\" target=\"_blank\" rel=\"noopener\">blog post<\/a> with all the details.<\/li>\n<li><a href=\"https:\/\/spiralscout.com\/blog\/meet-cycle-2-0\" target=\"_blank\" rel=\"noopener\">Cycle 2.0<\/a> \u2013 The second major release of Cycle \u2013 a DataMapper and ORM for PHP that can be used in both traditional and daemonized PHP applications.<\/li>\n<li><a href=\"https:\/\/github.com\/ankitpokhrel\/tus-php\" target=\"_blank\" rel=\"noopener\">ankitpokhrel\/tus-php 1.0<\/a> \u2013 Server and client implementation of the <a href=\"https:\/\/tus.io\/\" target=\"_blank\" rel=\"noopener\">tus.io<\/a>, an open protocol for renewable file uploads. The protocol is used, for example, in Vimeo and Cloudflare.<\/li>\n<li><a href=\"https:\/\/infection.github.io\/2022\/01\/10\/whats-new-in-0.26.0\/\" target=\"_blank\" rel=\"noopener\">Infection PHP 0.26.0<\/a> \u2013 An update to the PHP mutation testing framework. The new version adds HTML reports, mutation of only changed strings, and more.<\/li>\n<li><a href=\"https:\/\/www.doctrine-project.org\/2022\/01\/11\/orm-2.11.html\" target=\"_blank\" rel=\"noopener\">Doctrine ORM 2.11<\/a> \u2013 The update brings support for enumerations, virtual columns, read-only properties, nested attributes, and more.<\/li>\n<li><a href=\"https:\/\/github.com\/Roave\/BetterReflection\/releases\/tag\/5.0.0\" target=\"_blank\" rel=\"noopener\">Roave\/BetterReflection 5.0<\/a> \u2013 Improved Reflection API: you can get information without loading classes, from closures, and much more. The new version adds support for PHP 8.1 and has better performance.<\/li>\n<\/ul>\n<h2>Tools<\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/viewi\/viewi\" target=\"_blank\" rel=\"noopener\">viewi\/viewi<\/a> \u2013 A powerful tool for creating reactive applications using only PHP and HTML.        In essence, it&#8217;s a server-side template engine + frontend framework. But the zest is that you describe all components and logic in PHP and then the tool transpiles them into native JS.The project website <a href=\"https:\/\/viewi.net\/\" target=\"_blank\" rel=\"noopener\">viewi.net<\/a> details the <a href=\"https:\/\/viewi.net\/docs\/introduction#whatisviewi\" target=\"_blank\" rel=\"noopener\">mechanism of operation<\/a> and has code examples. You can also follow a <a href=\"https:\/\/github.com\/ivanvoitovych\/tour-of-heroes\" target=\"_blank\" rel=\"noopener\">step-by-step tutorial<\/a> and check out the <a href=\"https:\/\/viewi.net\/docs\/integrations-symfony\" target=\"_blank\" rel=\"noopener\">Symfony integration<\/a>.<\/li>\n<li><a href=\"https:\/\/roach-php.dev\/\" target=\"_blank\" rel=\"noopener\">Roach PHP<\/a> \u2013 A tool for web scraping inspired by the popular Python library, Scrapy.<\/li>\n<li><a href=\"https:\/\/github.com\/symfony\/html-sanitizer\" target=\"_blank\" rel=\"noopener\">symfony\/html-sanitizer<\/a> \u2013 A new component to clean up untrusted HTML and protect against XSS. It could be a good alternative to <a href=\"https:\/\/github.com\/ezyang\/htmlpurifier\" target=\"_blank\" rel=\"noopener\">HTML Purifier<\/a>.<\/li>\n<li><a href=\"https:\/\/github.com\/EventSaucePHP\/ObjectHydrator\" target=\"_blank\" rel=\"noopener\">EventSaucePHP\/ObjectHydrator<\/a> \u2013 A library for hydrating raw data (like JSON) into objects.<\/li>\n<li><a href=\"https:\/\/github.com\/ajthinking\/archetype\" target=\"_blank\" rel=\"noopener\">ajthinking\/archetype<\/a> \u2013 A simple interface for modifying PHP files\/classes.<\/li>\n<li><a href=\"https:\/\/github.com\/framjet\/php-enum-bitmask\" target=\"_blank\" rel=\"noopener\">framjet\/php-enum-bitmask<\/a> \u2013 Using enumerations from PHP 8.1 as bitmasks.<\/li>\n<li><a href=\"https:\/\/github.com\/beyondcode\/httpdump\" target=\"_blank\" rel=\"noopener\">beyondcode\/httpdump<\/a> \u2013 Laravel application for debugging incoming HTTP requests (debugging web hooks, etc.). Creates random URLs and dumps all the requests to them in a nice way. You can see it in action at <a href=\"https:\/\/httpdump.app\" target=\"_blank\" rel=\"noopener\">httpdump.app<\/a>.<\/li>\n<li><a href=\"https:\/\/github.com\/spatie\/ignition\" target=\"_blank\" rel=\"noopener\">spatie\/ignition<\/a> \u2013 This library for displaying debugging error pages, familiar to many from Laravel, but now framework-independent, has been updated and can be used in any application. See the <a href=\"https:\/\/freek.dev\/2169-a-better-error-page-for-symfony-applications\" target=\"_blank\" rel=\"noopener\">overview blog post<\/a>.<\/li>\n<li><a href=\"https:\/\/github.com\/chevere\/xr\" target=\"_blank\" rel=\"noopener\">chevere\/xr<\/a> \u2013 A debug server on ReactPHP, inspired by the <a href=\"https:\/\/github.com\/spatie\/ray\" target=\"_blank\" rel=\"noopener\">spatie\/ray<\/a>, but instead of a desktop application it&#8217;s just a CLI command to run. <a href=\"https:\/\/vimeo.com\/662391948\" target=\"_blank\" rel=\"noopener\">Video demo<\/a>.<\/li>\n<li><a href=\"https:\/\/github.com\/JustSteveKing\/php-sdk\" target=\"_blank\" rel=\"noopener\">JustSteveKing\/php-sdk<\/a>, <a href=\"https:\/\/github.com\/Sammyjo20\/Saloon\" target=\"_blank\" rel=\"noopener\">Sammyjo20\/Saloon<\/a> \u2013 Two similar libraries with the same idea: simplify SDK creation for services or organize access to different APIs in the common style.<\/li>\n<li><a href=\"https:\/\/github.com\/AliSaleem27\/wordle-cli\" target=\"_blank\" rel=\"noopener\">AliSaleem27\/wordle-cl<\/a> \u2013 A CLI version of the popular five-letter word guessing game Wordle.<\/li>\n<li><a href=\"https:\/\/github.com\/staabm\/phpstan-dba\" target=\"_blank\" rel=\"noopener\">staabm\/phpstan-dba<\/a> \u2013 An extension for <a href=\"https:\/\/github.com\/phpstan\/phpstan\" target=\"_blank\" rel=\"noopener\">PHPStan<\/a> that checks the validity of SQL queries in <code>PDO<\/code>, <code>MySQLi<\/code>, and <code>Doctrine\/DBAL<\/code>. <a href=\"https:\/\/github.com\/staabm\/phpstan-dba\/pull\/61\/files#diff-98a3c43049f6a0c859c0303037d9773534396533d7890bad187d465d390d634e\" target=\"_blank\" rel=\"noopener\">Demo<\/a>.<\/li>\n<li><a href=\"https:\/\/github.com\/flow-php\/etl\" target=\"_blank\" rel=\"noopener\">flow-php\/etl<\/a> \u2013 An implementation of the Extract Transform Load pattern to use in your PHP application. Check out the <a href=\"https:\/\/twitter.com\/norbert_tech\/status\/1484863793280786439\" target=\"_blank\" rel=\"noopener\">thread<\/a> from the author to learn more.<\/li>\n<\/ul>\n<h2>Symfony<\/h2>\n<ul>\n<li><strong>The <a href=\"https:\/\/github.com\/symfony-cli\/symfony-cli\" target=\"_blank\" rel=\"noopener\">symfony-cli<\/a> tool has been open-sourced<\/strong><br \/>\nIn addition to Symfony-specific tasks, the tool includes a <a href=\"https:\/\/symfony.com\/doc\/current\/setup\/symfony_server.html\" target=\"_blank\" rel=\"noopener\">local server<\/a>, which can be used as a modern alternative to MAMP\/WAMP. It supports multiple versions of PHP (each project can specify its own), has integration with Docker, local domains, and automatic HTTPS. The tool is implemented in Go, and is available for Linux, macOS, and Windows.<\/li>\n<li><a href=\"https:\/\/symfony.com\/blog\/a-better-way-to-quickly-start-symfony-projects\" target=\"_blank\" rel=\"noopener\">A better way to quickly start Symfony projects<\/a><\/li>\n<li><a href=\"https:\/\/symfony.com\/blog\/introducing-the-symfony-6-certification\" target=\"_blank\" rel=\"noopener\">Introducing the Symfony 6 Certification<\/a> \u2013 90 minutes for 75 questions from 15 topics.<\/li>\n<li><a href=\"https:\/\/www.strangebuzz.com\/en\/blog\/organizing-your-symfony-project-tests\" target=\"_blank\" rel=\"noopener\">Organizing your Symfony project tests<\/a><\/li>\n<li><a href=\"https:\/\/alex-daubois.medium.com\/symfonys-security-key-concepts-in-5-minutes-e18033c26b35\" target=\"_blank\" rel=\"noopener\">The key concepts of Symfony&#8217;s Security package in 5 minutes<\/a><\/li>\n<li><a href=\"https:\/\/jolicode.com\/blog\/symfony-messenger-systemd\" target=\"_blank\" rel=\"noopener\">Symfony Messenger &lt;3 systemd<\/a><\/li>\n<li><a href=\"https:\/\/smaine-milianni.medium.com\/use-php-enums-as-doctrine-type-in-symfony-85909aa0a19a\" target=\"_blank\" rel=\"noopener\">Use PHP Enums as Doctrine type in Symfony<\/a><\/li>\n<li><a href=\"https:\/\/blog.ecotone.tech\/build-symfony-application-with-ease-using-ecotone\/\" target=\"_blank\" rel=\"noopener\">Build Symfony and Doctrine ORM Applications with ease using Ecotone<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/norberttech\/static-content-generator-bundle\" target=\"_blank\" rel=\"noopener\">norberttech\/static-content-generator-bundle<\/a> \u2013 The tool generates static HTML pages from your Symfony application.<\/li>\n<li><a href=\"https:\/\/angelovdejan.me\/2022\/01\/09\/custom-php-attributes-for-symfony-messenger-handlers.html\" target=\"_blank\" rel=\"noopener\">Using custom PHP attributes for registering and configuring Symfony Messenger handlers<\/a><\/li>\n<li><a href=\"https:\/\/dunglas.fr\/2022\/01\/json-columns-and-doctrine-dbal-3-upgrade\/\" target=\"_blank\" rel=\"noopener\">JSON Columns and Doctrine DBAL 3 Upgrade<\/a><\/li>\n<\/ul>\n<h2>Laravel<\/h2>\n<ul>\n<li><a href=\"https:\/\/laracon.net\" target=\"_blank\" rel=\"noopener\"><strong>Laracon Online<\/strong> is on Feb 9, and it&#8217;s free<\/a><br \/>\nThe conference is usually paid, but this Laracon Online Winter will be broadcast free on <a href=\"https:\/\/www.youtube.com\/watch?v=5ubDLFKKk54\" target=\"_blank\" rel=\"noopener\">YouTube<\/a>.<\/li>\n<li><a href=\"https:\/\/centrifugal.dev\/blog\/2021\/12\/14\/laravel-multi-room-chat-tutorial\" target=\"_blank\" rel=\"noopener\">Building a multi-room chat application with Laravel and Centrifugo<\/a><\/li>\n<li><a href=\"https:\/\/downing.tech\/posts\/managing-laravel-services\" target=\"_blank\" rel=\"noopener\">Managing Laravel services<\/a><\/li>\n<li><a href=\"https:\/\/aaronfrancis.com\/2020\/laravel-pseudo-daemons\" target=\"_blank\" rel=\"noopener\">Laravel Pseudo-Daemons<\/a><\/li>\n<li><a href=\"https:\/\/laravel-news.com\/primitive-types-in-controllers-and-closure-routes\" target=\"_blank\" rel=\"noopener\">Primitive Types in Controllers and Closure Routes<\/a><\/li>\n<li><a href=\"https:\/\/treblle.com\/blog\/how-does-treblle-scale-on-aws-without-breaking-the-bank\" target=\"_blank\" rel=\"noopener\">How to scale Laravel project on AWS without breaking the bank<\/a>.<\/li>\n<li><a href=\"https:\/\/github.com\/LaravelDaily\/Laravel-Roadmap-Learning-Path\" target=\"_blank\" rel=\"noopener\">LaravelDaily\/Laravel-Roadmap-Learning-Path<\/a> \u2013 A systematic collection of materials for learning Laravel from simple to complex.<\/li>\n<li><a href=\"https:\/\/laravel.io\/articles\/building-and-api-using-tdd-in-laravel\" target=\"_blank\" rel=\"noopener\">Building an API using TDD in Laravel<\/a><\/li>\n<li><a href=\"https:\/\/aaronfrancis.com\/2022\/efficient-pagination-using-deferred-joins\" target=\"_blank\" rel=\"noopener\">Efficient Pagination Using Deferred Joins<\/a><\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=YzBGmdnGtbY\" target=\"_blank\" rel=\"noopener\">45 New Laravel Tips 2022<\/a><\/li>\n<\/ul>\n<h2>Yii<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.yiiframework.com\/news\/419\/yii-1-1-25-is-released\" target=\"_blank\" rel=\"noopener\">Yii 1.1.25<\/a> \u2013 The first version of the Yii framework is not actively developed, but compatibility fixes are still coming out. This update fixes a few for PHP 8.0.<\/li>\n<li>The first stable releases for some Yii 3 components have also been released: <a href=\"https:\/\/github.com\/yiisoft\/user\" target=\"_blank\" rel=\"noopener\">yiisoft\/user<\/a>, <a href=\"https:\/\/github.com\/yiisoft\/translator-extractor\" target=\"_blank\" rel=\"noopener\">yiisoft\/translator-extractor<\/a>, <a href=\"https:\/\/github.com\/yiisoft\/config\" target=\"_blank\" rel=\"noopener\">yiisoft\/config<\/a>, <a href=\"https:\/\/github.com\/yiisoft\/yii-swagger\" target=\"_blank\" rel=\"noopener\">yiisoft\/yii-swagger<\/a>, <a href=\"https:\/\/github.com\/yiisoft\/widget\" target=\"_blank\" rel=\"noopener\">yiisoft\/widget<\/a>, <a href=\"https:\/\/github.com\/yiisoft\/router\" target=\"_blank\" rel=\"noopener\">yiisoft\/router<\/a>.<\/li>\n<li><a href=\"https:\/\/opencollective.com\/yiisoft\/updates\/yii-news-2021-issue-4\" target=\"_blank\" rel=\"noopener\">Yii news 2021, issue 4<\/a><\/li>\n<\/ul>\n<h2>Misc<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.kode-krunch.com\/2021\/12\/trying-out-php-after-7-years.html\" target=\"_blank\" rel=\"noopener\">Trying out PHP after 7 years<\/a> of working with Java.<\/li>\n<li><a href=\"https:\/\/stitcher.io\/blog\/php-in-2022\" target=\"_blank\" rel=\"noopener\">PHP in 2022<\/a> \u2013 Brent Roose&#8217;s traditional ecosystem overview.<\/li>\n<li><a href=\"https:\/\/doeken.org\/blog\/heaps-explained-in-php\" target=\"_blank\" rel=\"noopener\">Heaps explained in PHP<\/a><\/li>\n<li><a href=\"https:\/\/orangesoft.co\/blog\/chain-of-responsibility-design-pattern-in-php\" target=\"_blank\" rel=\"noopener\">Implementation of Chain of Responsibility Design Pattern in PHP<\/a><\/li>\n<li><a href=\"https:\/\/blog.wyrihaximus.net\/2021\/12\/async-and-await-at-the-edge-with-reactphp\/\" target=\"_blank\" rel=\"noopener\">async &amp; await at the edge with ReactPHP<\/a> \u2013 PHP 8.1 with fibers support is out! One of the ReactPHP maintainers writes about how they&#8217;re used. In particular, the new <code>React\\Async\\async<\/code> and <code>React\\Async\\await<\/code> functions have been added.<\/li>\n<li><a href=\"https:\/\/konstantin.blog\/2021\/php-benchmark-include-vs-file_get_contents\/\" target=\"_blank\" rel=\"noopener\">PHP Benchmark: include() vs file_get_contents()<\/a> \u2013 <code>include()<\/code> can be faster than <code>file_get_contents()<\/code> if you tweak the Opcache settings.<\/li>\n<li><a href=\"https:\/\/blog.frankdejonge.nl\/where-does-validation-live\/\" target=\"_blank\" rel=\"noopener\">Where does my validation live?<\/a><\/li>\n<li><a href=\"https:\/\/blog.ecotone.tech\/how-to-build-maintainable-php-applications\/\" target=\"_blank\" rel=\"noopener\">How to build maintainable PHP applications<\/a> and decouple business logic from the frameworks.<\/li>\n<li><a href=\"https:\/\/darkghosthunter.medium.com\/php-making-sense-of-the-8-log-levels-ddd27c4719a\" target=\"_blank\" rel=\"noopener\">Making sense of the 8 log levels in PHP<\/a> \u2013 You&#8217;ll most likely only need four.<\/li>\n<li><a href=\"https:\/\/downing.tech\/posts\/overriding-vendor-classes\" target=\"_blank\" rel=\"noopener\">Overriding vendor classes<\/a> \u2013 If you don&#8217;t want to create a fork, you could properly configure autoloading in composer.json. Or as an option, you can also use patches with <a href=\"https:\/\/github.com\/cweagans\/composer-patches\" target=\"_blank\" rel=\"noopener\">cweagans\/composer-patches<\/a>.<\/li>\n<li><a href=\"https:\/\/www.lambda-out-loud.com\/posts\/accessing-private-properties-php\/\" target=\"_blank\" rel=\"noopener\">Accessing private properties in PHP<\/a> \u2013 Instead of reflection and access through <code>Closure::bind<\/code> you can cast object to array (but should you?).<\/li>\n<li>Sometimes it can be useful to look at the generated opcodes to understand what is going on in the code. The command <code>phpdbg -p* file.php<\/code> will help.<br \/>\n<blockquote class=\"twitter-tweet\">\n<p lang=\"en\" dir=\"ltr\">To better understand how a snippet of <a href=\"https:\/\/twitter.com\/hashtag\/PHP?src=hash&amp;ref_src=twsrc%5Etfw\" target=\"_blank\" rel=\"noopener\">#PHP<\/a> code works internally, you can use `phpdbg -p* file.php` to dump the opcodes.<\/p>\n<p>This is how you debunk <a href=\"https:\/\/twitter.com\/hashtag\/myths?src=hash&amp;ref_src=twsrc%5Etfw\" target=\"_blank\" rel=\"noopener\">#myths<\/a> like single quotes being faster than double quotes. <a href=\"https:\/\/t.co\/2YoG9NAc6F\" target=\"_blank\">pic.twitter.com\/2YoG9NAc6F<\/a><\/p>\n<p>\u2014 Patrick Allaert PHP 8.1 RM (@AllaertPatrick) <a href=\"https:\/\/twitter.com\/AllaertPatrick\/status\/1478323931924860928?ref_src=twsrc%5Etfw\" target=\"_blank\" rel=\"noopener\">January 4, 2022<\/a><\/p><\/blockquote>\n<\/li>\n<\/ul>\n<h2>Community<\/h2>\n<ul>\n<li><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/IfcFQxYPTxo\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\"><\/iframe><\/li>\n<\/ul>\n<hr>\n<p>Thanks for reading!<\/p>\n<p>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>.<\/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 to PHP Annotated<\/a><\/p>\n<p><em>Your JetBrains PhpStorm team<\/em><br \/>\n<em>The Drive to Develop<\/em><\/p>\n<p><script async=\"\" src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><br \/>\n<!--<script async src=\"https:\/\/embed.redditmedia.com\/widgets\/platform.js\" charset=\"UTF-8\"><\/script>--><\/p>\n","protected":false},"author":869,"featured_media":0,"comment_status":"closed","ping_status":"closed","template":"","categories":[89],"tags":[2323],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/phpstorm\/221396"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/phpstorm"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/types\/phpstorm"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/users\/869"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/comments?post=221396"}],"version-history":[{"count":10,"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/phpstorm\/221396\/revisions"}],"predecessor-version":[{"id":251029,"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/phpstorm\/221396\/revisions\/251029"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/media?parent=221396"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/categories?post=221396"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/tags?post=221396"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/cross-post-tag?post=221396"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}