<?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"><category term="PHP" label="r/PHP"/><updated>2026-07-09T01:36:02+00:00</updated><icon>https://www.redditstatic.com/icon.png/</icon><id>/r/PHP/.rss</id><link rel="self" href="https://www.reddit.com/r/PHP/.rss" type="application/atom+xml" /><link rel="alternate" href="https://www.reddit.com/r/PHP/" type="text/html" /><subtitle>Share and discover the latest news about the PHP ecosystem and its community. Please respect r/php's rules.</subtitle><title>PHP: The latest news in the PHP world</title><entry><author><name>/u/brendt_gd</name><uri>https://www.reddit.com/user/brendt_gd</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;Hey there!&lt;/p&gt; &lt;p&gt;This subreddit isn&amp;#39;t meant for help threads, though there&amp;#39;s one exception to the rule: in this thread you can ask anything you want PHP related, someone will probably be able to help you out!&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/brendt_gd&quot;&gt; /u/brendt_gd &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1uootu2/weekly_help_thread/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1uootu2/weekly_help_thread/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1uootu2</id><link href="https://www.reddit.com/r/PHP/comments/1uootu2/weekly_help_thread/" /><updated>2026-07-06T06:00:05+00:00</updated><published>2026-07-06T06:00:05+00:00</published><title>Weekly help thread</title></entry><entry><author><name>/u/brendt_gd</name><uri>https://www.reddit.com/user/brendt_gd</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;In this monthly thread you can share whatever code or projects you&amp;#39;re working on, ask for reviews, get people&amp;#39;s input and general thoughts, … anything goes as long as it&amp;#39;s PHP related. &lt;/p&gt; &lt;p&gt;Let&amp;#39;s make this a place where people are encouraged to share their work, and where we can learn from each other 😁&lt;/p&gt; &lt;p&gt;Link to the previous edition: &lt;a href=&quot;/u/brendt_gd&quot;&gt;/u/brendt_gd&lt;/a&gt; should provide a link&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/brendt_gd&quot;&gt; /u/brendt_gd &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1u9vul4/pitch_your_project/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1u9vul4/pitch_your_project/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1u9vul4</id><link href="https://www.reddit.com/r/PHP/comments/1u9vul4/pitch_your_project/" /><updated>2026-06-19T08:00:29+00:00</updated><published>2026-06-19T08:00:29+00:00</published><title>Pitch Your Project 🐘</title></entry><entry><author><name>/u/ProjektGopher</name><uri>https://www.reddit.com/user/ProjektGopher</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;Hello world, it&amp;#39;s Wednesday, July 8, 2026, and here&amp;#39;s what happened This Week in PHP Internals.&lt;/p&gt; &lt;p&gt;This week&amp;#39;s episode is brought to you by &lt;strong&gt;Ballast&lt;/strong&gt;. Your team ships constantly — but how much of that work actually &lt;em&gt;lasts&lt;/em&gt;? Ballast reads your git history and computes a deterministic &lt;strong&gt;durability score&lt;/strong&gt;: does shipped code hold up, or churn and get redone? Ballast is in early access now at &lt;code&gt;ballast.now&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;This week&amp;#39;s top story is still Gina P. Banyard&amp;#39;s &lt;strong&gt;Deprecations for PHP &lt;code&gt;8.6&lt;/code&gt;&lt;/strong&gt; — the annual bundle where every removal gets its own ballot — and this week it caught fire &lt;em&gt;twice&lt;/em&gt;. First fire: the long-array question. With Seifeddine Gmati&amp;#39;s &lt;code&gt;list()&lt;/code&gt; deprecation already on the table, Tim Düsterhus floated a draft that turns &lt;code&gt;array()&lt;/code&gt; into a real cast function — and Michael Morris erupted at where that road leads. He asked, &amp;quot;Are you crazy?&amp;quot; — deprecating &lt;code&gt;array()&lt;/code&gt; would, by his math, touch 3 quarters of WordPress core and nearly every plugin. Seif&amp;#39;s counter was all receipts: the rewrite is one &lt;code&gt;ast-grep&lt;/code&gt; command, &lt;code&gt;array(...)&lt;/code&gt; and &lt;code&gt;[...]&lt;/code&gt; compile to &lt;strong&gt;byte-identical opcodes&lt;/strong&gt; — and, for the record, &amp;quot;The proposal is to deprecate list(), not array().&amp;quot; Then Juliette Reinders Folmer — who maintains the WordPress Coding Standards — corrected &lt;em&gt;everyone&lt;/em&gt;: WordPress still supports PHP &lt;code&gt;7.4&lt;/code&gt;, and short arrays were blocked there for years by a handful of core committers, not the community.&lt;/p&gt; &lt;p&gt;It got personal — Morris told Seif to step out of his ivory tower; Seif kept answering with engineering. He wrote: &amp;quot;I&amp;#39;ve written a compiler that migrated a multi-million-line codebase from one language to another, automatically, overnight. Swapping one AST node for another that is literally equivalent to the compiler is not a feat of engineering courage.&amp;quot; To Morris&amp;#39;s credit, when told he was turning it personal, he replied: &amp;quot;I am, and I apologize.&amp;quot; — and the thread cooled.&lt;/p&gt; &lt;p&gt;Then Monday it reignited — over &lt;strong&gt;evidence&lt;/strong&gt;. Gina regrouped the list, folded in new items sent to her directly, and set the clock: &amp;quot;If none are added or amended, I will initiate a call to vote next week.&amp;quot; Rowan Tommins counted 35 proposals and only 8 with any discussion of who&amp;#39;d be affected, and threatened to cast 27 blanket no votes. Gina drew her line: &amp;quot;You are free to do as you please.&amp;quot; — she won&amp;#39;t produce &lt;em&gt;metrics for the sake of metrics&lt;/em&gt; without an agreed method. Rowan held firm: &amp;quot;I do not think we should be removing features without thinking about who will be affected. I&amp;#39;m honestly shocked that that&amp;#39;s a controversial opinion&amp;quot;. Juliette, once again the bridge, renewed her offer to generate real impact data with PHPCompatibility — feasible, she says, for about 25 of the 36 items. One item is on its way out: the by-reference-return-modifier deprecation — Bob Weinand recommended a complete retraction, and its proposer had already offered one. The RFC freezes &lt;strong&gt;July 13&lt;/strong&gt; — expect the call to vote next week, though with the mandatory 14-day cooldown after Gina&amp;#39;s latest changes, actual ballots open &lt;strong&gt;July 21&lt;/strong&gt; at the earliest.&lt;/p&gt; &lt;p&gt;Tim Düsterhus and Derick Rethans&amp;#39; &lt;code&gt;Time\Duration&lt;/code&gt; class — the stopwatch value object aimed at &lt;code&gt;8.6&lt;/code&gt; — got called &lt;strong&gt;done&lt;/strong&gt; this week: &amp;quot;we would consider the RFC to be complete&amp;quot;. The final decisions: &lt;code&gt;add&lt;/code&gt; and &lt;code&gt;sub&lt;/code&gt; won an informal PHP Foundation Slack poll &lt;em&gt;unanimously&lt;/em&gt;; the past-tense method suffixes are gone; &lt;code&gt;divideInto()&lt;/code&gt; got pushed to future scope; and the ban on negative constructor arguments stays, on Derick&amp;#39;s call. One naming question goes to the voters as a secondary vote: full names like &lt;code&gt;multiplyBy&lt;/code&gt; and &lt;code&gt;absolute&lt;/code&gt;, or abbreviations like &lt;code&gt;mul&lt;/code&gt; and &lt;code&gt;abs&lt;/code&gt; — with the abbreviations needing a 2-thirds supermajority.&lt;/p&gt; &lt;p&gt;But one fight would &lt;em&gt;not&lt;/em&gt; close: &lt;code&gt;fromSeconds()&lt;/code&gt;. It takes seconds &lt;strong&gt;plus&lt;/strong&gt; a nanoseconds argument, capped at 999 million 999 thousand 999 — overflow is rejected, not carried. Marc B. objected: &amp;quot;It makes it simple to reason about for you as implementing it - it forces the burden to the one using the API.&amp;quot; Pierre Joye brought prior art: Java and Rust both carry the overflow instead of rejecting it, and JavaScript&amp;#39;s Temporal doesn&amp;#39;t impose the cap either. Tim&amp;#39;s defense: an injective constructor means one value, one spelling — a form asking for seconds should reject out-of-range input the same way June 31 should be rejected, not silently become July 1. Neither side budged — and with the RFC complete, that question rides along to the vote.&lt;/p&gt; &lt;p&gt;Function autoloading now has &lt;strong&gt;2 competing designs&lt;/strong&gt;, and they met in the same inbox on the same day. Paul M. Jones updated his mark-5 RFC — that&amp;#39;s attempt number 5 — adding a &lt;code&gt;declare(strict_namespace=1)&lt;/code&gt; directive to kill the global-fallback edge case, plus research across the top 1000 Packagist packages: exactly &lt;strong&gt;2&lt;/strong&gt; packages and 8 call sites would misbehave. Meanwhile, Michael Morris — fresh off the deprecations thread — had floated an idea on July 2, saying: &amp;quot;An idea that popped into my head an hour ago, that I don&amp;#39;t have another PHP Dev to talk to about, what if you could register a function that is called by PHP the first time it sees a namespace declared?&amp;quot; Five days later that spitball was a formal draft: autoloader callbacks that take &lt;strong&gt;2 arguments&lt;/strong&gt; — the class &lt;em&gt;and&lt;/em&gt; the namespace — firing the first time the engine meets a namespace. And within hours of Paul&amp;#39;s update, Morris was in Paul&amp;#39;s thread advertising his rival.&lt;/p&gt; &lt;p&gt;The reason the spitball grew legs is Rowan Tommins. His endorsement became the backbone of Morris&amp;#39;s draft — he wrote: &amp;quot;This really nicely side-steps the global-vs-namespace sequence problem that function autoloading always runs into: by the time the engine reaches an unqualified name, the namespace loader has already run for the current namespace, and defined any functions it wants.&amp;quot; Not everyone&amp;#39;s sold. Aleksander Machniak flagged that passing &lt;code&gt;null&lt;/code&gt; to existing string-typed autoloaders is itself a BC break, and Alex Rock argued the draft bundles 2 different proposals and called it overkill. Morris&amp;#39;s reply had some edge: &amp;quot;And you&amp;#39;ve misread the proposal entirely.&amp;quot;&lt;/p&gt; &lt;p&gt;The busiest brand-new thread: Matheus Martins revived &lt;strong&gt;typed closures&lt;/strong&gt; — write &lt;code&gt;Closure(int): bool&lt;/code&gt; as a parameter type, and a mismatched callback fails at the boundary with a clean TypeError instead of exploding deep inside your &lt;code&gt;filter()&lt;/code&gt;. The reception was warm — Matthew Weier O&amp;#39;Phinney would find it &amp;quot;very useful&amp;quot;, and Larry Garfield is in favor, &lt;em&gt;to nobody&amp;#39;s surprise&lt;/em&gt;. Rob Landers suggested waiting for generics; Seif pointed out that would need variadic generics, which have never appeared in &lt;strong&gt;any&lt;/strong&gt; proposal — waiting for generics means waiting indefinitely. Larry was blunter: &amp;quot;Generics syntax is the wrong format to use for this, full stop.&amp;quot; The real villain is the &lt;em&gt;lexer&lt;/em&gt;: inside &lt;code&gt;Closure(int)&lt;/code&gt;, that &lt;code&gt;(int)&lt;/code&gt; is a &lt;strong&gt;cast token&lt;/strong&gt;. Osama Aldemeery, who&amp;#39;s been down this exact tunnel, put it memorably: &amp;quot;So the natural spelling is, unfortunately, the engine-hostile one.&amp;quot;&lt;/p&gt; &lt;p&gt;Where it landed: inline signatures first, named type-aliases later, and neither blocks the other. Larry pre-empted the objection everyone could see coming — if someone gets fussy about long signatures, the answer should be &amp;quot;that&amp;#39;s nice, go work on aliases then and don&amp;#39;t block this RFC&amp;quot;. By Monday he&amp;#39;d added just one ask: invokable objects should fit through the same door, not get squeezed through closures.&lt;/p&gt; &lt;p&gt;Rob Landers&amp;#39; &lt;strong&gt;primary constructors&lt;/strong&gt; — the constructor hoisted onto the class line — spent June fighting over whether it may carry a body. This week that fight hit its endgame, in a single day of posts. Rowan Tommins came off the fence — with a body bolted on, he&amp;#39;d be a definite &lt;strong&gt;no&lt;/strong&gt;. Rob, the author, declined to relitigate: &amp;quot;All I can say is that I reject it for future scope, repeatedly.&amp;quot; Nick Sdot stood down under protest, warning: &amp;quot;We don&amp;#39;t need more half finished, half not working, confusing features in PHP.&amp;quot; And then, quietly, the week&amp;#39;s one unreserved fan — a reader who wrote that extending third-party classes and calling the parent constructor by hand &amp;quot;always felt dirty&amp;quot;. The thread&amp;#39;s been silent since July 1.&lt;/p&gt; &lt;p&gt;Michal Kral&amp;#39;s &lt;strong&gt;scalar object methods&lt;/strong&gt; — &lt;code&gt;(3)-&amp;gt;pow(2)&lt;/code&gt;, dispatched at compile time — came back for round 2, and the room steered it somewhere new. Michal gave real ground: he&amp;#39;d restrict or drop the file-order-dependent form, and lean on typed locals for safety. Seif stayed unmoved, arguing: &amp;quot;Seeing $s-&amp;gt;trim() where $s is a string, I should know it works. A construct where identical AST dispatches or doesn&amp;#39;t depending on file position, a redundant cast, or whether a declaration sits above or below the call is not something people can reason about.&amp;quot; Then Larry Garfield reframed the whole conversation: a &lt;em&gt;small curated set&lt;/em&gt; of methods, he said, &amp;quot;is bikeshed bait, and needlessly limiting&amp;quot; — and counter-pitched Kotlin-style &lt;strong&gt;extension functions&lt;/strong&gt; on any type, from a design he drafted with Sara Golemon. Michal&amp;#39;s response? &lt;em&gt;Genuinely interested.&lt;/em&gt; They&amp;#39;re talking off-list once Larry&amp;#39;s back from vacation.&lt;/p&gt; &lt;p&gt;To the scoreboard — one ballot closed, one never opened. Jordi Kroon&amp;#39;s &lt;strong&gt;third-party extension documentation&lt;/strong&gt; RFC is &lt;em&gt;in&lt;/em&gt;: 26 to 1, with 1 abstention. The secondaries settled too: the docs land on a &lt;code&gt;php.net&lt;/code&gt; subpath rather than a new subdomain, 15 to 8, and the old user notes get dropped in the move, 21 to 4. Meanwhile the &lt;code&gt;grapheme_mask&lt;/code&gt; vote that was announced for July 3? As far as we can tell, it &lt;strong&gt;never opened&lt;/strong&gt; — the RFC page still says draft, and the feedback stayed kind but firm. Yuya Hamada wrote: &amp;quot;Thank you very much for your RFC. But move to voting phase is too fast.&amp;quot; The pipeline ahead is stacked: deprecations expects its call to vote next week, and &lt;code&gt;Duration&lt;/code&gt; finishes its cooldown just in time for the mid-August freeze.&lt;/p&gt; &lt;p&gt;Quick hits — and there are a &lt;em&gt;lot&lt;/em&gt;, so this is a 2-slide round. July 2 was patch day: security releases for &lt;code&gt;8.2&lt;/code&gt;, &lt;code&gt;8.3&lt;/code&gt;, &lt;code&gt;8.4&lt;/code&gt;, and &lt;code&gt;8.5&lt;/code&gt;, and &lt;code&gt;8.6.0&lt;/code&gt; &lt;strong&gt;alpha 1&lt;/strong&gt; is out for testing. Eric Norris and Tim Düsterhus published the minimum-supported-versions RFC — newer autoconf, and MySQL &lt;code&gt;5.7.3&lt;/code&gt; or MariaDB &lt;code&gt;10.2.4&lt;/code&gt; for persistent connections — and an anonymous tester promptly found a real connection leak on old MySQL, declaring: &amp;quot;There is connection leak here!&amp;quot; — Eric&amp;#39;s tracked down the cause and is weighing a fix. Nicolas Grekas redesigned &lt;strong&gt;serializable closures&lt;/strong&gt; and offered a slimmed-down fallback, nudging the list that &lt;code&gt;8.6&lt;/code&gt; won&amp;#39;t wait. Osama Aldemeery floated a &lt;code&gt;PREG_THROW_ON_ERROR&lt;/code&gt; flag — implementation already built. And Nick Sdot posted a &lt;em&gt;tiny&lt;/em&gt; RFC: default values on &lt;code&gt;readonly&lt;/code&gt; properties, a 5-line removal — zero replies so far.&lt;/p&gt; &lt;p&gt;Still going. Literal scalar types turned into an enums-versus-literals standoff, where Nick warned: &amp;quot;We should not make PHP another TypeScript.&amp;quot; Ben Ramsey added a Foundation-SIGs section to &lt;strong&gt;Working Groups&lt;/strong&gt; and wants feedback before he votes it — or withdraws it. The DTLS experiment graduated to a working &lt;code&gt;1.2&lt;/code&gt; branch; Jakub Zelenka wants a draft PR. Pierre Joye synced bundled GD with libgd &lt;code&gt;2.4&lt;/code&gt; and is untangling Windows dependencies. Pratik Bhujel&amp;#39;s terminal helpers got Derick&amp;#39;s blessing — ship it via PIE, since PECL takes no new packages. And Pratik also asked whether fixing &lt;code&gt;sscanf&lt;/code&gt;&amp;#39;s &lt;code&gt;%c&lt;/code&gt; whitespace bug — in place since PHP &lt;code&gt;4.3.2&lt;/code&gt; — breaks anyone on master.&lt;/p&gt; &lt;p&gt;So that&amp;#39;s the week: a deprecations list that fought about WordPress and then about evidence, with the call to vote days away; a Duration RFC wrapped up and waiting out its cooldown; 2 rival answers to function autoloading colliding in real time; typed closures winning the room while the lexer holds the door; and the one ballot that closed, passing 26 to 1. Links to every thread are below. We&amp;#39;re Artisan Build. See you next week.&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/ProjektGopher&quot;&gt; /u/ProjektGopher &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://youtube.com/watch?v=5Rr_H3vFhjE&amp;amp;si=P3dbeUuBcBJBJBYn&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1urbatf/this_week_in_php_internals_july_8_2026/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1urbatf</id><link href="https://www.reddit.com/r/PHP/comments/1urbatf/this_week_in_php_internals_july_8_2026/" /><updated>2026-07-09T00:53:57+00:00</updated><published>2026-07-09T00:53:57+00:00</published><title>This Week In PHP Internals | July 8, 2026</title></entry><entry><author><name>/u/jmp_ones</name><uri>https://www.reddit.com/user/jmp_ones</uri></author><category term="PHP" label="r/PHP"/><content type="html">&amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/jmp_ones&quot;&gt; /u/jmp_ones &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://wiki.php.net/rfc/function-autoloading-five-oh&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1uqgbtw/rfc_function_autoloading_mark_5/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1uqgbtw</id><link href="https://www.reddit.com/r/PHP/comments/1uqgbtw/rfc_function_autoloading_mark_5/" /><updated>2026-07-08T02:51:15+00:00</updated><published>2026-07-08T02:51:15+00:00</published><title>RFC: Function Autoloading (mark 5)</title></entry><entry><author><name>/u/naderman</name><uri>https://www.reddit.com/user/naderman</uri></author><category term="PHP" label="r/PHP"/><content type="html">&amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/naderman&quot;&gt; /u/naderman &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://blog.packagist.com/immutable-versions-on-packagist/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1uq8oid/immutable_versions_on_packagist/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1uq8oid</id><link href="https://www.reddit.com/r/PHP/comments/1uq8oid/immutable_versions_on_packagist/" /><updated>2026-07-07T21:28:27+00:00</updated><published>2026-07-07T21:28:27+00:00</published><title>Immutable Versions on Packagist</title></entry><entry><author><name>/u/aimeos</name><uri>https://www.reddit.com/user/aimeos</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;PHP Map version 4.1 is now available, the PHP array/collection package for working with arrays and collections easily.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&quot;https://php-map.org&quot;&gt;https://php-map.org&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The release is mostly about improving performance of edge cases in the collection internals, plus stricter behavior around malformed input.&lt;/p&gt; &lt;p&gt;Some benchmarks from the release commits:&lt;/p&gt; &lt;table&gt;&lt;thead&gt; &lt;tr&gt; &lt;th align=&quot;left&quot;&gt;Method / path&lt;/th&gt; &lt;th align=&quot;left&quot;&gt;v4.0&lt;/th&gt; &lt;th align=&quot;left&quot;&gt;v4.1&lt;/th&gt; &lt;th align=&quot;left&quot;&gt;Improvement&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt;&lt;tbody&gt; &lt;tr&gt; &lt;td align=&quot;left&quot;&gt;&lt;code&gt;isList()&lt;/code&gt;&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;857.993 ms&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;0.643 ms&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;99.93%&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;left&quot;&gt;&lt;code&gt;tree()&lt;/code&gt; 20k chain&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;8523.8 ms&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;47.6 ms&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;99.4%&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;left&quot;&gt;&lt;code&gt;diff()&lt;/code&gt; array fallback&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;376.1 ms&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;3.5 ms&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;99.1%&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;left&quot;&gt;&lt;code&gt;intersect()&lt;/code&gt; array fallback&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;390.5 ms&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;13.2 ms&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;96.6%&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;left&quot;&gt;&lt;code&gt;find()&lt;/code&gt; reverse&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;417.330 ms&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;47.152 ms&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;88.70%&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;left&quot;&gt;&lt;code&gt;findKey()&lt;/code&gt; reverse&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;416.939 ms&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;47.737 ms&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;88.55%&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;left&quot;&gt;&lt;code&gt;suffix()&lt;/code&gt; string&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;259.5 ms&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;93.1 ms&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;64.1%&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;left&quot;&gt;&lt;code&gt;flat()&lt;/code&gt;&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;338.8 ms&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;123.8 ms&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;63.5%&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;left&quot;&gt;recursive &lt;code&gt;walk()&lt;/code&gt;&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;277.0 ms&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;103.9 ms&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;62.5%&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;left&quot;&gt;&lt;code&gt;suffix()&lt;/code&gt; callback&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;318.1 ms&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;124.5 ms&lt;/td&gt; &lt;td align=&quot;left&quot;&gt;60.9%&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;The release also adds broader callable support, better iterable handling, clearer null-vs-missing behavior for nested paths, stricter invalid-key validation, and a more robust &lt;code&gt;tree()&lt;/code&gt; builder.&lt;/p&gt; &lt;h1&gt;Why PHP Map?&lt;/h1&gt; &lt;p&gt;Instead of:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;$list = [[&amp;#39;id&amp;#39; =&amp;gt; &amp;#39;one&amp;#39;, &amp;#39;value&amp;#39; =&amp;gt; &amp;#39;v1&amp;#39;]]; $list[] = [&amp;#39;id&amp;#39; =&amp;gt; &amp;#39;two&amp;#39;, &amp;#39;value&amp;#39; =&amp;gt; &amp;#39;v2&amp;#39;] unset( $list[0] ); $list = array_filter( $list ); sort( $list ); $pairs = array_column( $list, &amp;#39;value&amp;#39;, &amp;#39;id&amp;#39; ); $value = reset( $pairs ) ?: null; &lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Just write:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;$value = map( [[&amp;#39;id&amp;#39; =&amp;gt; &amp;#39;one&amp;#39;, &amp;#39;value&amp;#39; =&amp;gt; &amp;#39;v1&amp;#39;]] ) -&amp;gt;push( [&amp;#39;id&amp;#39; =&amp;gt; &amp;#39;two&amp;#39;, &amp;#39;value&amp;#39; =&amp;gt; &amp;#39;v2&amp;#39;] ) -&amp;gt;remove( 0 ) -&amp;gt;filter() -&amp;gt;sort() -&amp;gt;col( &amp;#39;value&amp;#39;, &amp;#39;id&amp;#39; ) -&amp;gt;first(); &lt;/code&gt;&lt;/pre&gt; &lt;p&gt;There are several implementations of collections available in PHP but the PHP Map package is feature-rich, dependency free and loved by most developers according to GitHub.&lt;/p&gt; &lt;p&gt;Feel free to like, comment or give a star :-)&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Documentation: &lt;a href=&quot;https://php-map.org&quot;&gt;https://php-map.org&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Repo:&lt;a href=&quot;https://github.com/aimeos/map&quot;&gt;https://github.com/aimeos/map&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/aimeos&quot;&gt; /u/aimeos &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1upr1ca/php_map_40_arrays_and_collections_made_easy/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1upr1ca/php_map_40_arrays_and_collections_made_easy/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1upr1ca</id><link href="https://www.reddit.com/r/PHP/comments/1upr1ca/php_map_40_arrays_and_collections_made_easy/" /><updated>2026-07-07T10:25:16+00:00</updated><published>2026-07-07T10:25:16+00:00</published><title>PHP Map 4.0: Arrays and collections made easy!</title></entry><entry><author><name>/u/brendt_gd</name><uri>https://www.reddit.com/user/brendt_gd</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;Hi &lt;a href=&quot;/r/php&quot;&gt;/r/php&lt;/a&gt;&lt;/p&gt; &lt;p&gt;A common question we see on this subreddit (and many other places) is people asking how to get started with PHP. Especially on this sub we often link to PHP the right way. It&amp;#39;s definitely a good reference that links to many other resources, but I recently read through it and realized is not designed to be a proper &amp;quot;getting started guide&amp;quot;. &lt;/p&gt; &lt;p&gt;Having done lots of educational content in the past, I&amp;#39;m really longing for something that teaches modern PHP in a written form, that people can read on its own which makes them feel comfortable actually picking up PHP. I don&amp;#39;t think PHP currently has that: all current options are either outdated, video-only, or paid courses (but feel free to tell me I&amp;#39;m wrong).&lt;/p&gt; &lt;p&gt;So I&amp;#39;ve started a new project: a proper &amp;quot;getting started with modern PHP&amp;quot; guide that I feel confident pointing beginners to when they ask &amp;quot;how to learn PHP?&amp;quot;. You can read the first eight chapters today: &lt;a href=&quot;https://stitcher.io/php/the-basics/hello-php&quot;&gt;https://stitcher.io/php/the-basics/hello-php&lt;/a&gt; and I&amp;#39;m planning on adding many more in the near future.&lt;/p&gt; &lt;p&gt;Now, here&amp;#39;s what I need help with: I&amp;#39;m only one person. I dare say I&amp;#39;m experienced in PHP, but I&amp;#39;m also sure I&amp;#39;m making mistakes and oversights. I&amp;#39;m hoping enough experienced PHP developers share my longing for something better, and want to help out. Either by reviewing what&amp;#39;s written, pointing out or fixing mistakes, or maybe even by writing drafts for upcoming chapters.&lt;/p&gt; &lt;p&gt;Looking forward to hearing your thoughts!&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/brendt_gd&quot;&gt; /u/brendt_gd &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1uppfmm/getting_started_with_php_looking_for_feedback/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1uppfmm/getting_started_with_php_looking_for_feedback/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1uppfmm</id><link href="https://www.reddit.com/r/PHP/comments/1uppfmm/getting_started_with_php_looking_for_feedback/" /><updated>2026-07-07T08:57:10+00:00</updated><published>2026-07-07T08:57:10+00:00</published><title>Getting started with PHP: looking for feedback</title></entry><entry><author><name>/u/Few-Mycologist7747</name><uri>https://www.reddit.com/user/Few-Mycologist7747</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;Over the years I&amp;#39;ve worked with Java, Python and a few other languages.&lt;/p&gt; &lt;p&gt;They&amp;#39;re all good at different things, but somehow I always end up writing PHP again. I guess it just feels like home. Open the project and everything feels so familiar. ))&lt;/p&gt; &lt;p&gt;That gave me the idea to make a funny parody of the one classic hit song (from the 70s), but for PHP developers.&lt;/p&gt; &lt;p&gt;Nothing serious, no language wars – just a bit of fun for anyone who&amp;#39;s ever left PHP and then came back.&lt;/p&gt; &lt;p&gt;🎬 &lt;a href=&quot;https://youtu.be/SoqAP4gSDac&quot;&gt;https://youtu.be/SoqAP4gSDac&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Has anyone else had the same experience like me?&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/Few-Mycologist7747&quot;&gt; /u/Few-Mycologist7747 &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1uq6lbn/i_keep_trying_other_languages_and_somehow_always/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1uq6lbn/i_keep_trying_other_languages_and_somehow_always/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1uq6lbn</id><link href="https://www.reddit.com/r/PHP/comments/1uq6lbn/i_keep_trying_other_languages_and_somehow_always/" /><updated>2026-07-07T20:12:38+00:00</updated><published>2026-07-07T20:12:38+00:00</published><title>I keep trying other languages... and somehow always end up back in PHP</title></entry><entry><author><name>/u/bambamboole</name><uri>https://www.reddit.com/user/bambamboole</uri></author><category term="PHP" label="r/PHP"/><content type="html">&amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/bambamboole&quot;&gt; /u/bambamboole &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://latticephp.com/components/notifications/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1uq1h4h/lattice_017_now_supports_notifications/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1uq1h4h</id><link href="https://www.reddit.com/r/PHP/comments/1uq1h4h/lattice_017_now_supports_notifications/" /><updated>2026-07-07T17:15:26+00:00</updated><published>2026-07-07T17:15:26+00:00</published><title>Lattice 0.17 now supports Notifications</title></entry><entry><author><name>/u/3liusef</name><uri>https://www.reddit.com/user/3liusef</uri></author><category term="PHP" label="r/PHP"/><content type="html">&amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/3liusef&quot;&gt; /u/3liusef &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://github.com/kayedspace/laravel-doctor&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1uq52w0/just_shipped_laravel_doctor_the_laravel_checks/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1uq52w0</id><link href="https://www.reddit.com/r/PHP/comments/1uq52w0/just_shipped_laravel_doctor_the_laravel_checks/" /><updated>2026-07-07T19:19:53+00:00</updated><published>2026-07-07T19:19:53+00:00</published><title>Just shipped Laravel Doctor: the Laravel checks your static analysis misses</title></entry><entry><author><name>/u/FantasticTourist5935</name><uri>https://www.reddit.com/user/FantasticTourist5935</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;I&amp;#39;ve been working on a project that turns an Android phone into a lightweight local web server using Termux.&lt;/p&gt; &lt;p&gt;It runs Nginx + PHP-FPM + MariaDB and includes a web-based control panel, one-click WordPress installation, virtual hosts, Tiny File Manager, browser-based terminal access, and built-in Cloudflared tunnels for sharing local sites.&lt;/p&gt; &lt;p&gt;The main goal was to keep it fast, lightweight, and easy to use—no root, no PC, and no Docker required. Everything is managed with simple commands like &amp;quot;ms start&amp;quot; and &amp;quot;ms stop&amp;quot;.&lt;/p&gt; &lt;p&gt;If anyone is interested in running a portable PHP development environment or hosting small projects directly from an Android device, I&amp;#39;d love to hear your feedback.&lt;/p&gt; &lt;p&gt;GitHub: &lt;a href=&quot;https://github.com/SayfullahSayeb/mobile-server&quot;&gt;https://github.com/SayfullahSayeb/mobile-server&lt;/a&gt;&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/FantasticTourist5935&quot;&gt; /u/FantasticTourist5935 &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1up7luc/i_built_a_fast_lightweight_web_server_for_android/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1up7luc/i_built_a_fast_lightweight_web_server_for_android/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1up7luc</id><link href="https://www.reddit.com/r/PHP/comments/1up7luc/i_built_a_fast_lightweight_web_server_for_android/" /><updated>2026-07-06T19:30:19+00:00</updated><published>2026-07-06T19:30:19+00:00</published><title>I built a fast, lightweight web server for Android (No root required)</title></entry><entry><author><name>/u/Total_Ad6084</name><uri>https://www.reddit.com/user/Total_Ad6084</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;Before: page felt slow, no idea why.&lt;/p&gt; &lt;p&gt;After: opened the profiler, it pointed straight at the N+1. 87 queries → 3 after the fix. It&amp;#39;s a bundle that reads your Doctrine queries in the Web Profiler and flags N+1s, slow queries, and missing indexes, with the fix suggestion right there. &lt;/p&gt; &lt;p&gt;Repo: &lt;a href=&quot;https://github.com/ahmed-bhs/doctrine-doctor&quot;&gt;https://github.com/ahmed-bhs/doctrine-doctor&lt;/a&gt;&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/Total_Ad6084&quot;&gt; /u/Total_Ad6084 &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1upt6i1/my_symfony_page_made_87_queries_this_profiler_tab/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1upt6i1/my_symfony_page_made_87_queries_this_profiler_tab/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1upt6i1</id><link href="https://www.reddit.com/r/PHP/comments/1upt6i1/my_symfony_page_made_87_queries_this_profiler_tab/" /><updated>2026-07-07T12:09:16+00:00</updated><published>2026-07-07T12:09:16+00:00</published><title>My Symfony page made 87 queries. This profiler tab found the N+1 in 2 seconds.</title></entry><entry><author><name>/u/snsmurf</name><uri>https://www.reddit.com/user/snsmurf</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;Hey all,&lt;/p&gt; &lt;p&gt;I manage a few servers for my day job, and we’re not able to use something like Forge. Managing a server isn’t the most complicated thing in the world, but there are a few tasks where I always struggle to remember the exact syntax, or where I just want something a bit quicker than digging through notes.&lt;/p&gt; &lt;p&gt;I know aliases and scripts could solve a lot of this, but I started wondering whether it would be useful to have a small CLI abstraction layer for common server admin tasks.&lt;/p&gt; &lt;p&gt;So, admittedly with a little help from our good friend AI for some of the more complicated Go sections, I put together a CLI app and started using it to manage servers, SSH keys, projects, nginx, PHP, SQL, and a few other bits.&lt;/p&gt; &lt;p&gt;I ended up really liking it, showed it to a friend, and he suggested I tidy a few things up and open source it.&lt;/p&gt; &lt;p&gt;So I did that, and it has grown a bit since then. It now has a plugin system (although no production ready plugins exist yet), and full documentation for the commands it currently supports.&lt;/p&gt; &lt;p&gt;One thing I’d like to add eventually is support for other Linux distros that do things differently. That will probably come later, but I do have a few servers that would benefit from it.&lt;/p&gt; &lt;p&gt;I know a lot of people will prefer working directly with Linux, or using a platform like Forge or Ploi, but I thought this might be useful to some people who want a memorable CLI for common server tasks.&lt;/p&gt; &lt;p&gt;If you’re interested, you can check it out on GitHub:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/useabstrax/abstrax&quot;&gt;https://github.com/useabstrax/abstrax&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Or the main site:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://useabstrax.com&quot;&gt;https://useabstrax.com&lt;/a&gt;&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/snsmurf&quot;&gt; /u/snsmurf &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1upb3nl/looking_for_feedback_on_abstrax_a_cli_for_common/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1upb3nl/looking_for_feedback_on_abstrax_a_cli_for_common/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1upb3nl</id><link href="https://www.reddit.com/r/PHP/comments/1upb3nl/looking_for_feedback_on_abstrax_a_cli_for_common/" /><updated>2026-07-06T21:39:00+00:00</updated><published>2026-07-06T21:39:00+00:00</published><title>Looking for feedback on Abstrax, a CLI for common PHP server admin tasks</title></entry><entry><author><name>/u/Mojah</name><uri>https://www.reddit.com/user/Mojah</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;I spent a few hours playing around with FrankenPHP on a fleet of servers that run as a microservice, their sole purpose was getting a request in, making external calls to 3rd party APIs/websites, and returning the result (the kind of microservice that should really be rewritten in something like Golang, but that&amp;#39;s for later).&lt;/p&gt; &lt;p&gt;I wanted to test if we could speed things up by moving from PHP-FPM to FrankenPHP, but after intensive testing, it isn&amp;#39;t worth it for us. I could&amp;#39;ve predicted this, but wanted to test it anyway :D &lt;/p&gt; &lt;p&gt;tl;dr: if you only spend &amp;lt; 1% of the PHP lifecycle bootstrapping the framework, and the other 99% waiting on external I/O (whether that&amp;#39;s database/cache/api), you&amp;#39;re not going to see the gains.&lt;/p&gt; &lt;p&gt;More details are up on my blog: &lt;a href=&quot;https://ma.ttias.be/laravel-octane-vs-php-fpm-lessons-learned/&quot;&gt;https://ma.ttias.be/laravel-octane-vs-php-fpm-lessons-learned/&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/Mojah&quot;&gt; /u/Mojah &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1uo3nj1/i_tried_frankenphp_on_our_externally_heavy_io/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1uo3nj1/i_tried_frankenphp_on_our_externally_heavy_io/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1uo3nj1</id><link href="https://www.reddit.com/r/PHP/comments/1uo3nj1/i_tried_frankenphp_on_our_externally_heavy_io/" /><updated>2026-07-05T14:31:06+00:00</updated><published>2026-07-05T14:31:06+00:00</published><title>I tried FrankenPHP on our (externally heavy I/O) workload and it wasn't worth it</title></entry><entry><author><name>/u/Grumpy-Man19</name><uri>https://www.reddit.com/user/Grumpy-Man19</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;PHP pushed maintenance releases for its two active development branches on July 1–2, 2026. PHP 8.5.8 and 8.4.23 are out. Neither is a major feature release, but they fix issues that can cause real harm to production servers. If you’re hosting PHP applications, patch now. &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://blog.kalfaoglu.net/posts/2026-07-05-php-8423-858-security-patches-en/&quot;&gt;https://blog.kalfaoglu.net/posts/2026-07-05-php-8423-858-security-patches-en/&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/Grumpy-Man19&quot;&gt; /u/Grumpy-Man19 &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1unz2iw/php_858_and_8423_are_out_important_fixes/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1unz2iw/php_858_and_8423_are_out_important_fixes/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1unz2iw</id><link href="https://www.reddit.com/r/PHP/comments/1unz2iw/php_858_and_8423_are_out_important_fixes/" /><updated>2026-07-05T10:46:39+00:00</updated><published>2026-07-05T10:46:39+00:00</published><title>PHP 8.5.8 and 8.4.23 are out - important fixes</title></entry><entry><author><name>/u/nicwortel</name><uri>https://www.reddit.com/user/nicwortel</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;This new guide explains how you can use GitHub&amp;#39;s Dependabot to keep your project&amp;#39;s Composer dependencies up-to-date.&lt;/p&gt; &lt;p&gt;Dependabot can create PRs to update your dependencies, both for routine version updates as well as for security updates (which patch a vulnerability).&lt;/p&gt; &lt;p&gt;Setting up Dependabot with a minimal configuration is not much work, but this article dives deeper in how you can optimize the configuration to keep the work of reviewing and merging the PRs manageable. It also goes into some specifics about handling Symfony version updates, Private Packagist (and other private Composer registries) and how Dependabot can help reduce the risk of supply-chain attacks.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://nth-root.nl/en/guides/keep-composer-dependencies-up-to-date-with-dependabot&quot;&gt;https://nth-root.nl/en/guides/keep-composer-dependencies-up-to-date-with-dependabot&lt;/a&gt;&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/nicwortel&quot;&gt; /u/nicwortel &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://nth-root.nl/en/guides/keep-composer-dependencies-up-to-date-with-dependabot&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1uos0zi/keep_composer_dependencies_uptodate_with/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1uos0zi</id><link href="https://www.reddit.com/r/PHP/comments/1uos0zi/keep_composer_dependencies_uptodate_with/" /><updated>2026-07-06T09:06:58+00:00</updated><published>2026-07-06T09:06:58+00:00</published><title>Keep Composer dependencies up-to-date with Dependabot</title></entry><entry><author><name>/u/MissionArea990</name><uri>https://www.reddit.com/user/MissionArea990</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;&lt;strong&gt;The problem&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Every time I spun up a Laravel project, I&amp;#39;d do the same dance: copy &lt;code&gt;phpstan.neon&lt;/code&gt; from the last repo, copy &lt;code&gt;pint.json&lt;/code&gt;, wire up Pest, set up a pre-commit hook, write a &lt;code&gt;CLAUDE.md&lt;/code&gt; full of engineering rules… and then drift would set in. Repo A was on PHPStan level 5, repo B on 7. One had architecture tests, the others didn&amp;#39;t. The &amp;quot;rules&amp;quot; lived in my head.&lt;/p&gt; &lt;p&gt;Then I started leaning on AI agents (Claude Code, Cursor, Copilot) and a new problem showed up: &lt;strong&gt;the agent would happily ignore the conventions.&lt;/strong&gt; It&amp;#39;d write untyped code, skip tests, invent patterns the rest of the repo didn&amp;#39;t use. A &lt;code&gt;CLAUDE.md&lt;/code&gt; full of rules helps, but rules a model &lt;em&gt;can choose to skip&lt;/em&gt; aren&amp;#39;t guardrails — they&amp;#39;re suggestions.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What I wanted&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;One command to set up a fresh Laravel repo with the &lt;em&gt;same&lt;/em&gt; guardrails every time.&lt;/li&gt; &lt;li&gt;A quality gate the agent literally &lt;strong&gt;cannot skip&lt;/strong&gt; — not just docs it might read.&lt;/li&gt; &lt;li&gt;&lt;p&gt;The same gate running everywhere: at commit time, at the end of every AI turn, and in CI. If it passes locally it passes in CI, no surprises.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What I ended up building&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;A small Composer dev package. You run:&lt;/p&gt; &lt;p&gt;```bash composer require --dev mohamed-ashraf-elsaed/claude-kit php artisan claude-kit:install&lt;/p&gt; &lt;p&gt;It detects your frontend stack (Inertia+Vue, Inertia+React, Blade/Livewire, or API-only), asks what you actually want (PHPStan? which level? strict-rules? Pest or PHPUnit? coverage threshold? arch tests? git hooks?), and scaffolds it — without clobbering existing files (composer.json / package.json get merged, not overwritten).&lt;/p&gt; &lt;p&gt;The part I care about most: the quality gate is one shell script (Pint + PHPStan level 7 + strict-rules + Pest with an 80% coverage gate + frontend lint) that backs three things — the git pre-commit hook, Claude Code&amp;#39;s Stop hook, and the CI workflow. So the AI agent&amp;#39;s turn doesn&amp;#39;t &amp;quot;finish&amp;quot; until the gate is green. Same script everywhere = no &amp;quot;works on my machine, red in CI.&amp;quot;&lt;/p&gt; &lt;p&gt;There&amp;#39;s also a hybrid update model: the machinery (the gate script, the hook) is referenced from vendor/, so a composer update propagates fixes to every project. The content you own (CLAUDE.md, linter configs, skills) is written into your repo so you can edit it freely.&lt;/p&gt; &lt;p&gt;It&amp;#39;s MIT, PHP 8.2–8.4, Laravel 11/12/13. Repo + docs: github.com/mohamed-ashraf-elsaed/claude-kit&lt;/p&gt; &lt;p&gt;The actual question I&amp;#39;m curious about: for those of you using AI agents on real codebases — how are you enforcing conventions? Just prompt/CLAUDE.md, hooks like this, CI-only, or something else? Genuinely want to hear what&amp;#39;s working, because the &amp;quot;agent skips the rules&amp;quot; problem feels underrated.&lt;/p&gt;&lt;/li&gt; &lt;/ul&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/MissionArea990&quot;&gt; /u/MissionArea990 &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://mohamed-ashraf-elsaed.github.io/claude-kit/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1uof5il/i_got_tired_of_copypasting_the_same/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1uof5il</id><link href="https://www.reddit.com/r/PHP/comments/1uof5il/i_got_tired_of_copypasting_the_same/" /><updated>2026-07-05T22:14:55+00:00</updated><published>2026-07-05T22:14:55+00:00</published><title>I got tired of copy-pasting the same PHPStan/Pint/Pest setup into every Laravel repo — and my AI agent kept ignoring the rules anyway. So I fixed both.</title></entry><entry><author><name>/u/OutrageousMeringue43</name><uri>https://www.reddit.com/user/OutrageousMeringue43</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;Working on legacy codebases, I kept running into the same thing: hundreds of&lt;/p&gt; &lt;p&gt;require_once statements that predate Composer, still sitting there years after&lt;/p&gt; &lt;p&gt;autoloading was set up. Deleting them by hand means answering &amp;quot;is this class&lt;/p&gt; &lt;p&gt;actually autoloadable?&amp;quot; for every single line — so nobody does it.&lt;/p&gt; &lt;p&gt;So I wrote depone: &lt;a href=&quot;https://github.com/lll-lll-lll-lll/depone&quot;&gt;https://github.com/lll-lll-lll-lll/depone&lt;/a&gt;&lt;/p&gt; &lt;p&gt;What it does:&lt;/p&gt; &lt;p&gt;- Tokenizes every PHP file and statically evaluates each require_once path&lt;/p&gt; &lt;p&gt;(concatenation, __DIR__, dirname(), define()&amp;#39;d constants)&lt;/p&gt; &lt;p&gt;- Checks the resolved target against your composer.json autoload config&lt;/p&gt; &lt;p&gt;(psr-4, psr-0, classmap, files, autoload-dev)&lt;/p&gt; &lt;p&gt;- Reports what&amp;#39;s redundant — and just as importantly, reports what it&lt;/p&gt; &lt;p&gt;*couldn&amp;#39;t* resolve and why, so nothing is silently skipped&lt;/p&gt; &lt;p&gt;- `--trace` shows reverse require-paths from entrypoints, for a final sanity&lt;/p&gt; &lt;p&gt;check before you delete anything&lt;/p&gt; &lt;p&gt;PHP 8.1+, MIT licensed, installable via Composer. It deliberately does one&lt;/p&gt; &lt;p&gt;thing only. Would love feedback, especially weird require_once patterns from&lt;/p&gt; &lt;p&gt;real legacy projects that break the evaluator.&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/OutrageousMeringue43&quot;&gt; /u/OutrageousMeringue43 &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1unb59g/i_built_a_static_analysis_tool_that_finds_require/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1unb59g/i_built_a_static_analysis_tool_that_finds_require/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1unb59g</id><link href="https://www.reddit.com/r/PHP/comments/1unb59g/i_built_a_static_analysis_tool_that_finds_require/" /><updated>2026-07-04T14:56:40+00:00</updated><published>2026-07-04T14:56:40+00:00</published><title>I built a static analysis tool that finds require_once statements your Composer autoloader already covers</title></entry><entry><author><name>/u/Typical_Ad_6436</name><uri>https://www.reddit.com/user/Typical_Ad_6436</uri></author><category term="PHP" label="r/PHP"/><content type="html">&amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/Typical_Ad_6436&quot;&gt; /u/Typical_Ad_6436 &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;/r/bun/comments/1uny9hq/ran_real_php_applications_as_typescript_on_bun/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1uny9xz/ran_real_php_applications_as_typescript_on_bun/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1uny9xz</id><link href="https://www.reddit.com/r/PHP/comments/1uny9xz/ran_real_php_applications_as_typescript_on_bun/" /><updated>2026-07-05T09:59:06+00:00</updated><published>2026-07-05T09:59:06+00:00</published><title>Ran real PHP applications as TypeScript on Bun 1.3.14; migration from Node was mostly a non-event</title></entry><entry><author><name>/u/peperazzi74</name><uri>https://www.reddit.com/user/peperazzi74</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;A couple of years ago I &lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1g3opyj/reviving_old_site_through_docker_base_image_is/&quot;&gt;posted &lt;/a&gt;about an &lt;a href=&quot;https://github.com/robhanssen/recept-docker&quot;&gt;old website &lt;/a&gt;that I coded in the early-mid 2000s and wanted to start up again via some ancient unmaintained Docker containers. The main conclusion of that thread was that it might be possible to resurrect it with some work, but that it would be better to just (hu)man up and update the code so it would run in modern PHP versions.&lt;/p&gt; &lt;p&gt;Well, a couple of days of vacation and a whole bunch of free Github Copilot tokens later, it&amp;#39;s up and running on the home network under PHP 8.2 and MySQL 8.0. According to Copilot, this was the furthest it could go with minor changes.&lt;/p&gt; &lt;p&gt;When I asked Copilot about how my code looked, it gave me the following opinion&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;The main gap is not PHP 8.2 compatibility anymore; it is that the app is still built like a 2000s-era script. [...] In short: the app needs a structural refactor, not just syntax updates.&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;Darn AI, no one asked for your honest opinion! /s&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/peperazzi74&quot;&gt; /u/peperazzi74 &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1ummelz/ai_insulted_my_ancient_php_code/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1ummelz/ai_insulted_my_ancient_php_code/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1ummelz</id><link href="https://www.reddit.com/r/PHP/comments/1ummelz/ai_insulted_my_ancient_php_code/" /><updated>2026-07-03T18:36:04+00:00</updated><published>2026-07-03T18:36:04+00:00</published><title>AI insulted my ancient PHP code 😁</title></entry><entry><author><name>/u/Ilia0001</name><uri>https://www.reddit.com/user/Ilia0001</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;A while back an RFC landed on internals to &lt;a href=&quot;https://discourse.thephp.foundation/t/php-dev-rfc-deprecate-metaphone-function/5391&quot;&gt;deprecate metaphone()&lt;/a&gt;. My first reaction was the reflex of an old release master: leave the legacy string functions alone, people depend on them, deprecation churn is its own tax. I was ready to argue against it.&lt;/p&gt; &lt;p&gt;Then I read the reasoning and looked at what phonetic name matching is supposed to do in 2026, and I changed my mind. metaphone() is the original 1990 algorithm: English-only, single-key, tuned for one accent of one language. It was superseded by Double Metaphone in 2000, which emits a primary and an alternate key. Core shipped the first version and never moved. soundex() is older still, a 1918 patent. For the one job these functions exist to do, collapsing names that sound alike but are spelled differently, they are the weakest tools in the drawer. The deprecation is defensible.&lt;/p&gt; &lt;p&gt;Where I part ways with the RFC is the replacement. It points at userland Composer libraries. But phonetic encoding is a hot inner-loop operation, run over every name in a dataset to build a match index. A pure-PHP implementation pays interpreter overhead on every character. The honest replacement for a native C string function is another native C string function. That performance gap is the whole reason this code lived in core to begin with.&lt;/p&gt; &lt;p&gt;So I built the thing the RFC should have recommended: &lt;a href=&quot;https://github.com/iliaal/phonetic&quot;&gt;iliaal/phonetic&lt;/a&gt;, a native extension with the five encoders core never had, plus a comparison helper per algorithm.&lt;/p&gt; &lt;p&gt;&lt;code&gt;php double_metaphone_match(&amp;quot;Catherine&amp;quot;, &amp;quot;Kathryn&amp;quot;); // 2 (primary keys agree) dm_soundex_match(&amp;quot;Moskowitz&amp;quot;, &amp;quot;Moskovitz&amp;quot;); // true (one surname, two transliterations) bmpm(&amp;quot;Garcia&amp;quot;, BMPM_SEPHARDIC, BMPM_EXACT); // &amp;quot;garsia|gartSa&amp;quot; &lt;/code&gt;&lt;/p&gt; &lt;p&gt;Double Metaphone is the fast general default. Beider-Morse (BMPM) is language-aware and matches across transliterations and scripts. Daitch-Mokotoff is the genealogy standard for Eastern-European and Ashkenazi surnames. NYSIIS and Match Rating are cheap English second keys. The helpers matter because each encoder answers &amp;quot;do these sound alike&amp;quot; differently (two keys, a code set, or a threshold), which is exactly where userland code quietly gets it wrong.&lt;/p&gt; &lt;p&gt;BMPM is slow, roughly 60x a Double Metaphone call, so you pick it for recall, not throughput. These are heuristic, culture-bound, Latin-script encoders, not a universal global-name solver.&lt;/p&gt; &lt;p&gt;One aside &lt;a href=&quot;/r/PHP&quot;&gt;r/PHP&lt;/a&gt; might appreciate: the BMPM rule data is a licensing trap. The canonical PHP reference and the abydos Python port are both GPL-3.0 because of that data. I vendored the identical tables from Apache Commons Codec under Apache-2.0 to keep the extension BSD/Apache-clean.&lt;/p&gt; &lt;p&gt;&lt;code&gt;sh pie install iliaal/phonetic &lt;/code&gt;&lt;/p&gt; &lt;p&gt;Repo: &lt;a href=&quot;https://github.com/iliaal/phonetic&quot;&gt;https://github.com/iliaal/phonetic&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Happy to answer questions, especially from anyone doing record linkage or dedup across messy person data.&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/Ilia0001&quot;&gt; /u/Ilia0001 &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1umec1h/i_set_out_to_argue_against_deprecating_phps/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1umec1h/i_set_out_to_argue_against_deprecating_phps/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1umec1h</id><link href="https://www.reddit.com/r/PHP/comments/1umec1h/i_set_out_to_argue_against_deprecating_phps/" /><updated>2026-07-03T13:21:13+00:00</updated><published>2026-07-03T13:21:13+00:00</published><title>I set out to argue against deprecating PHP's metaphone(). Then I read the RFC.</title></entry><entry><author><name>/u/PhPWellphant</name><uri>https://www.reddit.com/user/PhPWellphant</uri></author><category term="PHP" label="r/PHP"/><content type="html">&amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/PhPWellphant&quot;&gt; /u/PhPWellphant &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;/r/Wordpress/comments/1un8xdd/i_built_a_laravelinspired_framework_for/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1un8xnf/i_built_a_laravelinspired_framework_for/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1un8xnf</id><link href="https://www.reddit.com/r/PHP/comments/1un8xnf/i_built_a_laravelinspired_framework_for/" /><updated>2026-07-04T13:20:41+00:00</updated><published>2026-07-04T13:20:41+00:00</published><title>I built a Laravel-inspired framework for structuring WordPress plugins: Nikogin (open source)</title></entry><entry><author><name>/u/Omar_Ess</name><uri>https://www.reddit.com/user/Omar_Ess</uri></author><category term="PHP" label="r/PHP"/><content type="html">&amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/Omar_Ess&quot;&gt; /u/Omar_Ess &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://github.com/omaressaouaf/text-morph&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1umgdsn/i_built_a_small_php_package_for_reversible_text/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1umgdsn</id><link href="https://www.reddit.com/r/PHP/comments/1umgdsn/i_built_a_small_php_package_for_reversible_text/" /><updated>2026-07-03T14:44:31+00:00</updated><published>2026-07-03T14:44:31+00:00</published><title>I built a small PHP package for reversible text transformations</title></entry><entry><author><name>/u/thejoyofbeing1</name><uri>https://www.reddit.com/user/thejoyofbeing1</uri></author><category term="PHP" label="r/PHP"/><content type="html">&amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/thejoyofbeing1&quot;&gt; /u/thejoyofbeing1 &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://phpstorm.dev/light-mode&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1ulsbav/phpstorm_light_experimental_lightweight_build/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1ulsbav</id><link href="https://www.reddit.com/r/PHP/comments/1ulsbav/phpstorm_light_experimental_lightweight_build/" /><updated>2026-07-02T19:39:47+00:00</updated><published>2026-07-02T19:39:47+00:00</published><title>PhpStorm Light — experimental lightweight build</title></entry><entry><author><name>/u/iSerter</name><uri>https://www.reddit.com/user/iSerter</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;About four months ago, my release pipeline suddenly broke because the official repository for YakPro Obfuscator simply vanished.&lt;/p&gt; &lt;p&gt;I was looking for a simple, effective way to add a layer of protection to my suite of AI-driven WordPress plugins before distributing them. I didn&amp;#39;t want to rely on something like Ioncube because not every hosting provider supports the extension. &lt;/p&gt; &lt;p&gt;Since I couldn’t find a maintained alternative that reliably supported modern PHP syntax, I decided to build one.&lt;/p&gt; &lt;p&gt;I&amp;#39;ve been using it successfully in my own production pipelines for the last few months. It became pretty stable, so I wanted to announce it to the world. &lt;/p&gt; &lt;h1&gt;Features&lt;/h1&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Full Modern PHP Support:&lt;/strong&gt; Built on &lt;code&gt;nikic/php-parser&lt;/code&gt; v5.x, supporting named arguments, enums, match expressions, readonly properties, intersection types, and even PHP 8.5&amp;#39;s pipe operator and &lt;code&gt;(void)&lt;/code&gt; cast.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Deobfuscation Resistance:&lt;/strong&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Opaque Predicates:&lt;/strong&gt; Hard-to-analyze expressions in control flow flattening.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Dead Code Injection:&lt;/strong&gt; Branches that never execute but confuse static analysis.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Per-file XOR Encoding:&lt;/strong&gt; String literals are encoded using unique random keys.&lt;/li&gt; &lt;/ul&gt;&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Incremental Processing:&lt;/strong&gt; Only process changed files since the last run.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Multi-pass Analysis:&lt;/strong&gt; Scrambles symbols consistently across your entire project.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Clean Architecture:&lt;/strong&gt; Modern PSR-4 OOP codebase with 100% test coverage for core components.&lt;/li&gt; &lt;/ul&gt; &lt;h1&gt;Ready for CI/CD, not just local machines&lt;/h1&gt; &lt;p&gt;I included a ready-to-use GitHub Action, making it easy to integrate into your existing CI/CD pipeline. Every tagged release or production build can produce consistently obfuscated code without anyone remembering to run another command.&lt;/p&gt; &lt;p&gt;Add it to your release Github Action to obfuscate your code automatically:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;steps: - uses: iserter/php-obfuscator@v0.1.7 with: source: &amp;#39;src&amp;#39; output: &amp;#39;dist&amp;#39; &lt;/code&gt;&lt;/pre&gt; &lt;h1&gt;Available on Packagist/Composer too.&lt;/h1&gt; &lt;p&gt;&lt;strong&gt;Install:&lt;/strong&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;composer require iserter/php-obfuscator --dev &lt;/code&gt;&lt;/pre&gt; &lt;p&gt;&lt;strong&gt;Use:&lt;/strong&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;vendor/bin/obfuscate src/ -o dist/ &lt;/code&gt;&lt;/pre&gt; &lt;h1&gt;Or use via Docker&lt;/h1&gt; &lt;p&gt;If you’re a hygine freak for your host system, then here’s how you can use via Docker:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;docker run --rm -v $(pwd):/app iserter/php-obfuscator src/ -o out/ &lt;/code&gt;&lt;/pre&gt; &lt;h1&gt;See it on Github:&lt;/h1&gt; &lt;p&gt;Repository:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/iSerter/php-obfuscator?utm_source=chatgpt.com&quot;&gt;github.com/iSerter/php-obfuscator&lt;/a&gt;&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/iSerter&quot;&gt; /u/iSerter &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1un6wqt/i_built_a_modern_opensource_php_code_obfuscator/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1un6wqt/i_built_a_modern_opensource_php_code_obfuscator/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1un6wqt</id><link href="https://www.reddit.com/r/PHP/comments/1un6wqt/i_built_a_modern_opensource_php_code_obfuscator/" /><updated>2026-07-04T11:41:31+00:00</updated><published>2026-07-04T11:41:31+00:00</published><title>I built a modern, open-source PHP code obfuscator (YakPro alternative)</title></entry></feed>