{"id":21550,"date":"2020-02-11T10:50:36","date_gmt":"2020-02-11T10:50:36","guid":{"rendered":"https:\/\/blog.jetbrains.com\/phpstorm\/?p=15363"},"modified":"2020-02-11T11:20:41","modified_gmt":"2020-02-11T11:20:41","slug":"php-annotated-february-2020","status":"publish","type":"phpstorm","link":"https:\/\/blog.jetbrains.com\/phpstorm\/2020\/02\/php-annotated-february-2020\/","title":{"rendered":"PHP Annotated &#8211; February 2020"},"content":{"rendered":"<p><a href=\"https:\/\/blog.jetbrains.com\/phpstorm\/2020\/02\/php-annotated-february-2020\/\"><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\" alt=\"PHP Annotated Monthly\" width=\"100%\" \/><\/a><\/p>\n<style>\n    .post img.alignico {\n        margin-right: 2px;\n        margin-top: 2px;\n        float: left;\n    }\n    kbd {\n        font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n        line-height: inherit;\n        position: relative;\n        -webkit-box-sizing: border-box;\n        box-sizing: border-box;\n        margin: 0;\n        padding: 2px 6px 4px;\n        white-space: nowrap;\n        border-radius: 3px;\n        border: 1px solid #cccbcb;\n        color: #161616;\n        background-color: #fff;\n        -webkit-box-shadow: 0 2px 0px -1px #fff, 0 2px 0 #cccbcb;\n        box-shadow: 0 2px 0px -1px #fff, 0 2px 0 #cccbcb;\n    }\n<\/style>\n<p>Greetings everyone,<br \/>\n<br \/>\nIt\u2019s time for the February edition of PHP Annotated! This edition includes 4 new RFCs from PHP Internals and research results on Generics in PHP. We also cover PHPUnit 9 and other releases, articles on Laravel and Symfony, useful tools, videos, podcasts, and a whole lot more!<br \/>\n<!--more--><\/p>\n<h3>\u26a1\ufe0f News &amp; Releases<\/h3>\n<ul>\n<li><a href=\"https:\/\/blog.jetbrains.com\/phpstorm\/2020\/01\/phpstorm-2020-1-early-access-program-is-now-open\/\">PhpStorm 2020.1 EAP started<\/a> &mdash; We&#8217;ve already rolled out composer.json support, code coverage with PCOV, new Commit tool window to work with VCS, and a bunch of other improvements. <br \/>You can follow us on Twitter <a href=\"https:\/\/twitter.com\/phpstorm\" target=\"_blank\" rel=\"noopener\">@phpstorm<\/a> and subscribe to our YouTube channel <a href=\"https:\/\/www.youtube.com\/user\/JetBrainsTV\" target=\"_blank\" rel=\"noopener\">JetBrainsTV<\/a> to get fresh updates as we&#8217;ve launched a new video series, <em>What\u2019s Coming in PhpStorm 2020.1<\/em> and &#x1F4FA; <a href=\"https:\/\/www.youtube.com\/watch?v=OtQuAr3n87c&#038;t=3s\" target=\"_blank\" rel=\"noopener\">Episode 1<\/a> is already out.<\/li>\n<li>Based on <a href=\"https:\/\/groups.google.com\/forum\/#!topic\/php-fig\/M_Np9Gh9Omc\" target=\"_blank\" rel=\"noopener\">the voting results<\/a> the new Core Committee will include <a href=\"https:\/\/twitter.com\/KorvinSzanto\" target=\"_blank\" rel=\"noopener\">Korvin Szanto<\/a>, <a href=\"https:\/\/twitter.com\/ezimuel\" target=\"_blank\" rel=\"noopener\">Enrico Zimuel<\/a>, <a href=\"https:\/\/twitter.com\/dragonmantank\" target=\"_blank\" rel=\"noopener\">Chris Tankersley<\/a>, and <a href=\"https:\/\/twitter.com\/garakkio\" target=\"_blank\" rel=\"noopener\">Massimiliano Arione<\/a>. <a href=\"https:\/\/twitter.com\/SlvrEagle23\" target=\"_blank\" rel=\"noopener\">Buster Neece<\/a> is the new secretary.<\/li>\n<\/ul>\n<h3>&#x1f418; PHP Internals<\/h3>\n<ul>\n<li><a href=\"https:\/\/wiki.php.net\/rfc\/calls_in_constant_expressions\" target=\"_blank\" rel=\"noopener\">[RFC] Allow function calls in constant expressions<\/a> \u2014 In the current PHP versions, you can only use literals, and operations in constant expressions. This RFC proposes to allow global functions calls in constant declarations, default values of static properties, static variables, and default values of function parameters.\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\" data-enlighter-title=\"\">\r\nclass MyClass {\r\n    const VALUES = [1, 0];\r\n    const C1 = count(self::VALUES);\r\n\r\n    public static $p = count(self::VALUES);\r\n\r\n    public function foo($param = count(self::VALUES))\r\n    {\r\n        static $bar = count(self::VALUES);\r\n    }\r\n}\r\n<\/pre>\n<\/li>\n<li><a href=\"https:\/\/wiki.php.net\/rfc\/to-array\" target=\"_blank\" rel=\"noopener\">[RFC] __toArray()<\/a> \u2014 This on\u0443 proposes to add a new magic method <code>__toArray()<\/code>, which will work similarly to <code>__toString()<\/code>, i.e. will be called on explicit type casting to array, or when an object is passed as an argument to a function with an array parameter declaration, or when it&#8217;s returned from a function with its return type specified as an array.\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\" data-enlighter-title=\"\">\r\nclass Person\r\n{\r\n    protected $name;\r\n    protected $email;\r\n    public function __toArray()\r\n    {\r\n        return [\r\n            &#039;name&#039; =&gt; $this-&gt;name,\r\n            &#039;email&#039;  =&gt; $this-&gt;email,\r\n        ];\r\n    }\r\n}\r\n\r\n$person = new Person(&#039;John Doe&#039;, &#039;j.doe@example.com&#039;);\r\n\r\n$personArray = (array) $person; \/\/ Calls __toArray()\r\n\r\nfunction foo(array $person) {\r\n    var_dump($person); \/\/ Array here\r\n}\r\n\r\nfunction bar(Person $person): array {\r\n    return $person;\r\n}\r\n\r\nvar_dump(bar($person)); \/\/ and here it&#039;s an array\r\n<\/pre>\n<\/li>\n<li><a href=\"https:\/\/wiki.php.net\/rfc\/userspace_operator_overloading\" target=\"_blank\" rel=\"noopener\">[RFC] Userspace operator overloading<\/a> \u2014 The proposal to add operator overloading is still in draft status, but is <a href=\"https:\/\/externals.io\/message\/108300\" target=\"_blank\" rel=\"noopener\">actively discussed<\/a> in Internals. Meanwhile, you can try operator overloading in PHP 7.4 with FFI based on <a href=\"https:\/\/github.com\/lisachenko\/z-engine#object-extensions-api\" target=\"_blank\" rel=\"noopener\">lisachenko\/z-engine<\/a>.<\/li>\n<li><a href=\"https:\/\/wiki.php.net\/rfc\/abstract_trait_method_validation\" target=\"_blank\" rel=\"noopener\">[RFC] Validation for abstract trait methods<\/a> \u2014 Currently, signatures of implementation for abstract methods from traits are not validated. For example, this code now works without errors:\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\" data-enlighter-title=\"\">\r\ntrait T {\r\n    abstract public function test(int $x);\r\n}\r\n\r\nclass C {\r\n    use T;\r\n\r\n    \/\/ It works now, but it shouldn&#039;t because of a type mismatch\r\n    public function test(string $x) {}\r\n}<\/pre>\n<p> It&#8217;s proposed to correct this behavior. <br \/>The patch was published as a pull-request, but it contains a backward incompatibility, that requires to pass the RFC-process: if then current code has an incorrect implementation of the method from a trait, the proposed change will cause an error.<\/li>\n<li><a href=\"https:\/\/wiki.php.net\/rfc\/request_response\" target=\"_blank\" rel=\"noopener\">[RFC] Server-Side Request and Response Objects v2<\/a> &mdash; The RFC proposes to replace superglobal arrays such as <code>$_GET<\/code>, <code>$_POST<\/code>, <code>$_SERVER<\/code>, etc., with a ServerRequest class, and ServerResponse instead of <code>header()<\/code> calls and sending content.<\/li>\n<li><strong>Generics in PHP<\/strong> \u2014 Recently, Nikita Popov has been working on a study of the possibility of adding generics to PHP. In short, according to Nikita, there are some serious difficulties, and he is not sure yet if adding complete generics to PHP is a good idea. <br \/>There is a <a href=\"https:\/\/github.com\/nikic\/php-src\/pull\/3\" target=\"_blank\" rel=\"noopener\">pull request<\/a> with a prototype implementation and all the problems and open questions are detailed here: <a href=\"https:\/\/github.com\/PHPGenerics\/php-generics-rfc\/issues\/45\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/PHPGenerics\/php-generics-rfc\/issues\/45<\/a>.<\/li>\n<li><a href=\"https:\/\/github.com\/php\/doc-en\" target=\"_blank\" rel=\"noopener\">php\/doc-en<\/a> \u2014 English documentation is now editable via pull-requests on GitHub instead of old <a href=\"https:\/\/edit.php.net\/\" target=\"_blank\" rel=\"noopener\">edit.php.net<\/a>.<\/li>\n<\/ul>\n<h3>&#128736; Tools<\/h3>\n<ul>\n<li><a href=\"https:\/\/phpunit.de\/announcements\/phpunit-9.html\" target=\"_blank\" rel=\"noopener\">PHPUnit 9<\/a> \u2014 This release requires PHP 7.3+ and uses modern PHP features. It also has some backward-incompatible changes. Learn more in the <a href=\"https:\/\/thephp.cc\/news\/2020\/02\/migrating-to-phpunit-9\" target=\"_blank\" rel=\"noopener\">migration instruction<\/a>.<\/li>\n<li><a href=\"https:\/\/github.com\/cycle\/orm\" target=\"_blank\" rel=\"noopener\">cycle\/orm 1.2<\/a> \u2014 An ORM that can be used either as DataMapper or as ActiveRecord. In the latest release, the performance was improved by 33% and judging by these <a href=\"https:\/\/github.com\/adrianmiu\/forked-php-orm-benchmark\" target=\"_blank\" rel=\"noopener\">benchmarks<\/a>, it is now one of the fastest ORMs.<\/li>\n<li><a href=\"https:\/\/github.com\/lisachenko\/z-engine#abstract-syntax-tree-api\" target=\"_blank\" rel=\"noopener\">lisachenko\/z-engine<\/a> \u2014 An experimental library that allows accessing the internal structures of PHP itself using FFI. There are examples of using it to implement <a href=\"https:\/\/github.com\/lisachenko\/immutable-object\" target=\"_blank\" rel=\"noopener\">immutable objects<\/a> or <a href=\"https:\/\/github.com\/lisachenko\/z-engine#object-extensions-api\" target=\"_blank\" rel=\"noopener\">modifying AST<\/a> on a fly.<\/li>\n<li><a href=\"https:\/\/github.com\/salsify\/jsonstreamingparser\" target=\"_blank\" rel=\"noopener\">salsify\/jsonstreamingparser<\/a> \u2014 A JSON streaming parser for working with large files.<\/li>\n<li><a href=\"https:\/\/github.com\/spatie\/docker\" target=\"_blank\" rel=\"noopener\">spatie\/docker<\/a> \u2014 This package provides a way to start docker containers and execute commands on them. Check the <a href=\"https:\/\/freek.dev\/1571-manage-docker-containers-using-php\" target=\"_blank\" rel=\"noopener\">blog post<\/a> to learn more.<\/li>\n<li><a href=\"https:\/\/github.com\/symfony\/polyfill-php80\" target=\"_blank\" rel=\"noopener\">symfony\/polyfill-php80<\/a> \u2014 A PHP 8.0 polyfill.<\/li>\n<li><a href=\"https:\/\/github.com\/BenMorel\/weakmap-polyfill\" target=\"_blank\" rel=\"noopener\">BenMorel\/weakmap-polyfill<\/a> \u2014 A polyfill for WeakMap for PHP 7.4.<\/li>\n<li><a href=\"https:\/\/github.com\/paratestphp\/paratest\" target=\"_blank\" rel=\"noopener\">paratestphp\/paratest<\/a> \u2014 A tool that helps parallelize PHPUnit tests. Compatible with PHPUnit 9.<\/li>\n<\/ul>\n<h3><img decoding=\"async\" class=\"alignico\" src=\"https:\/\/habrastorage.org\/web\/96b\/65e\/921\/96b65e92179a40f2bd1884549973ddd5.png\" alt=\"\" width=\"16\" \/> Symfony<\/h3>\n<ul>\n<li><a href=\"https:\/\/jolicode.com\/blog\/battle-log-a-deep-dive-in-symfony-stack-in-search-of-optimizations-1-n\" target=\"_blank\" rel=\"noopener\">A story of finding performance issues<\/a> in a Symfony application, <a href=\"https:\/\/jolicode.com\/blog\/battle-log-a-deep-dive-in-symfony-stack-in-search-of-optimizations-2-n\" target=\"_blank\" rel=\"noopener\">part 2<\/a>.<\/li>\n<li><a href=\"https:\/\/wouterj.nl\/2020\/01\/grant-on-permissions-not-roles\" target=\"_blank\" rel=\"noopener\">Grant on permissions, not roles<\/a>.<\/li>\n<li><a href=\"https:\/\/symfony.com\/blog\/a-week-of-symfony-684-3-9-february-2020\" target=\"_blank\" rel=\"noopener\">A Week of Symfony #684 (February 3-9, 2020).<\/a><\/li>\n<\/ul>\n<h3><img decoding=\"async\" class=\"alignico\" src=\"https:\/\/habrastorage.org\/web\/314\/bd0\/f0d\/314bd0f0dfc54e3fa7f0c0daef1a2d25.png\" alt=\"\" width=\"16\" \/> Laravel<\/h3>\n<ul>\n<li><a href=\"https:\/\/github.com\/pavel-mironchik\/laravel-backup-panel\" target=\"_blank\" rel=\"noopener\">pavel-mironchik\/laravel-backup-panel<\/a> \u2014 A web-interface for <a href=\"https:\/\/github.com\/spatie\/laravel-backup\" target=\"_blank\" rel=\"noopener\">spatie\/laravel-backup<\/a>. Allows managing backups in a browser.<\/li>\n<li><a href=\"https:\/\/github.com\/avto-dev\/roadrunner-laravel\" target=\"_blank\" rel=\"noopener\">avto-dev\/roadrunner-laravel<\/a> \u2014 A new version of the <a href=\"https:\/\/github.com\/spiral\/roadrunner\/\" target=\"_blank\" rel=\"noopener\">RoadRunner<\/a> worker for Laravel. Now by default it does not re-create the application instance, and can be extended using the event system of the framework.<\/li>\n<li><a href=\"https:\/\/laravelpackage.com\/\" target=\"_blank\" rel=\"noopener\">laravelpackage.com<\/a> \u2014 A detailed guide for creating Laravel packages.<\/li>\n<li><a href=\"https:\/\/divinglaravel.com\/authentication-and-laravel-airlock\" target=\"_blank\" rel=\"noopener\">On authentication<\/a> and <a href=\"https:\/\/github.com\/laravel\/airlock\" target=\"_blank\" rel=\"noopener\">laravel\/airlock<\/a>.<\/li>\n<li><a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/containerizing-a-laravel-6-application-for-development-with-docker-compose-on-ubuntu-18-04\" target=\"_blank\" rel=\"noopener\">Containerizing Laravel 6 application<\/a> for development with Docker Compose and Ubuntu 18.04.<\/li>\n<li><a href=\"https:\/\/liamhammett.com\/laravel-mixins-KEzjmLrx\" target=\"_blank\" rel=\"noopener\">How to use mixins in Laravel<\/a>.<\/li>\n<li><a href=\"https:\/\/stitcher.io\/laravel-beyond-crud\" target=\"_blank\" rel=\"noopener\">Laravel beyond CRUD<\/a>: <a href=\"https:\/\/stitcher.io\/blog\/laravel-beyond-crud-09-test-factories\" target=\"_blank\" rel=\"noopener\">09. Test factories<\/a>.<\/li>\n<li>&#x1F4FA; <a href=\"https:\/\/laracasts.com\/series\/guest-spotlight\/episodes\/5\" target=\"_blank\" rel=\"noopener\">Tips for simplifying Laravel controllers<\/a>.<\/li>\n<li>&#x1F508; Taylor&#8217;s podcast: <a href=\"https:\/\/blog.laravel.com\/laravel-snippet-22-laracon-online-inertiajs-livewire-spas-reviewing-the-day\" target=\"_blank\" rel=\"noopener\">Laravel Snippet #22<\/a> \u2014 Laracon Online, Inertia.js, Livewire, SPAs, Reviewing The Day.<\/li>\n<\/ul>\n<h3><img decoding=\"async\" class=\"alignico\" src=\"https:\/\/habrastorage.org\/webt\/pj\/lk\/ob\/pjlkob5btqut7it5e_eod-qtqh0.png\" width=\"16\" \/> Zend\/Laminas<\/h3>\n<ul>\n<li><a href=\"https:\/\/framework.zend.com\/blog\/2020-01-24-laminas-launch\" target=\"_blank\" rel=\"noopener\">The last post in Zend Framework blog<\/a> \u2013 It&#8217;s now all <a href=\"https:\/\/getlaminas.org\/\" target=\"_blank\" rel=\"noopener\">Laminas<\/a>.<\/li>\n<\/ul>\n<h3>&#x1f300; Async PHP<\/h3>\n<ul>\n<li>&#x1F4FA; <a href=\"https:\/\/www.youtube.com\/watch?v=uebhqc2BZXw\" target=\"_blank\" rel=\"noopener\">Interview with Marc Morera<\/a>, an author of <a href=\"https:\/\/github.com\/driftphp\" target=\"_blank\" rel=\"noopener\">DriftPHP<\/a>, about asynchronous PHP, DriftPHP and ReactPHP.<\/li>\n<li><a href=\"https:\/\/github.com\/driftphp\/awesome-reactphp\" target=\"_blank\" rel=\"noopener\">driftphp\/awesome-reactphp<\/a> \u2014 A curated list of resources for ReactPHP.<\/li>\n<\/ul>\n<h3>&#x1f4a1; Misc<\/h3>\n<ul>\n<li><a href=\"https:\/\/stitcher.io\/blog\/php-in-2020\" target=\"_blank\" rel=\"noopener\">PHP in 2020<\/a> \u2014 An overview of the language and ecosystem state.<\/li>\n<li><a href=\"https:\/\/stitcher.io\/blog\/new-in-php-8\" target=\"_blank\" rel=\"noopener\">New in PHP 8<\/a>.<\/li>\n<li><a href=\"https:\/\/stitcher.io\/blog\/enums-without-enums\" target=\"_blank\" rel=\"noopener\">Enums without enums in PHP<\/a> \u2014 Imitating enums with anonymous classes.<\/li>\n<li><a href=\"https:\/\/steemit.com\/php\/@crell\/type-matching-in-php\" target=\"_blank\" rel=\"noopener\">Type matching in PHP<\/a> \u2014 Implementing the <a href=\"https:\/\/doc.rust-lang.org\/rust-by-example\/flow_control\/match.html\" target=\"_blank\" rel=\"noopener\">match construct from Rust<\/a> on PHP with arrow functions.<\/li>\n<li><a href=\"https:\/\/stefanbauer.me\/articles\/my-phpstorm-settings-after-8-years-of-use\" target=\"_blank\" rel=\"noopener\">My PhpStorm settings after 8 years of use<\/a>.<\/li>\n<li><a href=\"https:\/\/suckup.de\/2020\/02\/modern-phpdoc-annotations\/\" target=\"_blank\" rel=\"noopener\">Modern PHPDoc Annotations<\/a> for arrays \u2014 In PhpStorm it recommends using the <a href=\"https:\/\/plugins.jetbrains.com\/plugin\/9927-deep-assoc-completion\" target=\"_blank\" rel=\"noopener\">deep-assoc-completion<\/a> plugin.<\/li>\n<li><a href=\"https:\/\/developer.happyr.com\/php-74-preload\" target=\"_blank\" rel=\"noopener\">Benchmark of PHP 7.4 preloading<\/a> on a Symfony application.<\/li>\n<li><a href=\"https:\/\/medium.com\/pipedrive-engineering\/how-two-developers-accelerated-php-monolith-in-pipedrive-df8a18bc2d8a\" target=\"_blank\" rel=\"noopener\">A history of optimizing the performance of a monolith app<\/a> with Blackfire.io.<\/li>\n<li><a href=\"https:\/\/medium.com\/@ivastly\/application-instrumentation-with-aspect-oriented-programming-in-php-18b1defa682\" target=\"_blank\" rel=\"noopener\">On aspect-oriented programming on PHP<\/a> using <a href=\"https:\/\/github.com\/goaop\/framework\" target=\"_blank\" rel=\"noopener\">Go!AOP<\/a>.<\/li>\n<li><a href=\"https:\/\/sorin.live\/redux-in-50-lines-of-php\/\" target=\"_blank\" rel=\"noopener\">Redux in 30 lines of PHP<\/a>.<\/li>\n<li>An anonymous researcher published <a href=\"https:\/\/github.com\/mm0r1\/exploits\" target=\"_blank\" rel=\"noopener\">exploits<\/a> that reveal vulnerabilities in processing <a href=\"https:\/\/www.php.net\/manual\/en\/ini.core.php#ini.disable-functions\" target=\"_blank\" rel=\"noopener\">disable_functions<\/a> ini-option of PHP. Learn more in an interesting <a href=\"https:\/\/x-c3ll.github.io\/\/posts\/UAF-PHP-disable_functions\/\" target=\"_blank\" rel=\"noopener\">analysis of this vulnerability class<\/a>.<\/li>\n<\/ul>\n<h3>&#x1F4FA; Videos<\/h3>\n<ul>\n<li>&#x1F4FA; <a href=\"https:\/\/www.youtube.com\/playlist?list=PLEkJYA4gJb78lIOKjZ0tJ9rWszT6uCTJH\" target=\"_blank\" rel=\"noopener\">Laracon AU 2019 videos<\/a>.<\/li>\n<li>&#x1F4FA; <a href=\"https:\/\/www.youtube.com\/playlist?list=PLUYKgcymLlHhtiC_h3sRD4hc5CGn3FlIo\" target=\"_blank\" rel=\"noopener\">Scotland PHP 2019 videos<\/a>.<\/li>\n<li>&#x1F4FA; <a href=\"https:\/\/www.youtube.com\/playlist?list=PLc15X3-Essu7Qc9lBGj-zZoYqhct8IESV\" target=\"_blank\" rel=\"noopener\">PHPKonf 2019 videos<\/a> \u2014 With Midori Ko\u00e7ak&#8217;s talk on <a href=\"https:\/\/www.youtube.com\/watch?v=AdKya1HLDZQ&#038;list=PLc15X3-Essu7Qc9lBGj-zZoYqhct8IESV&#038;index=9\" target=\"_blank\" rel=\"noopener\">how to have your idea accepted to PHP as a newbie<\/a>.<\/li>\n<li>&#x1F4FA; <a href=\"https:\/\/eventsourcery.com\/public-episodes\" target=\"_blank\" rel=\"noopener\">Full course on Event Sourcing<\/a>.<\/li>\n<li>&#x1F4FA; <a href=\"https:\/\/laracasts.com\/series\/guest-spotlight\/episodes\/6\" target=\"_blank\" rel=\"noopener\">Snapshot Testing in PHPUnit<\/a> with <a href=\"https:\/\/github.com\/spatie\/phpunit-snapshot-assertions\" target=\"_blank\" rel=\"noopener\">spatie\/phpunit-snapshot-assertions<\/a>.<\/li>\n<\/ul>\n<h3>&#x1F508; Podcasts<\/h3>\n<ul>\n<li>&#x1F508; <a href=\"https:\/\/tideways.com\/profiler\/blog\/php-shared-nothing-architecture-the-benefits-and-downsides\" target=\"_blank\" rel=\"noopener\">The Undercover ElePHPant #6<\/a> \u2014 On the pros and cons of the shared-nothing architecture of PHP and on serverless with <a href=\"https:\/\/twitter.com\/matthieunapoli\" target=\"_blank\" rel=\"noopener\">Mathieu Napoli<\/a>.<\/li>\n<li>&#x1F508; <a href=\"https:\/\/undercover-elephpant.com\/episodes\/talking-logging-for-production-applications-best-practices-with-jordi-boggiano\" target=\"_blank\" rel=\"noopener\">The Undercover ElePHPant #7<\/a> \u2014 With <a href=\"https:\/\/twitter.com\/seldaek\" target=\"_blank\" rel=\"noopener\">Jordi Boggiano<\/a> on logging in production and best practices of logging in general.<\/li>\n<li>&#x1F508; <a href=\"https:\/\/phpinternals.news\/38\" target=\"_blank\" rel=\"noopener\">PHP Internals News #38<\/a> \u2014 On preloading and WeakMaps with <a href=\"https:\/\/twitter.com\/nikita_ppv\" target=\"_blank\" rel=\"noopener\">Nikita Popov<\/a>. Now with text script.<\/li>\n<li>&#x1F508; <a href=\"https:\/\/phpinternals.news\/39\" target=\"_blank\" rel=\"noopener\">PHP Internals News #39<\/a> \u2014 On the <a href=\"https:\/\/wiki.php.net\/rfc\/stringable\" target=\"_blank\" rel=\"noopener\">Stringable<\/a> interface with \u0441 <a href=\"https:\/\/twitter.com\/nicolasgrekas\" target=\"_blank\" rel=\"noopener\">Nicolas Grekas<\/a>.<\/li>\n<\/ul>\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 <a href=\"https:\/\/twitter.com\/pronskiy\" target=\"_blank\" rel=\"noopener\">tweet me<\/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","protected":false},"author":869,"featured_media":21489,"comment_status":"open","ping_status":"open","template":"","categories":[],"tags":[2213,190,2625,2624,2323,359,2669,191],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/phpstorm\/21550"}],"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=21550"}],"version-history":[{"count":0,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/phpstorm\/21550\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media\/21489"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media?parent=21550"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/categories?post=21550"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/tags?post=21550"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/cross-post-tag?post=21550"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}