{"id":362221,"date":"2021-11-04T03:54:08","date_gmt":"2021-11-04T00:54:08","guid":{"rendered":"https:\/\/en.buradabiliyorum.com\/whats-new-in-phpstan-1-0-cloudsavvy-it\/"},"modified":"2021-11-04T03:54:08","modified_gmt":"2021-11-04T00:54:08","slug":"whats-new-in-phpstan-1-0-cloudsavvy-it","status":"publish","type":"post","link":"https:\/\/buradabiliyorum.com\/en\/whats-new-in-phpstan-1-0-cloudsavvy-it\/","title":{"rendered":"#What\u2019s New in PHPStan 1.0? \u2013 CloudSavvy IT"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_88 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-6ace8460948ce\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #dd3333;color:#dd3333\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #dd3333;color:#dd3333\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-6ace8460948ce\" checked aria-label=\"Toggle\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/buradabiliyorum.com\/en\/whats-new-in-phpstan-1-0-cloudsavvy-it\/#The_New_Level_9\" >The New Level 9<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/buradabiliyorum.com\/en\/whats-new-in-phpstan-1-0-cloudsavvy-it\/#Better_Awareness_In_Try-Catch-Finally_Blocks\" >Better Awareness In Try-Catch-Finally Blocks<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/buradabiliyorum.com\/en\/whats-new-in-phpstan-1-0-cloudsavvy-it\/#Unused_Code_Detection\" >Unused Code Detection<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/buradabiliyorum.com\/en\/whats-new-in-phpstan-1-0-cloudsavvy-it\/#Improvements_to_Remembered_Values\" >Improvements to Remembered Values<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/buradabiliyorum.com\/en\/whats-new-in-phpstan-1-0-cloudsavvy-it\/#Other_Rule_Improvements\" >Other Rule Improvements<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/buradabiliyorum.com\/en\/whats-new-in-phpstan-1-0-cloudsavvy-it\/#Performance_and_Stability\" >Performance and Stability<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/buradabiliyorum.com\/en\/whats-new-in-phpstan-1-0-cloudsavvy-it\/#Summary\" >Summary<\/a><\/li><\/ul><\/nav><\/div>\n<p><strong>&#8220;#What\u2019s New in PHPStan 1.0? \u2013 CloudSavvy IT&#8221;<\/strong><\/p>\n<div id=\"article-content-area\">\n<img loading=\"lazy\" decoding=\"async\" class=\"type:primaryImage aligncenter size-full wp-image-8891\" srcset=\"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2021\/01\/78f4c01e.jpg?width=398&amp;trim=1,1&amp;bg-color=000&amp;pad=1,1 400w, https:\/\/www.cloudsavvyit.com\/p\/uploads\/2021\/01\/78f4c01e.jpg?width=1198&amp;trim=1,1&amp;bg-color=000&amp;pad=1,1 1200w\" sizes=\"auto, 400w, 1200w\" src=\"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2021\/01\/78f4c01e.jpg?width=1198&amp;trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"PHPStan logo\" width=\"1600\" height=\"900\" onload=\"pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\" onerror=\"this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\"\/><\/p>\n<p>PHPStan gained a milestone release at the start of November 2021 with new features, extra rules, and many performance optimizations. It means the leading PHP static analyzer is now considered to be stable and comes with a <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/phpstan.org\/user-guide\/backward-compatibility-promise\">backwards compatibility promise<\/a> for future updates.<\/p>\n<p>As it\u2019s a major semver bump, PHPStan 1.0 also brings along some breaking changes which could affect your existing scans. These include extra rules and some replaced or removed config parameters.<\/p>\n<h2 id=\"the-new-level-9\"><span class=\"ez-toc-section\" id=\"The_New_Level_9\"><\/span>The New Level 9<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>PHPStan scans your PHP source to find potential issues without actually running the code. Alongside unit and end-to-end tests, this gives you visibility into the quality of your code by surfacing problems before users run into them.<\/p>\n<p>PHPStan levels are used to configure the analyzer\u2019s strictness. The v0.x release <a href=\"https:\/\/buradabiliyorum.com\/en\/category\/watch-movies-tv-seriess\/\" data-internallinksmanager029f6b8e52c=\"8\" title=\"Watch Movies &amp; TV Series\" target=\"_blank\" rel=\"noopener\">series<\/a> offered eight levels, with 0 the most relaxed and 8 the strictest. Although it\u2019s preferred to use the strictest level possible for the best coverage, less stringent levels can help you introduce PHPStan to an imperfect codebase.<\/p>\n<p>PHPStan 1.0 adds level 9 as a new option. It includes all the rules from level 8 and lower, as well as one extra check: strict <code>mixed<\/code> type comparisons.<\/p>\n<p>The <code>mixed<\/code> type arrived in PHP 8.0 as a way to explicitly typehint \u201cany\u201d value. As <code>mixed<\/code> is essentially equivalent to an untyped value, it\u2019s unsafe to make any assumptions about what a <code>mixed<\/code>-type value looks like.<\/p>\n<p>PHPStan\u2019s ninth level will strictly enforce this by reporting an error if you try to actively use a <code>mixed<\/code> value in your code. Accessing a property or calling a method isn\u2019t allowed as you can\u2019t know whether they\u2019ll exist. You can only pass values through other <code>mixed<\/code>-type typehints when this rule is active.<\/p>\n<p>To opt-in to the new behavior, you\u2019ll need to change <code>level: 8<\/code> to <code>level: 9<\/code> in your <code>phpstan.neon<\/code> config file. PHPStan also supports <code>level: max<\/code> as an alias for the highest level. If you\u2019re already using <code>max<\/code>, you\u2019ll automatically get level 9 when you upgrade to PHPStan 1.0.<\/p>\n<h2 id=\"better-awareness-around-try-catch-finally\"><span class=\"ez-toc-section\" id=\"Better_Awareness_In_Try-Catch-Finally_Blocks\"><\/span>Better Awareness In Try-Catch-Finally Blocks<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>PHPStan now has better type inference and variable awareness for try-catch-finally blocks. It\u2019ll use the <code>@throws<\/code> docblock tag to check the exception types thrown by each function in your codebase. This understanding is used to inform variable availability checks within try-catch blocks.<\/p>\n<p>Here\u2019s an example demonstrating why this matters:<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"php\">\n<pre class=\"de1\"><span class=\"co4\">\/**\n * @throws DemoException\n *\/<\/span>\n<span class=\"kw2\">function<\/span> first<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span> <span class=\"br0\">{<\/span>\n    <span class=\"kw1\">throw<\/span> DemoException<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n<span class=\"br0\">}<\/span>\n\u00a0\n<span class=\"co4\">\/**\n * @throws OtherException\n *\/<\/span>\n<span class=\"kw2\">function<\/span> second<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span> <span class=\"br0\">{<\/span>\n    <span class=\"kw1\">throw<\/span> OtherException<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n<span class=\"br0\">}<\/span>\n\u00a0\ntry <span class=\"br0\">{<\/span>\n    <span class=\"re0\">$first<\/span> <span class=\"sy0\">=<\/span> first<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n    <span class=\"re0\">$second<\/span> <span class=\"sy0\">=<\/span> second<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n<span class=\"br0\">}<\/span>\ncatch <span class=\"br0\">(<\/span>DemoException <span class=\"re0\">$ex<\/span><span class=\"br0\">)<\/span> <span class=\"br0\">{<\/span>\n    <span class=\"kw3\">error_log<\/span><span class=\"br0\">(<\/span><span class=\"re0\">$second<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n<span class=\"br0\">}<\/span>\ncatch <span class=\"br0\">(<\/span>Exception <span class=\"re0\">$ex<\/span><span class=\"br0\">)<\/span> <span class=\"br0\">{<\/span>\n    <span class=\"kw3\">error_log<\/span><span class=\"br0\">(<\/span><span class=\"st0\">\"<a href=\"https:\/\/buradabiliyorum.com\/en\/category\/general\/\" data-internallinksmanager029f6b8e52c=\"3\" title=\"General\" target=\"_blank\" rel=\"noopener\">General<\/a> exception\"<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n<span class=\"br0\">}<\/span><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>The first <code>catch<\/code> blog accesses <code>$second<\/code> but this won\u2019t exist when <code>DemoException<\/code> is caught. PHPStan v1.0 uses the <code>@throws<\/code> statement to realize this so you\u2019ll be informed when your <code>catch<\/code> blocks reference possibly undefined variables. Functions without <code>@throws<\/code> annotations will generally behave in the same way as before.<\/p>\n<p>As a result of this change, the optional <code>polluteCatchScopeWithTryAssignments<\/code> parameter has been removed. This used to let you access variables set in a <code>try<\/code> block within the following <code>catch<\/code>; it\u2019s no longer needed as PHPStan can now determine which variables are available.<\/p>\n<h2 id=\"unused-code-detection\"><span class=\"ez-toc-section\" id=\"Unused_Code_Detection\"><\/span>Unused Code Detection<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>PHPStan has got better at finding and reporting some forms of unused code in your project. It will highlight private class properties, methods, and constants which are never called or accessed.<\/p>\n<p>Their presence is almost always unintentional. If you do want to keep dead code around for longer, you could try commenting it out or adding the <code>@phpstan-ignore-next-line<\/code> comment to bypass the check.<\/p>\n<h2 id=\"improvements-to-remembered-values\"><span class=\"ez-toc-section\" id=\"Improvements_to_Remembered_Values\"><\/span>Improvements to Remembered Values<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>v1.0 enhances the consistency of PHPStan\u2019s memory for function return values. It\u2019s more adept at understanding when a function is called a second time, offering better anticipation of identical return values.<\/p>\n<p>This leads to improved dead code detection when a condition is repeated several times. PHPStan will warn when a block becomes redundant because execution is terminated by an earlier branch with the same condition:<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"php\">\n<pre class=\"de1\"><span class=\"kw1\">if<\/span> <span class=\"br0\">(<\/span><span class=\"re0\">$demo<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">isActive<\/span><span class=\"br0\">(<\/span><span class=\"br0\">)<\/span><span class=\"br0\">)<\/span> <span class=\"br0\">{<\/span>\n    <span class=\"kw1\">return<\/span><span class=\"sy0\">;<\/span>\n<span class=\"br0\">}<\/span>\n\u00a0\n<span class=\"kw1\">if<\/span> <span class=\"br0\">(<\/span><span class=\"re0\">$demo<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">isActive<\/span><span class=\"br0\">(<\/span><span class=\"br0\">)<\/span><span class=\"br0\">)<\/span> <span class=\"br0\">{<\/span>\n    recordDemoActivity<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n<span class=\"br0\">}<\/span><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>The second block will never run as the first always terminates. There is an assumption at play though: <code>isActive()<\/code> must always return the <em>same<\/em> value through the lifetime of <code>$demo<\/code>. In more concrete terms, <code>isActive()<\/code> needs to be a pure function where repeated inputs always produce identical output.<\/p>\n<p>PHPStan assumes functions are pure by default. In cases where they\u2019re not, you can add the <code>@phpstan-impure<\/code> annotation in a docblock above the function\u2019s definition. This will disable the return value memory for that function. You\u2019d need to use this in the above example if <code>isActive()<\/code> could return a different value to each call, meaning the first check could equate to <code>false<\/code> and allow the second branch to run.<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"php\">\n<pre class=\"de1\"><span class=\"co4\">\/** @phpstan-impure *\/<\/span>\n<span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> isActive<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span> <span class=\"sy0\">:<\/span> bool <span class=\"br0\">{<\/span>\n    <span class=\"kw1\">return<\/span> <span class=\"br0\">(<\/span><span class=\"kw3\">date<\/span><span class=\"br0\">(<\/span><span class=\"st0\">\"Y\"<\/span><span class=\"br0\">)<\/span> <span class=\"sy0\">===<\/span> <span class=\"st0\">\"2021\"<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n<span class=\"br0\">}<\/span><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h2 id=\"other-rule-improvements\"><span class=\"ez-toc-section\" id=\"Other_Rule_Improvements\"><\/span>Other Rule Improvements<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Several new rules have been added to the existing levels 1 to 6. These include checks for overriding <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/github.com\/phpstan\/phpstan-src\/commit\/89acb0db4400c95b231ae74830e8607d72824cbc\">constants<\/a> and <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/github.com\/phpstan\/phpstan\/issues\/4281\">properties<\/a>, trying to <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/github.com\/phpstan\/phpstan\/discussions\/5343\">extend<\/a> a <code>final<\/code> class, and detection of always-true and always-false <code>while<\/code> loop conditions.<\/p>\n<p>Types are now checked for missing typehints recursively. This means that PHPDoc definitions like <code>array&lt;array&gt;<\/code> won\u2019t be accepted as they lack an inner type definition. You\u2019ll need to typehint the expected values of the second-level array elements too, such as <code>array&lt;array&lt;string&gt;&gt;<\/code>.<\/p>\n<p>Besides checking source content, PHPStan 1.0 looks at the overall validity of <code>.php<\/code> files too. Level 0 gains a check for leading and trailing file whitespace and BOM, as misplaced characters before or after the <code>&lt;?php ... ?&gt;<\/code> tag pair can cause unexpected output at runtime.<\/p>\n<h2 id=\"performance-and-stability\"><span class=\"ez-toc-section\" id=\"Performance_and_Stability\"><\/span>Performance and Stability<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Performance has been improved in several areas by optimizing specific operations and resolving some memory leaks. These should contribute to faster and more reliable scans of larger codebases.<\/p>\n<p>As v1.0 is considered a formal stable release, it comes with an <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/phpstan.org\/user-guide\/backward-compatibility-promise\">assurance<\/a> that future minor releases (1.1, 1.2, 1.3, etc.) will be backwards compatible. While getting from v0.x to v1.0 may require some config tweaks, you\u2019ll have an easier migration path in the future.<\/p>\n<p>Developers of PHPStan extensions and custom rulesets also benefit from having a more stable codebase that\u2019s less likely to change. The developer documentation has been expanded too, including more accessible coverage of <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/phpstan.org\/developing-extensions\/rules\">custom rule creation<\/a>. It should be easier to get started when implementing your team\u2019s own rules into your PHPStan analysis.<\/p>\n<p>While this bodes well for future support, both users and extension developers face breaking changes in the move to v1.0. Several scan configuration parameters have been renamed or changed, with <code>bootstrap<\/code> becoming <code>bootstrapFiles<\/code> and <code>excludes_analyse<\/code> replaced with <code>excludePaths<\/code>.<\/p>\n<p>Internally the extensions API has been extensively revised so many classes and methods have been altered or removed. The full list of backwards incompatible changes is available in the <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/github.com\/phpstan\/phpstan\/releases\/tag\/1.0.0\">v1.0 changelog<\/a>.<\/p>\n<h2 id=\"summary\"><span class=\"ez-toc-section\" id=\"Summary\"><\/span>Summary<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>PHPStan v1.0 matures the project by optimizing performance, adding new rules, and addressing some detection irregularities. The evolution of PHPStan over the past several years has contributed towards the PHP community\u2019s broader shift to embrace typed language concepts. The addition of features such as typed properties and union types has produced a language that\u2019s capable of supporting advanced external inspection, as well as detailed internal introspection via reflection.<\/p>\n<p>The promotion to a semver stable release should help encourage further PHPStan adoption throughout the community. Migrating to the new version should be fairly pain-free for modern projects that are already using a strict PHPStan rule level.<\/p>\n<p>You can upgrade to PHPStan v1.0 today by running <code>composer require phpstan\/phpstan<\/code> in your projects. It\u2019s advisable to read through the <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/github.com\/phpstan\/phpstan\/releases\/tag\/1.0.0\">release notes<\/a> first to identify the breaking changes you need to address. The presence of extra rules in each existing level may cause your codebase to start failing tests even if it passed with PHPStan v0.x. You can disable the new rules temporarily by adding them to <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/phpstan.org\/user-guide\/baseline\">your baseline<\/a> so they\u2019re excluded from scan results.\n<\/div>\n<blockquote><p><strong><span style=\"color: #ff6600;\">If you liked the article, do not forget to share it with your friends. Follow us on\u00a0<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/news.google.com\/publications\/CAAqBwgKMLG0nwswvr63Aw\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Google News<\/a><\/span>\u00a0too, click on the star and choose us from your favorites.<\/span><\/strong><\/p><\/blockquote>\n<blockquote>\n<p style=\"text-align: center;\">For forums sites go to <span style=\"color: #ff9900;\"><a style=\"color: #ff9900;\" href=\"https:\/\/forum.buradabiliyorum.com\/\" target=\"_blank\" rel=\"noopener\">Forum.BuradaBiliyorum.Com<\/a><\/span><\/strong><\/p>\n<\/blockquote>\n<blockquote>\n<p style=\"text-align: center;\"><strong>If you want to read more like this article, you can visit our <span style=\"color: #ff9900;\"><a style=\"color: #ff9900;\" href=\"https:\/\/en.buradabiliyorum.com\/technology\/\" target=\"_blank\" rel=\"noopener\">Technology category.<\/a><\/span><\/strong><\/p>\n<\/blockquote>\n<p><span style=\"color: black;\"><a style=\"color: #ff9900;\" href=\"https:\/\/www.cloudsavvyit.com\/14669\/whats-new-in-phpstan-1-0\/\" target=\"_blank\" rel=\"noopener\">Source<\/a><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8220;#What\u2019s New in PHPStan 1.0? \u2013 CloudSavvy IT&#8221; PHPStan gained a milestone release at the start of November 2021 with new features, extra rules, and many performance optimizations. It means the leading PHP static analyzer is now considered to be stable and comes with a backwards compatibility promise for future updates. As it\u2019s a major&#8230;<\/p>\n","protected":false},"author":1,"featured_media":362222,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2021\/01\/78f4c01e.jpg","fifu_image_alt":"","footnotes":""},"categories":[18],"tags":[],"class_list":["post-362221","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technology"],"_links":{"self":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/posts\/362221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/comments?post=362221"}],"version-history":[{"count":0,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/posts\/362221\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/media\/362222"}],"wp:attachment":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/media?parent=362221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/categories?post=362221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/tags?post=362221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}