<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Upgrade on Murat Useinov</title>
    <link>https://useinov.com/tags/upgrade/</link>
    <description>Recent content in Upgrade on Murat Useinov</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 19 Jan 2026 21:50:00 +0300</lastBuildDate>
    <atom:link href="https://useinov.com/tags/upgrade/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>PHP 8.5 one month later</title>
      <link>https://useinov.com/posts/2026/php-85-month-later/</link>
      <pubDate>Mon, 19 Jan 2026 21:50:00 +0300</pubDate>
      <guid>https://useinov.com/posts/2026/php-85-month-later/</guid>
      <description>&lt;p&gt;Last week of December, low traffic, good test suite. That is when we moved one project to PHP 8.5. Not brave, convenient. A month later I can sort the release into two piles.&lt;/p&gt;
&lt;p&gt;Pile one is the demo features. Every release has them. They look great in a tweet-sized example, then you search the codebase and find two places to use them. Fine. Not why you upgrade.&lt;/p&gt;
&lt;p&gt;Pile two is the boring changes. Less boilerplate in places you touch every day. Types that say what a function really returns. Small things that make PHPStan complain earlier instead of production complaining later. This pile is why you upgrade, and you only see it after some weeks, never in the release notes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>PHP 8.2: stricter by default</title>
      <link>https://useinov.com/posts/2022/php-eight-two/</link>
      <pubDate>Fri, 16 Dec 2022 21:35:00 +0300</pubDate>
      <guid>https://useinov.com/posts/2022/php-eight-two/</guid>
      <description>&lt;p&gt;PHP 8.2 was released on December 8. My checklist for it looks like every other December, which is the whole point of a yearly cadence.&lt;/p&gt;
&lt;p&gt;On the surface a quiet release. Readonly classes, DNF types, standalone &lt;code&gt;true&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt; and &lt;code&gt;null&lt;/code&gt; types, constants in traits. Underneath, the more important half: another round of cleaning old dynamic behavior. Dynamic properties deprecated, &lt;code&gt;${var}&lt;/code&gt; string interpolation deprecated, &lt;code&gt;utf8_encode&lt;/code&gt; deprecated. The language keeps trading looseness for predictability, and I keep voting for the trade.&lt;/p&gt;</description>
    </item>
    <item>
      <title>PHP 7.3 and the value of small releases</title>
      <link>https://useinov.com/posts/2018/php-73-small-steps/</link>
      <pubDate>Thu, 27 Dec 2018 15:35:00 +0300</pubDate>
      <guid>https://useinov.com/posts/2018/php-73-small-steps/</guid>
      <description>&lt;p&gt;A trailing comma after the last argument of a function call. PHP 7.3 came out at the start of the month, and this is the feature I noticed first, because I meet the missing comma in every second diff:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$this&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;logger&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;info&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s1&#34;&gt;&amp;#39;order created&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;order_id&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$order&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A tiny thing that kills a whole class of noisy diffs, the ones where adding an argument touches the previous line too. Arrays got this years ago. Calls only now.&lt;/p&gt;</description>
    </item>
    <item>
      <title>PHP 5.6: small syntax, big TLS surprise</title>
      <link>https://useinov.com/posts/2014/php-56-upgrade/</link>
      <pubDate>Fri, 05 Dec 2014 19:45:00 +0300</pubDate>
      <guid>https://useinov.com/posts/2014/php-56-upgrade/</guid>
      <description>&lt;p&gt;A nightly cron failed silently for two days. That was our PHP 5.6 upgrade.&lt;/p&gt;
&lt;p&gt;5.6 is out since the end of August, and we moved one production project this month. The syntax part is pleasant and minor. Variadics:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;log_all&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$level&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;...&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$messages&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Argument unpacking with &lt;code&gt;...$args&lt;/code&gt; on the call side. Constant expressions in defaults. &lt;code&gt;use function&lt;/code&gt; for importing functions. All nice. None of it changes your architecture. You will use variadics maybe twice a year and be happy both times.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
