{"id":508283,"date":"2024-09-09T04:57:21","date_gmt":"2024-09-09T03:57:21","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=phpstorm&#038;p=508283"},"modified":"2025-02-05T12:39:56","modified_gmt":"2025-02-05T11:39:56","slug":"php-annotated-september-2024","status":"publish","type":"phpstorm","link":"https:\/\/blog.jetbrains.com\/de\/phpstorm\/2024\/09\/php-annotated-september-2024","title":{"rendered":"PHP Annotated \u2013 September 2024"},"content":{"rendered":"<p><a href=\"https:\/\/blog.jetbrains.com\/phpstorm\/2024\/09\/php-annotated-september-2024\/\"><img decoding=\"async\" class=\"alignnone size-full\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/09\/ps-featured_blog_1280x720_en-1.png\" alt=\"PHP Annotated\" width=\"900\"><\/a><\/p>\n<p>Welcome to the September edition of PHP Annotated! After a brief summer break, we\u2019re back with all things PHP. This recap is carefully handcrafted and brings you the most interesting developments in the PHP community over the past couple of months, so you don\u2019t have to sift through the noise\u2014we\u2019ve done it for you.<\/p>\n<p><!--more--><\/p>\n<style>@media (min-width: 769px) { main .article-section .content ul:not([class]):not([id]) li ul:not([class]):not([id]) { margin-top: 0; margin-bottom: 24px; } } main .article-section .content ul:not([class]):not([id]) li, main .article-section .content ul:not([class]):not([id]) > li {padding-bottom: 18px;}  main .article-section .content ul:not([class]):not([id]) li ul:not([class]):not([id]) li {padding-bottom: 0;} img.alignico {margin-right: 10px;margin-top: 5px;float: left;}  summary {display: list-item;cursor: pointer;font-style: italic; } section.article-section a {color: #7755f3} code {color: red;} #roman-pronskiy,.copy-heading:has(#roman-pronskiy){margin-top: 0;} main li a[href^=\"https:\/\/github.com\"]:before {background: no-repeat 2px center url(data:image\/svg+xml;utf8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNCIgaGVpZ2h0PSIxNCIgZmlsbD0ibm9uZSIgdmlld0JveD0iMCAwIDMyIDMyIj48cGF0aCBmaWxsPSIjMjQyOTJFIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNiAwYTE2IDE2IDAgMCAwLTUgMzEuMmMuNy4xIDEtLjQgMS0uOHYtM2MtNCAuOC01LTEtNS40LTEuOC0uMS0uNS0xLTItMS42LTIuMy0uNi0uMy0xLjQtMSAwLTEgMS4yIDAgMi4xIDEuMSAyLjQgMS42IDEuNSAyLjQgMy44IDEuNyA0LjcgMS4zLjEtMSAuNi0xLjcgMS0yLjEtMy41LS40LTcuMy0xLjgtNy4zLTggMC0xLjcuNy0zLjEgMS43LTQuMi0uMi0uNC0uNy0yIC4xLTQuMyAwIDAgMS40LS40IDQuNCAxLjdhMTQuOCAxNC44IDAgMCAxIDggMGMzLjEtMi4xIDQuNC0xLjcgNC40LTEuNyAxIDIuMi40IDMuOS4yIDQuM2E2IDYgMCAwIDEgMS42IDQuM2MwIDYuMS0zLjcgNy41LTcuMyA3LjkuNi41IDEuMSAxLjQgMS4xIDN2NC4zYzAgLjQuMyAxIDEuMS44QTE2IDE2IDAgMCAwIDE2IDBaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48L3N2Zz4=);content: \"\";padding-left: 20px;} main li a[href^=\"https:\/\/www.youtube.com\"]:not([data-test=\"blog-header\"]):before {background: no-repeat 0px center url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' height='100%25' version='1.1' viewBox='0 0 68 48' width='100%25'%3E%3Cpath class='ytp-large-play-button-bg' d='m .66,37.62 c 0,0 .66,4.70 2.70,6.77 2.58,2.71 5.98,2.63 7.49,2.91 5.43,.52 23.10,.68 23.12,.68 .00,-1.3e-5 14.29,-0.02 23.81,-0.71 1.32,-0.15 4.22,-0.17 6.81,-2.89 2.03,-2.07 2.70,-6.77 2.70,-6.77 0,0 .67,-5.52 .67,-11.04 l 0,-5.17 c 0,-5.52 -0.67,-11.04 -0.67,-11.04 0,0 -0.66,-4.70 -2.70,-6.77 C 62.03,.86 59.13,.84 57.80,.69 48.28,0 34.00,0 34.00,0 33.97,0 19.69,0 10.18,.69 8.85,.84 5.95,.86 3.36,3.58 1.32,5.65 .66,10.35 .66,10.35 c 0,0 -0.55,4.50 -0.66,9.45 l 0,8.36 c .10,4.94 .66,9.45 .66,9.45 z' fill='%23FF0000' fill-opacity='0.81'%3E%3C\/path%3E%3Cpath d='m 26.96,13.67 18.37,9.62 -18.37,9.55 -0.00,-19.17 z' fill='%23fff'%3E%3C\/path%3E%3Cpath d='M 45.02,23.46 45.32,23.28 26.96,13.67 43.32,24.34 45.02,23.46 z' fill='%23ccc'%3E%3C\/path%3E%3C\/svg%3E\"); content: \"\";padding-left: 18px;background-size: 16px;}<\/style>\n<h2 id=\"highlights\">Highlights<\/h2>\n<ul>\n<li>\n<h3><a href=\"https:\/\/laravel-news.com\/laravel-raises-57-million-series-a\" target=\"_blank\" rel=\"noopener\">Laravel raises a $57 million Series A from Accel<\/a><\/h3>\n<p>Right after the Laracon US, Taylor Otwell posted a tweet announcing a $57M investment from Accel, a renowned venture capital firm.<\/p>\n<p>Congratulations to Taylor and the team!<\/p>\n<p>Check out this video interview to learn more:<br \/>\n        <iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/www.youtube-nocookie.com\/embed\/BCV_357WGaM?si=0pJ5ZgXCf1_CxcVq\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n        <\/p>\n<\/li>\n<li>\n<h3><a href=\"https:\/\/wiki.php.net\/todo\/php84\" target=\"_blank\" rel=\"noopener\">PHP 8.4.0 Beta 4<\/a> is available for testing<\/h3>\n<p>Updates for PHP 8.4 are released every two weeks, following <a href=\"https:\/\/wiki.php.net\/todo\/php84#timetable\" target=\"_blank\" rel=\"noopener\">the timeline<\/a>. The final release is expected on November 21.<\/p>\n<p>The feature freeze took effect on August 13, meaning the set of new features is now locked in, and any major changes will be postponed to the next PHP version.<\/p>\n<p>Some of the most notable changes in PHP 8.4 include:<\/p>\n<ul>\n<li><a href=\"https:\/\/wiki.php.net\/rfc\/property-hooks\" target=\"_blank\" rel=\"noopener\">Property hooks<\/a><\/li>\n<li><a href=\"https:\/\/wiki.php.net\/rfc\/asymmetric-visibility-v2\" target=\"_blank\" rel=\"noopener\">Asymmetric Visibility<\/a><\/li>\n<li><a href=\"https:\/\/wiki.php.net\/rfc\/new_without_parentheses\" target=\"_blank\" rel=\"noopener\"><code>new MyClass()-&gt;method()<\/code> without parentheses<\/a><\/li>\n<li><a href=\"https:\/\/wiki.php.net\/rfc\/lazy-objects\" target=\"_blank\" rel=\"noopener\">Lazy Objects<\/a><\/li>\n<li><a href=\"https:\/\/wiki.php.net\/rfc\/domdocument_html5_parser\" target=\"_blank\" rel=\"noopener\">New HTML5 Support<\/a><\/li>\n<li><a href=\"https:\/\/wiki.php.net\/rfc\/array_find\" target=\"_blank\" rel=\"noopener\">New functions for working with arrays<\/a>: <code>array_find()<\/code>, <code>array_find_key()<\/code>, <code>array_any()<\/code>, and <code>array_all()<\/code>.<\/li>\n<\/ul>\n<p>For a detailed list of what\u2019s coming in PHP 8.4 see <a href=\"https:\/\/php.watch\/versions\/8.4\" target=\"_blank\" rel=\"noopener\">php.watch<\/a>, <a href=\"https:\/\/stitcher.io\/blog\/new-in-php-84\" target=\"_blank\" rel=\"noopener\">stitcher.io<\/a>, or <a href=\"https:\/\/ashallendesign.co.uk\/blog?category=php-84\" target=\"_blank\" rel=\"noopener\">Ash Allen posts<\/a>.<\/p>\n<p>        Try PHP 8.4:<\/p>\n<ul>\n<li>On Mac, you can install it using Homebrew through the Nightly channel via <a href=\"https:\/\/github.com\/shivammathur\/homebrew-php\" target=\"_blank\" rel=\"noopener\">shivammathur\/homebrew-php<\/a>.<\/li>\n<li>For other platforms, <a href=\"https:\/\/hub.docker.com\/_\/php\/tags?page=1&amp;name=8.4.0\" target=\"_blank\" rel=\"noopener\">Docker images<\/a> are probably the easiest way to try it out with no hassle.<\/li>\n<li>For a quick local test, PHP 8.4 is also available on <a href=\"https:\/\/herd.laravel.com\/\" target=\"_blank\" rel=\"noopener\">Herd<\/a>.<\/li>\n<\/ul>\n<\/li>\n<li>\n<h3><a href=\"https:\/\/thephp.foundation\/blog\/2024\/08\/19\/state-of-generics-and-collections\/\" target=\"_blank\" rel=\"noopener\">State of Generics and Collections<\/a> <a href=\"https:\/\/thephp.foundation\" target=\"_blank\" rel=\"noopener\">?<\/a><\/h3>\n<p>Arnaud Le Blanc, Derick Rethans, and Larry Garfield have published a comprehensive research article on the current state of generics in PHP. The article covers all possible implementations with the pros and cons of each.<\/p>\n<p>You can join the ongoing discussion on the <a href=\"https:\/\/externals.io\/message\/125049\" target=\"_blank\" rel=\"noopener\">mailing list<\/a> and <a href=\"https:\/\/www.reddit.com\/r\/PHP\/comments\/1ew7hik\/state_of_generics_and_collections\/\" target=\"_blank\" rel=\"noopener\">Reddit<\/a>.<\/p>\n<p>In the meantime, you can start <a href=\"https:\/\/youtu.be\/4omuIb6Hlxg\" target=\"_blank\" rel=\"noopener\">leveraging of generics<\/a> with PHPDoc blocks.<\/p>\n<\/li>\n<li>\n<h3><a href=\"https:\/\/blog.packagist.com\/shutting-down-packagist-org-support-for-composer-1-x\/\" target=\"_blank\" rel=\"noopener\">Shutting down Packagist.org support for Composer 1.x<\/a><\/h3>\n<p>        With over 95% of Composer updates now using v2, Composer v1 will be officially shut down on August 1, 2025.\n    <\/li>\n<li>\n<h3><a href=\"https:\/\/blog.jetbrains.com\/phpstorm\/2024\/08\/phpstorm-2024-2-is-now-available\/\">PhpStorm 2024.2 is out<\/a><\/h3>\n<p>        Highlights include: <\/p>\n<ul>\n<li><a href=\"https:\/\/blog.jetbrains.com\/phpstorm\/2024\/08\/laravel-log-files-support-in-phpstorm\/\">Log files support<\/a><\/li>\n<li>Completion in the new terminal<\/li>\n<li>Editing from a floating toolbar<\/li>\n<li>PER Coding Style<\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/blog\/2024\/07\/08\/the-new-ui-becomes-the-default-in-2024-2\/\">New UI Becomes the Default<\/a><\/li>\n<\/ul>\n<\/li>\n<li>\n<h3><a href=\"https:\/\/www.gofundme.com\/f\/a-big-ask-from-a-big-community\" target=\"_blank\" rel=\"noopener\">Fundraiser by Joe Watkins : A big ask from a big community<\/a><\/h3>\n<p>Joe Watkins (<a href=\"https:\/\/github.com\/krakjoe\" target=\"_blank\" rel=\"noopener\">@krakjoe<\/a>), a pillar of the PHP community, needs help. Joe is one of the creators of The PHP Foundation and author of several PHP tools you\u2019ve likely used in your work, including pcov, phpthreads, and parallel.<\/p>\n<p>After battling severe health issues, he&#8217;s facing homelessness &amp; loss of life-saving meds. Please donate if you can and help reshare \u2764\ufe0f\u200d?<\/p>\n<\/li>\n<li>\n<h3><em>&quot;PHP is beautiful and powerful&quot;<\/em><\/h3>\n<p>        <iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/www.youtube-nocookie.com\/embed\/oFtjKbXKqbg?si=Mk8opCb2NB0NQCoM&amp;clip=UgkxGpV7Px4GfeBvs9sCrsrhlBCBfMhzJgpD&amp;clipt=EMSXrQQY0OOuBA\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n    <\/li>\n<\/ul>\n<h2 id=\"php-core\">PHP Core<\/h2>\n<ul>\n<li>\n<h3>\u2705 <a class=\"phpf\" href=\"https:\/\/wiki.php.net\/rfc\/asymmetric-visibility-v2\" target=\"_blank\" rel=\"noopener\">RFC: Asymmetric Visibility v2<\/a> <a href=\"https:\/\/thephp.foundation\" target=\"_blank\" rel=\"noopener\">?<\/a><\/h3>\n<p>        Thanks to Ilija Tovilo\u2019s and Larry Garfield\u2019s proposal, PHP 8.4 will have asymmetric visibility, i.e. possibility to make properties public for reading (get) and private for changing (set). The syntax was inspired by Swift.\n    <\/li>\n<li>\n<h3>\u2705 <a href=\"https:\/\/wiki.php.net\/rfc\/lazy-objects\" target=\"_blank\" rel=\"noopener\">RFC: Lazy Objects<\/a> <a href=\"https:\/\/thephp.foundation\" target=\"_blank\" rel=\"noopener\">?<\/a><\/h3>\n<p>        Lazy objects are standard objects except that their initialization is deferred until one of their properties is accessed (including non-existing ones). This can be useful<br \/>\n        Arnaud Le Blanc and Nicolas Grekas successfully implemented this addition to PHP 8.4.<\/p>\n<p>Very likely, the lazy objects won\u2019t be used directly by most PHP users, but package and framework authors will benefit from it a lot as it allows them to remove a lot of boilerplate code. Here is for example how <a href=\"https:\/\/packagist.org\/packages\/symfony\/var-exporter\" target=\"_blank\" rel=\"noopener\">symfony\/var-exporter<\/a> will be <a href=\"https:\/\/github.com\/nicolas-grekas\/symfony\/pull\/44\" target=\"_blank\" rel=\"noopener\">simplified<\/a>:<\/p>\n<p>        <a href=\"https:\/\/twitter.com\/dsXLII\/status\/1822642674995765661\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/09\/lazy_objects.png\" alt=\"\" width=\"50%\"><\/a>\n    <\/li>\n<li>\n<h3>\u2705 <a href=\"https:\/\/wiki.php.net\/rfc\/exit-as-function\" target=\"_blank\" rel=\"noopener\">RFC: Transform exit() from a language construct into a standard function<\/a> <a href=\"https:\/\/thephp.foundation\" target=\"_blank\" rel=\"noopener\">?<\/a><\/h3>\n<p>Gina Peter Banyard proposed to make <code>exit()<\/code> a proper function with the following signature: <code>function exit(string|int $status = 0): never {}<\/code><\/p>\n<p>The benefit is that it will properly validate the arguments passed and throw a <code>TypeError<\/code> if you pass something irrelevant, such as an array or resource.<\/p>\n<\/li>\n<li>\n<h3>? <a href=\"https:\/\/wiki.php.net\/rfc\/container-offset-behaviour\" target=\"_blank\" rel=\"noopener\">RFC: Improve language coherence for the behaviour of offsets and containers<\/a> <a href=\"https:\/\/thephp.foundation\" target=\"_blank\" rel=\"noopener\">?<\/a><\/h3>\n<p>PHP supports offset accesses using brackets <code>[]<\/code> with the following notation <code>$container[$offset]<\/code>. However, the behavior of such accesses depends not only on the container type and offset, but also on the operation that is performed when accessing the offset. The existing behavior is highly inconsistent and difficult to predict.<\/p>\n<p>Gina Peter Banyard proposes to improve language consistency for offsets and containers.<\/p>\n<\/li>\n<li>\n<h3>? <a href=\"https:\/\/wiki.php.net\/rfc\/function_autoloading4\" target=\"_blank\" rel=\"noopener\">RFC: Function Autoloading v4<\/a><\/h3>\n<p>        Robert Landers proposes to add the ability to autoload functions by adding a 4th parameter to <a href=\"https:\/\/www.php.net\/spl_autoload_register\" target=\"_blank\" rel=\"noopener\">spl_autoload_register(&#8230;)<\/a>. Then with a simple PSR-4-like autoloader for functions, the code example could look like this:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\" data-enlighter-title=\"\">spl_autoload_register(function ($function_name) {...}, false, false, SPL_AUTOLOAD_FUNCTION);   \n<\/pre>\n<p>There is an alternative more comprehensive proposal from Gina P. Banyard: <a href=\"https:\/\/wiki.php.net\/rfc\/core-autoloading\" target=\"_blank\" rel=\"noopener\">RFC: New core autoloading mechanism with support for function autoloading<\/a>.<\/p>\n<\/li>\n<li>\n<h3>? <a href=\"https:\/\/wiki.php.net\/rfc\/default_expression\" target=\"_blank\" rel=\"noopener\">RFC: Default expression<\/a><\/h3>\n<p>        Paul Morris proposes to introduce the <code>default<\/code> expression in argument-passing contexts to use the default value of the function or method.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-linenumbers=\"false\" data-enlighter-title=\"\">function greetingEveryone($greeting = &#039;Hello&#039;, $subject = &#039;World&#039;) {  \n    return sprintf(&#039;%s, %s!&#039;, $greeting, $subject);  \n}  \n\necho greetingEveryone(default, \u2018Earth\u2019)); \/\/ Hello, Earth!  \n<\/pre>\n<p>        A <a href=\"https:\/\/wiki.php.net\/rfc\/skipparams\" target=\"_blank\" rel=\"noopener\">similar proposal<\/a> has been declined in the past, and it seems the problem has already been solved with the named arguments\n    <\/li>\n<\/ul>\n<h2 id=\"tools\">Tools<\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/arokettu\/composer-license-manager\" target=\"_blank\" rel=\"noopener\">arokettu\/composer-license-manager<\/a> \u2013 The plugin for Composer that allows specifying license policies, e.g. list of allowed licenses for a project and avoid proprietary packages, packages with non-permissive licenses such as GPL, or no license at all. <a href=\"https:\/\/t.me\/samdark_blog\/184\" target=\"_blank\">?<\/a>\n    <\/li>\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. terminal user interfaces (TUIs)<br \/>\n        <img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/09\/tui.gif\" width=\"400\">\n    <\/li>\n<li><a href=\"https:\/\/github.com\/composer\/pcre\" target=\"_blank\" rel=\"noopener\">composer\/pcre<\/a> \u2013 PCRE wrapping library that offers type-safe <code>preg_*<\/code> replacements.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/clementtalleu\/php-redis-om\" target=\"_blank\" rel=\"noopener\">clementtalleu\/php-redis-om<\/a> \u2013 A PHP object mapper for Redis. Check out the <a href=\"https:\/\/les-tilleuls.coop\/en\/blog\/php-redis-om-an-object-mapper-for-redis\" target=\"_blank\" rel=\"noopener\">intro article<\/a> for more details.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/Sammyjo20\/ssh-php\" target=\"_blank\" rel=\"noopener\">Sammyjo20\/ssh-php<\/a> \u2013 The ridiculously simple starting point for building PHP SSH apps.\n    <\/li>\n<li><a href=\"https:\/\/www.servbay.com\/\" target=\"_blank\" rel=\"noopener\">ServBay<\/a> \u2013 A local dev environment, alternative to Laravel Herd.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/HiEventsDev\/Hi.Events\" target=\"_blank\" rel=\"noopener\">HiEventsDev\/Hi.Events<\/a> \u2013 Open-source event management and ticket selling platform.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/freescout-help-desk\/freescout\" target=\"_blank\" rel=\"noopener\">freescout-help-desk\/freescout<\/a> \u2013 Free self-hosted help desk &amp; shared mailbox (Zendesk \/ Help Scout alternative).\n    <\/li>\n<li><a href=\"https:\/\/github.com\/savinmikhail\/Comments-Density\" target=\"_blank\" rel=\"noopener\">savinmikhail\/Comments-Density<\/a> \u2013 Analyze the comment density and quality in PHP files to maintain and improve code documentation quality.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/prasathmani\/tinyfilemanager\" target=\"_blank\" rel=\"noopener\">prasathmani\/tinyfilemanager<\/a> \u2013 Single-file PHP file manager, browser and manage your files efficiently and easily with tinyfilemanager.\n    <\/li>\n<li><a href=\"https:\/\/github.com\/TicketSwap\/phpstan-error-formatter\" target=\"_blank\" rel=\"noopener\">TicketSwap\/phpstan-error-formatter<\/a> \u2013 A minimalistic error formatter for PHPStan.\n    <\/li>\n<li>\n        <a href=\"https:\/\/x.com\/housecor\/status\/1816190255613276480\" target=\"_blank\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/09\/package.png\" alt=\"\" width=\"50%\"><\/a>\n    <\/li>\n<\/ul>\n<h2 id=\"ai\">AI<\/h2>\n<ul>\n<li><strong><a href=\"https:\/\/codewithkyrian.github.io\/transformers-php\/\" target=\"_blank\" rel=\"noopener\">TransformersPHP<\/a><\/strong>\n<p>It&#8217;s a PHP package that lets you run pretrained models from HuggingFace directly in PHP \u2013 no API, no extra server required.<\/p>\n<p>The package is designed to be functionally equivalent to the popular Python Transformers library. So it\u2019s easy to start using if you\u2019re familiar with ML.<\/p>\n<p>Here are some use-cases:<\/p>\n<ul>\n<li><a href=\"https:\/\/codewithkyrian.com\/p\/building-a-background-removal-tool-with-laravel-and-transformersphp\" target=\"_blank\" rel=\"noopener\">Building a Background Removal Tool with Laravel and TransformersPHP<\/a>.<\/li>\n<li><a href=\"https:\/\/dev.to\/robertobutti\/how-to-translate-content-programmatically-using-ai-and-transformersphp-48jp\" target=\"_blank\" rel=\"noopener\">How to translate content programmatically using AI and TransformersPHP<\/a>.<\/li>\n<li><a href=\"https:\/\/dev.to\/robertobutti\/how-to-auto-generate-the-image-alt-text-using-ai-and-transformers-php-3onc\" target=\"_blank\" rel=\"noopener\">How to auto-generate the image Alt-Text using AI and Transformers PHP<\/a>.<\/li>\n<li><a href=\"https:\/\/dev.to\/robertobutti\/machine-learning-with-php-5gb\" target=\"_blank\" rel=\"noopener\">Machine Learning with PHP<\/a>.<\/li>\n<\/ul>\n<p>Under the hood, it uses <a href=\"https:\/\/onnxruntime.ai\/\" target=\"_blank\" rel=\"noopener\">ONNX Runtime<\/a> and <a href=\"https:\/\/rindow.github.io\/mathematics\/openblas\/mathlibrary.html\" target=\"_blank\" rel=\"noopener\">Math libray Rindow<\/a> via FFI. And the cool part is that it handles everything for you, even downloading all the libs according to your OS with a small Composer plugin: <a href=\"https:\/\/github.com\/CodeWithKyrian\/transformers-libsloader\" target=\"_blank\" rel=\"noopener\">CodeWithKyrian\/transformers-libsloader<\/a>.<\/p>\n<\/li>\n<li><a href=\"https:\/\/github.com\/llm-agents-php\/agents\" target=\"_blank\" rel=\"noopener\">llm-agents-php\/agents<\/a> \u2013 LLM Agents abstraction.\n<p>This package is a framework for creating, managing, and deploying AI agents within PHP environments. The library aims to simplify using Retrieval-Augmented Generation (RAG) techniques into PHP projects.<\/p>\n<p>Check out a <a href=\"https:\/\/github.com\/llm-agents-php\/sample-app\" target=\"_blank\" rel=\"noopener\">sample-app<\/a> and a video showcase: <a href=\"https:\/\/www.youtube.com\/watch?v=Tlu6PyL3Ur4\" target=\"_blank\" rel=\"noopener\">Building a Blog with LLM Agents<\/a>.<\/p>\n<\/li>\n<\/ul>\n<h2 id=\"symfony\">Symfony<\/h2>\n<ul>\n<li><a href=\"https:\/\/medium.com\/the-sensiolabs-tech-blog\/functional-tests-with-symfony-and-webhook-component-ac6577ae13d4\" target=\"_blank\" rel=\"noopener\">Functional Tests with Symfony and Webhook component<\/a> by Pierre Emmanuel Capel.<\/li>\n<li><a href=\"https:\/\/dev.to\/yceruto\/bundling-your-symfony-ux-twig-components-4997\" target=\"_blank\" rel=\"noopener\">Bundling Your Symfony UX Twig Components<\/a> by Yonel Ceruto.<\/li>\n<li><a href=\"https:\/\/github.com\/zenstruck\/console-extra\" target=\"_blank\" rel=\"noopener\">zenstruck\/console-extra<\/a> \u2013 A modular set of features to reduce configuration boilerplate for your Symfony commands.<\/li>\n<li><a href=\"https:\/\/symfony.com\/blog\/symfony-7-1-curated-new-features\" target=\"_blank\" rel=\"noopener\">Symfony 7.1 curated new features<\/a><\/li>\n<\/ul>\n<h2 id=\"laravel\">Laravel<\/h2>\n<ul>\n<li><strong><a href=\"https:\/\/www.youtube.com\/watch?v=AwWepVU5uWM\" target=\"_blank\" rel=\"noopener\">Laracon US 2024<\/a><\/strong>\n<p>Last week, the flagship Laravel conference happened in Dallas, TX. Some big announcements were made, including:<\/p>\n<ul>\n<li>Laravel Cloud<\/li>\n<li><a href=\"https:\/\/laravel-news.com\/everything-we-know-about-pest-3\" target=\"_blank\" rel=\"noopener\">Pest 3<\/a><\/li>\n<li>Invertia.js v2<\/li>\n<li>Laravel VS Code extension<\/li>\n<li><a href=\"https:\/\/laraveldaily.com\/post\/laracon-us-2024-laravel-cloud-inertia-v2-vs-code\" target=\"_blank\" rel=\"noopener\">A few cool features for Laravel 11<\/a><\/li>\n<\/ul>\n<\/li>\n<li><strong><a href=\"https:\/\/stateoflaravel.com\/?ref=2024\" target=\"_blank\" rel=\"noopener\">The State of Laravel Survey 2024<\/a><\/strong>\n<p>The results of the annual survey are now published and have some interesting insights.<\/p>\n<p>Check Brent\u2019s overview of the results <a href=\"https:\/\/www.youtube.com\/watch?v=GTCsnK3MJFQ\" target=\"_blank\" rel=\"noopener\">on YouTube<\/a>.<\/p>\n<\/li>\n<li><a href=\"https:\/\/builtwithlaravel.com\/\" target=\"_blank\" rel=\"noopener\">Built with Laravel<\/a> \u2013 Nice inspo catalog.<\/li>\n<li><a href=\"https:\/\/dev.to\/lotyp\/laravel-config-problem-is-it-time-for-a-revolution-159f\" target=\"_blank\" rel=\"noopener\">Laravel Config Problem: Is It Time for a Revolution?<\/a>.<\/li>\n<li><a href=\"https:\/\/laravel-news.com\/query-scopes\" target=\"_blank\" rel=\"noopener\">Learn to master Query Scopes in Laravel<\/a> by Ashley Allen.<\/li>\n<li><a href=\"https:\/\/freek.dev\/2739-how-to-test-all-routes-in-your-laravel-app-by-writing-just-a-single-pest-test\" target=\"_blank\" rel=\"noopener\">How to test all routes in your Laravel app by writing just a single Pest test<\/a> by Freek Van der Herten.<\/li>\n<li><a href=\"https:\/\/laradir.com\/blog\/real-time-chat-with-laravel-reverb-and-livewire\" target=\"_blank\" rel=\"noopener\">Adding real-time chat in 14 lines of code with Laravel Reverb and Livewire<\/a> by Simon Hamp.<\/li>\n<li><a href=\"https:\/\/youtu.be\/jWHUWeRhPtQ\" target=\"_blank\" rel=\"noopener\">Building Desktop Applications using Native PHP with Simon Hamp<\/a> by Laravel News.<\/li>\n<li>\n<p>I challenged myself to run Laravel with <a href=\"https:\/\/github.com\/rryqszq4\/ngx-php\" target=\"_blank\" rel=\"noopener\">rryqszq4\/ngx-php<\/a>, and ended up benchmarking other runtimes along the way:<\/p>\n<p>        <iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/ZB129Tjkas8?si=LdxXwlGdSpRrc0wC\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n    <\/li>\n<\/ul>\n<h2 id=\"other-frameworks-\">Other Frameworks<\/h2>\n<ul>\n<li><a href=\"https:\/\/blog.phalcon.io\/post\/high-load-micro-service\" target=\"_blank\" rel=\"noopener\">Phalcon + Swoole in High Load Micro Service<\/a> \u2013 A case study on using Swoole to turn PHP into a high-performance powerhouse!<\/li>\n<li><a href=\"https:\/\/getlaminas.org\/blog\/2024-08-05-using-laminas-continuous-integration.md.html\" target=\"_blank\" rel=\"noopener\">Using Laminas Continuous Integration<\/a> by Julian Somesan.<\/li>\n<li><a href=\"https:\/\/getlaminas.org\/blog\/2024-07-29-current-maintenance-status-of-laminas-mezzio-packages.html\" target=\"_blank\" rel=\"noopener\">Current Maintenance Status of Laminas &amp; Mezzio Packages<\/a> by Julian Somesan.<\/li>\n<\/ul>\n<h2 id=\"misc\">Misc<\/h2>\n<ul>\n<li><a href=\"https:\/\/masteringlaravel.io\/daily\/2024-07-04-laravel-podcast-slowly-introducing-static-analysis-without-changing-everything\" target=\"_blank\" rel=\"noopener\">Slowly introducing static analysis without changing everything<\/a> by Joel Clermont.<\/li>\n<li><a href=\"https:\/\/staabm.github.io\/2024\/07\/05\/array-shapes-for-preg-match-matches.html\" target=\"_blank\" rel=\"noopener\">Array Shapes For Preg Match Matches<\/a> by Markus Staab.<\/li>\n<li><a href=\"https:\/\/sarvendev.com\/2024\/07\/container-efficiency-in-modular-monoliths-symfony-vs-laravel\/\" target=\"_blank\" rel=\"noopener\">Container Efficiency in Modular Monoliths: Symfony vs. Laravel<\/a> by Kamil Ruczy\u0144ski.<\/li>\n<li><a href=\"https:\/\/dev.to\/realflowcontrol\/too-double-quote-or-not-thats-the-question-78l\" target=\"_blank\" rel=\"noopener\">To double quote or not, that&#8217;s the question!<\/a> by Florian Engelhardt.<\/li>\n<li><a href=\"https:\/\/tomasvotruba.com\/blog\/scope-and-downgrade-your-php-tool-for-everyone-to-use\" target=\"_blank\" rel=\"noopener\">Scope and Downgrade your PHP Tools for Everyone to Use<\/a> by Tomas Votruba.<\/li>\n<li><a href=\"https:\/\/laravel.io\/articles\/the-override-attribute-in-php\" target=\"_blank\" rel=\"noopener\">The #[\\Override] Attribute in PHP<\/a> by Ashley Allen.<\/li>\n<li><a href=\"https:\/\/wouterj.nl\/2024\/08\/git-notes\" target=\"_blank\" rel=\"noopener\">Store Code Discussions in Git using Git Notes<\/a> by Wouter de Jong \u2013 This is how Symfony stores GitHub Discussions in Git.<\/li>\n<li><a href=\"https:\/\/tideways.com\/profiler\/blog\/choosing-a-php-library-based-on-performance\" target=\"_blank\" rel=\"noopener\">Choosing a PHP Library based on Performance<\/a> by Benjamin Eberlei.<\/li>\n<li><a href=\"https:\/\/medium.com\/the-sensiolabs-tech-blog\/how-to-use-php-vcr-to-record-and-replay-api-calls-in-php-cca397f9ede8\" target=\"_blank\" rel=\"noopener\">How to use PHP-VCR to record and replay API calls in PHP<\/a> \u2013 by Imen Ezzine.<\/li>\n<li><a href=\"hhttps:\/\/www.youtube.com\/watch?v=HK9W5A-Doxc\" target=\"_blank\" rel=\"noopener\">Inheritance in modern programming languages is different\u2026<\/a> by Brent.<\/li>\n<li><a href=\"https:\/\/wintercms.com\/blog\/post\/how-build-game-engine-cms-php\" target=\"_blank\" rel=\"noopener\">How to build a game engine in a CMS, in PHP<\/a> by Jack Wilkinson.<\/li>\n<li><a href=\"https:\/\/bref.sh\/docs\/case-studies\/craft-cloud\" target=\"_blank\" rel=\"noopener\">How Craft CMS built Craft Cloud<\/a> \u2013 A case study from <a href=\"https:\/\/bref.sh\/\" target=\"_blank\" rel=\"noopener\">Bref<\/a>, the serverless PHP tool.<\/li>\n<\/ul>\n<h2 id=\"conferences\">Conferences<\/h2>\n<p>These PHP events are all worth a visit, and some are still accepting presentation proposals:<\/p>\n<ul>\n<li><a href=\"https:\/\/api-platform.com\/con\/2024\/\" target=\"_blank\" rel=\"noopener\">API Platfrom Conference<\/a> \u2013 Lille, France, September 19-20.<\/li>\n<li><a href=\"https:\/\/cascadiaphp.com\/\" target=\"_blank\" rel=\"noopener\">CascadiaPHP 2024<\/a> \u2013 Portland, OR, USA, October 24-26.<\/li>\n<li><a href=\"https:\/\/2024.phpcon.pl\/en\/\" target=\"_blank\" rel=\"noopener\">PHPCon Poland 2024<\/a> \u2013 Wis\u0142a, Poland, October 25\u201326.<\/li>\n<li><a href=\"https:\/\/laracon.au\/\" target=\"_blank\" rel=\"noopener\">Laracon AU<\/a> \u2013 Brisbane, Australia, November 7\u20138.<\/li>\n<li><a href=\"https:\/\/phpconference.com\/munich\/\" target=\"_blank\" rel=\"noopener\">International PHP Conference<\/a> \u2013 Munich, Germany, November 11\u201215.<\/li>\n<li><a href=\"https:\/\/live.symfony.com\/2024-vienna-con\/\" target=\"_blank\" rel=\"noopener\">SymfonyCon 2024<\/a> \u2013 Vienna, Austria, December 5\u20136.<\/li>\n<li><a href=\"https:\/\/laracon.eu\/\" target=\"_blank\" rel=\"noopener\">Laracon EU 2025<\/a> \u2013 Amsterdam, The Netherlands, February 3-4. <a href=\"https:\/\/sessionize.com\/phptek-2025\" target=\"_blank\" rel=\"noopener\">CFP<\/a> ?<\/li>\n<li><a href=\"https:\/\/www.phpconference.co.uk\/\" target=\"_blank\" rel=\"noopener\">PHP UK Conference 2025<\/a> \u2013 London, UK, February 19. <a href=\"https:\/\/www.papercall.io\/phpuk2025\" target=\"_blank\" rel=\"noopener\">CFP<\/a> ?<\/li>\n<li><a href=\"https:\/\/phptek.io\/\" target=\"_blank\" rel=\"noopener\">php[tek] 2025<\/a> \u2013 Chicago, IL, USA, May 20-22. <a href=\"https:\/\/sessionize.com\/phptek-2025\" target=\"_blank\" rel=\"noopener\">CFP<\/a> ?<\/li>\n<\/ul>\n<p>To find a PHP meetup happening near you, check out <a href=\"https:\/\/www.php.net\/cal.php?cm=05&amp;cy=2024\" target=\"_blank\" rel=\"noopener\">the calendar on php.net<\/a>.<\/p>\n<h2 id=\"fun\">Fun<\/h2>\n<ul>\n<li><a href=\"https:\/\/tonsky.me\/blog\/js-bloat\/\" target=\"_blank\" rel=\"noopener\">JavaScript Bloat in 2024<\/a> by Niki Tonsky \u2013 \u201cGitlab needs 13 MB of JS code just to display a static landing page.\u201d<br \/>\n        <a href=\"https:\/\/twitter.com\/ThePrimeagen\/status\/1830661217075241262\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/09\/just_use_php.png\" alt=\"\" width=\"50%\"><\/a><br \/>\n        <a href=\"https:\/\/twitter.com\/iamdevloper\/status\/1819427032050102548\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/09\/one_php_file.png\" alt=\"\" width=\"50%\"><\/a>\n    <\/li>\n<\/ul>\n<hr>\n<p>If you have any interesting or useful links to share via PHP Annotated, please leave a comment on this post or let us know <a href=\"https:\/\/twitter.com\/pronskiy\" target=\"_blank\" rel=\"noopener\">on X\/Twitter<\/a>.<\/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\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 <a href=\"https:\/\/twitter.com\/PhpStorm\" target=\"_blank\" rel=\"noopener\">@PhpStorm<\/a>, Operations 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":508716,"comment_status":"closed","ping_status":"closed","template":"","categories":[],"tags":[2213,190,8111,8504,2323,2648,191],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/phpstorm\/508283"}],"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=508283"}],"version-history":[{"count":10,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/phpstorm\/508283\/revisions"}],"predecessor-version":[{"id":543762,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/phpstorm\/508283\/revisions\/543762"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media\/508716"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media?parent=508283"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/categories?post=508283"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/tags?post=508283"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/cross-post-tag?post=508283"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}