{"id":27105,"date":"2016-12-11T16:42:15","date_gmt":"2016-12-11T14:42:15","guid":{"rendered":"https:\/\/mamchenkov.net\/wordpress\/?p=27105"},"modified":"2016-12-11T16:42:15","modified_gmt":"2016-12-11T14:42:15","slug":"php-static-analysis-tool-discover-bugs-in-your-code-without-running-it","status":"publish","type":"post","link":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/11\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\/","title":{"rendered":"PHP Static Analysis Tool &#8211; discover bugs in your code without running it!"},"content":{"rendered":"<!-- google_ad_section_start -->\n<p><a href=\"https:\/\/medium.com\/@ondrejmirtes\/phpstan-2939cd0ad0e3#.eth41axro\">Ond\u0159ej Mirtes<\/a> shares the idea behind the creation of\u00a0<a href=\"https:\/\/github.com\/phpstan\/phpstan\">PHPStan<\/a> &#8211; a static analysis tool for PHP:<\/p>\n<blockquote>\n<p id=\"62ae\" class=\"graf graf--p graf-after--h3\">Compiled languages need to know about the type of every variable, return type of every method etc. before the program runs. This is why the compiler needs to make sure that the program is \u201ccorrect\u201d and will happily point out to you these kinds of mistakes in the source code, like calling an undefined method or passing a wrong number of arguments to a function. The compiler acts as a first line of defense before you are able to deploy the application into production.<\/p>\n<p id=\"d7a7\" class=\"graf graf--p graf-after--p\">On the other hand, PHP is nothing like that. If you make a mistake, the program will crash when the line of code with the mistake is executed. When testing a PHP application, whether manually or automatically, developers spend a lot of their time discovering mistakes that wouldn\u2019t even compile in other languages, leaving less time for testing actual business logic.<\/p>\n<p id=\"8db5\" class=\"graf graf--p graf-after--p\">I\u2019d like to change that.<\/p>\n<\/blockquote>\n<p>This made sense to me, so I rushed to <a href=\"https:\/\/github.com\/phpstan\/phpstan\">the repository<\/a>. \u00a0I have quite a few projects to try this on. \u00a0I hurried so much that I didn&#8217;t pay attention to the important notes (aka <a href=\"https:\/\/github.com\/phpstan\/phpstan#prerequisities\">prerequisities<\/a>). \u00a0These are:<\/p>\n<blockquote><p>PHPStan requires PHP 7.0. You have to run it in environment with PHP 7 but the actual code does not have to use PHP 7 features. (Code written for PHP 5.6 and earlier can run on 7 mostly unmodified.)<\/p>\n<p>PHPStan works best with modern object-oriented code. The more strongly-typed your code is, the more information you give PHPStan to work with.<\/p>\n<p>Properly annotated and typehinted code (class properties, function and method arguments, return types) helps not only static analysis tools but also other people that work with the code to understand it.<\/p><\/blockquote>\n<p>Erm &#8230; if I had properly annotated and typehinted code, which is nicely organized into objects, I think, I wouldn&#8217;t need PHPStan as much as I need it now. \u00a0Anybody can analyze beautiful code. \u00a0Try figuring out what&#8217;s going on in a WordPress theme with 150 PHP files, split into classes, functions and chunks of unmaintainable code. \u00a0That&#8217;s where I wanted PHPStan to help me.<\/p>\n<p>But OK. \u00a0Let&#8217;s see what it can do. \u00a0Gladly, <a href=\"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/02\/migrating-to-php-7\/\">my laptop already runs PHP 7<\/a> &#8211; here is a good first use for it.<\/p>\n<p>Intstalling PHPStan with composer was easy. \u00a0All I had to do was resolve the\u00a0<a href=\"https:\/\/github.com\/nikic\/PHP-Parser\">nikic\/php-parser<\/a> dependency conflict between PHPStan and <a href=\"https:\/\/github.com\/FriendsOfPHP\/Sami\">Sami<\/a>, which is our source code documentation tool of choice (the newer version uses a much more recent version of the PHP Parser, so it wasn&#8217;t rocket science).<\/p>\n<p>Once installed, a simple &#8220;<em>vendor\/bin\/phpstan analyse .\/src<\/em>&#8221; command produced a report with a few issues. \u00a0Most of those were false positives, which can be fixed with a bit of PHPStan configuration. \u00a0But a few real problems that were found, were indeed bits that sneaked through our automated and manual testing. \u00a0For example:<\/p>\n<pre class=\"brush: plain; light: true; title: ; notranslate\" title=\"\">\r\n------ ---------------------------------\r\n Line   src\/Shell\/EmailShell.php\r\n------ ---------------------------------\r\n 37      Return typehint of method App\\Shell\\EmailShell::getOptionParser() has invalid type App\\Shell\\ConsoleOptionParser.\r\n------ ---------------------------------\r\n<\/pre>\n<p>I don&#8217;t think we&#8217;ll use PHPStan across all our code base just yet. \u00a0It&#8217;ll be too noisy for some projects. \u00a0And the PHP 7 requirement is not that easy to satisfy just yet. \u00a0But maybe sometime next year, once we finalize our move to PHP 7, I will integrate it into our automatic testing process.<\/p>\n<p>All in all, it&#8217;s quite a useful tool and much needed for larger code bases.<\/p>\n<!-- google_ad_section_end -->\n","protected":false},"excerpt":{"rendered":"<!-- google_ad_section_start -->\n<p>Ond\u0159ej Mirtes shares the idea behind the creation of\u00a0PHPStan &#8211; a static analysis tool for PHP: Compiled languages need to know about the type of every variable, return type of every method etc. before the program runs. This is why the compiler needs to make sure that the program is \u201ccorrect\u201d and will happily point &hellip; <a href=\"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/11\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">PHP Static Analysis Tool &#8211; discover bugs in your code without running it!<\/span><\/a><\/p>\n<!-- google_ad_section_end -->\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"PHP Static Analysis Tool - discover bugs in your code without running it! #PHP #WebDev #QA #testing","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false,"_links_to":"","_links_to_target":""},"categories":[1,18,62,1334],"tags":[38,3074,1108,1330],"keyring_services":[],"class_list":["post-27105","post","type-post","status-publish","format-standard","hentry","category-general","category-programming","category-technology","category-web-work","tag-php","tag-quality-assurance","tag-testing","tag-web-development"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.8 - aioseo.com -->\n\t<meta name=\"description\" content=\"Ond\u0159ej Mirtes shares the idea behind the creation of PHPStan - a static analysis tool for PHP: Compiled languages need to know about the type of every variable, return type of every method etc. before the program runs. This is why the compiler needs to make sure that the program is \u201ccorrect\u201d and will happily point\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Leonid Mamchenkov\"\/>\n\t<meta name=\"google-site-verification\" content=\"VHvdD0_usx1_4DzKy_QCVcICVgX2EgA2ybELT-wl7kQ\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/11\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.8\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Leonid Mamchenkov - Life, universe, and everything else\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"PHP Static Analysis Tool \u2013 discover bugs in your code without running it! - Leonid Mamchenkov\" \/>\n\t\t<meta property=\"og:description\" content=\"Ond\u0159ej Mirtes shares the idea behind the creation of PHPStan - a static analysis tool for PHP: Compiled languages need to know about the type of every variable, return type of every method etc. before the program runs. This is why the compiler needs to make sure that the program is \u201ccorrect\u201d and will happily point\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/11\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2026\/03\/leonid-sailing-beer.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2026\/03\/leonid-sailing-beer.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2016-12-11T14:42:15+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2016-12-11T14:42:15+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/MamchenkovBlog\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:site\" content=\"@mamchenkov\" \/>\n\t\t<meta name=\"twitter:title\" content=\"PHP Static Analysis Tool \u2013 discover bugs in your code without running it! - Leonid Mamchenkov\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Ond\u0159ej Mirtes shares the idea behind the creation of PHPStan - a static analysis tool for PHP: Compiled languages need to know about the type of every variable, return type of every method etc. before the program runs. This is why the compiler needs to make sure that the program is \u201ccorrect\u201d and will happily point\" \/>\n\t\t<meta name=\"twitter:creator\" content=\"@mamchenkov\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2026\/03\/leonid-sailing-beer.jpg\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2016\\\/12\\\/11\\\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\\\/#blogposting\",\"name\":\"PHP Static Analysis Tool \\u2013 discover bugs in your code without running it! - Leonid Mamchenkov\",\"headline\":\"PHP Static Analysis Tool &#8211; discover bugs in your code without running it!\",\"author\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/author\\\/leonid\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/#person\"},\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2016\\\/12\\\/11\\\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\\\/#articleImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3cf6df002a284d78fb6e9d8222ca4d102e0832035ed6bc8447008bd234e131a4?s=96&d=identicon&r=g\",\"width\":96,\"height\":96,\"caption\":\"Leonid Mamchenkov\"},\"datePublished\":\"2016-12-11T16:42:15+02:00\",\"dateModified\":\"2016-12-11T16:42:15+02:00\",\"inLanguage\":\"en-US\",\"commentCount\":4,\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2016\\\/12\\\/11\\\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2016\\\/12\\\/11\\\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\\\/#webpage\"},\"articleSection\":\"All, Programming, Technology, Web work, PHP, quality assurance, testing, web development\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2016\\\/12\\\/11\\\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/category\\\/technology\\\/#listItem\",\"name\":\"Technology\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/category\\\/technology\\\/#listItem\",\"position\":2,\"name\":\"Technology\",\"item\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/category\\\/technology\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/category\\\/technology\\\/programming\\\/#listItem\",\"name\":\"Programming\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/category\\\/technology\\\/programming\\\/#listItem\",\"position\":3,\"name\":\"Programming\",\"item\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/category\\\/technology\\\/programming\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2016\\\/12\\\/11\\\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\\\/#listItem\",\"name\":\"PHP Static Analysis Tool &#8211; discover bugs in your code without running it!\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/category\\\/technology\\\/#listItem\",\"name\":\"Technology\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2016\\\/12\\\/11\\\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\\\/#listItem\",\"position\":4,\"name\":\"PHP Static Analysis Tool &#8211; discover bugs in your code without running it!\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/category\\\/technology\\\/programming\\\/#listItem\",\"name\":\"Programming\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/#person\",\"name\":\"Leonid Mamchenkov\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2016\\\/12\\\/11\\\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\\\/#personImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3cf6df002a284d78fb6e9d8222ca4d102e0832035ed6bc8447008bd234e131a4?s=96&d=identicon&r=g\",\"width\":96,\"height\":96,\"caption\":\"Leonid Mamchenkov\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/author\\\/leonid\\\/#author\",\"url\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/author\\\/leonid\\\/\",\"name\":\"Leonid Mamchenkov\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2016\\\/12\\\/11\\\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3cf6df002a284d78fb6e9d8222ca4d102e0832035ed6bc8447008bd234e131a4?s=96&d=identicon&r=g\",\"width\":96,\"height\":96,\"caption\":\"Leonid Mamchenkov\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2016\\\/12\\\/11\\\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\\\/#webpage\",\"url\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2016\\\/12\\\/11\\\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\\\/\",\"name\":\"PHP Static Analysis Tool \\u2013 discover bugs in your code without running it! - Leonid Mamchenkov\",\"description\":\"Ond\\u0159ej Mirtes shares the idea behind the creation of PHPStan - a static analysis tool for PHP: Compiled languages need to know about the type of every variable, return type of every method etc. before the program runs. This is why the compiler needs to make sure that the program is \\u201ccorrect\\u201d and will happily point\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2016\\\/12\\\/11\\\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/author\\\/leonid\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/author\\\/leonid\\\/#author\"},\"datePublished\":\"2016-12-11T16:42:15+02:00\",\"dateModified\":\"2016-12-11T16:42:15+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/#website\",\"url\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/\",\"name\":\"Blog of Leonid Mamchenkov\",\"description\":\"Life, universe, and everything else\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/#person\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"PHP Static Analysis Tool \u2013 discover bugs in your code without running it! - Leonid Mamchenkov","description":"Ond\u0159ej Mirtes shares the idea behind the creation of PHPStan - a static analysis tool for PHP: Compiled languages need to know about the type of every variable, return type of every method etc. before the program runs. This is why the compiler needs to make sure that the program is \u201ccorrect\u201d and will happily point","canonical_url":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/11\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"google-site-verification":"VHvdD0_usx1_4DzKy_QCVcICVgX2EgA2ybELT-wl7kQ","miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/11\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\/#blogposting","name":"PHP Static Analysis Tool \u2013 discover bugs in your code without running it! - Leonid Mamchenkov","headline":"PHP Static Analysis Tool &#8211; discover bugs in your code without running it!","author":{"@id":"https:\/\/mamchenkov.net\/wordpress\/author\/leonid\/#author"},"publisher":{"@id":"https:\/\/mamchenkov.net\/wordpress\/#person"},"image":{"@type":"ImageObject","@id":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/11\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\/#articleImage","url":"https:\/\/secure.gravatar.com\/avatar\/3cf6df002a284d78fb6e9d8222ca4d102e0832035ed6bc8447008bd234e131a4?s=96&d=identicon&r=g","width":96,"height":96,"caption":"Leonid Mamchenkov"},"datePublished":"2016-12-11T16:42:15+02:00","dateModified":"2016-12-11T16:42:15+02:00","inLanguage":"en-US","commentCount":4,"mainEntityOfPage":{"@id":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/11\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\/#webpage"},"isPartOf":{"@id":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/11\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\/#webpage"},"articleSection":"All, Programming, Technology, Web work, PHP, quality assurance, testing, web development"},{"@type":"BreadcrumbList","@id":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/11\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress#listItem","position":1,"name":"Home","item":"https:\/\/mamchenkov.net\/wordpress","nextItem":{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/#listItem","name":"Technology"}},{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/#listItem","position":2,"name":"Technology","item":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/programming\/#listItem","name":"Programming"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/programming\/#listItem","position":3,"name":"Programming","item":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/programming\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/11\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\/#listItem","name":"PHP Static Analysis Tool &#8211; discover bugs in your code without running it!"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/#listItem","name":"Technology"}},{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/11\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\/#listItem","position":4,"name":"PHP Static Analysis Tool &#8211; discover bugs in your code without running it!","previousItem":{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/programming\/#listItem","name":"Programming"}}]},{"@type":"Person","@id":"https:\/\/mamchenkov.net\/wordpress\/#person","name":"Leonid Mamchenkov","image":{"@type":"ImageObject","@id":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/11\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\/#personImage","url":"https:\/\/secure.gravatar.com\/avatar\/3cf6df002a284d78fb6e9d8222ca4d102e0832035ed6bc8447008bd234e131a4?s=96&d=identicon&r=g","width":96,"height":96,"caption":"Leonid Mamchenkov"}},{"@type":"Person","@id":"https:\/\/mamchenkov.net\/wordpress\/author\/leonid\/#author","url":"https:\/\/mamchenkov.net\/wordpress\/author\/leonid\/","name":"Leonid Mamchenkov","image":{"@type":"ImageObject","@id":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/11\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/3cf6df002a284d78fb6e9d8222ca4d102e0832035ed6bc8447008bd234e131a4?s=96&d=identicon&r=g","width":96,"height":96,"caption":"Leonid Mamchenkov"}},{"@type":"WebPage","@id":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/11\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\/#webpage","url":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/11\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\/","name":"PHP Static Analysis Tool \u2013 discover bugs in your code without running it! - Leonid Mamchenkov","description":"Ond\u0159ej Mirtes shares the idea behind the creation of PHPStan - a static analysis tool for PHP: Compiled languages need to know about the type of every variable, return type of every method etc. before the program runs. This is why the compiler needs to make sure that the program is \u201ccorrect\u201d and will happily point","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/mamchenkov.net\/wordpress\/#website"},"breadcrumb":{"@id":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/11\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\/#breadcrumblist"},"author":{"@id":"https:\/\/mamchenkov.net\/wordpress\/author\/leonid\/#author"},"creator":{"@id":"https:\/\/mamchenkov.net\/wordpress\/author\/leonid\/#author"},"datePublished":"2016-12-11T16:42:15+02:00","dateModified":"2016-12-11T16:42:15+02:00"},{"@type":"WebSite","@id":"https:\/\/mamchenkov.net\/wordpress\/#website","url":"https:\/\/mamchenkov.net\/wordpress\/","name":"Blog of Leonid Mamchenkov","description":"Life, universe, and everything else","inLanguage":"en-US","publisher":{"@id":"https:\/\/mamchenkov.net\/wordpress\/#person"}}]},"og:locale":"en_US","og:site_name":"Leonid Mamchenkov - Life, universe, and everything else","og:type":"article","og:title":"PHP Static Analysis Tool \u2013 discover bugs in your code without running it! - Leonid Mamchenkov","og:description":"Ond\u0159ej Mirtes shares the idea behind the creation of PHPStan - a static analysis tool for PHP: Compiled languages need to know about the type of every variable, return type of every method etc. before the program runs. This is why the compiler needs to make sure that the program is \u201ccorrect\u201d and will happily point","og:url":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/11\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\/","og:image":"https:\/\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2026\/03\/leonid-sailing-beer.jpg","og:image:secure_url":"https:\/\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2026\/03\/leonid-sailing-beer.jpg","og:image:width":1024,"og:image:height":1024,"article:published_time":"2016-12-11T14:42:15+00:00","article:modified_time":"2016-12-11T14:42:15+00:00","article:publisher":"https:\/\/www.facebook.com\/MamchenkovBlog","twitter:card":"summary_large_image","twitter:site":"@mamchenkov","twitter:title":"PHP Static Analysis Tool \u2013 discover bugs in your code without running it! - Leonid Mamchenkov","twitter:description":"Ond\u0159ej Mirtes shares the idea behind the creation of PHPStan - a static analysis tool for PHP: Compiled languages need to know about the type of every variable, return type of every method etc. before the program runs. This is why the compiler needs to make sure that the program is \u201ccorrect\u201d and will happily point","twitter:creator":"@mamchenkov","twitter:image":"https:\/\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2026\/03\/leonid-sailing-beer.jpg"},"aioseo_meta_data":{"post_id":"27105","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"BlogPosting","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2023-07-19 12:07:09","updated":"2026-01-15 12:31:45","seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/mamchenkov.net\/wordpress\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/\" title=\"Technology\">Technology<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/programming\/\" title=\"Programming\">Programming<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tPHP Static Analysis Tool \u2013 discover bugs in your code without running it!\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/mamchenkov.net\/wordpress"},{"label":"Technology","link":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/"},{"label":"Programming","link":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/programming\/"},{"label":"PHP Static Analysis Tool &#8211; discover bugs in your code without running it!","link":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/11\/php-static-analysis-tool-discover-bugs-in-your-code-without-running-it\/"}],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":28567,"url":"https:\/\/mamchenkov.net\/wordpress\/2018\/05\/09\/phpmetrics-static-analysis-tool-for-php\/","url_meta":{"origin":27105,"position":0},"title":"PhpMetrics &#8211; static analysis tool for PHP","author":"Leonid Mamchenkov","date":"May 9, 2018","format":false,"excerpt":"PhpMetrics is yet another tool in the ever growing list of the static code analyzers for PHP.\u00a0 Compared to the rest, I think this one is the easiest to install and run.\u00a0 And it produces the most eye candy reports ever.\u00a0 The generated report is in the HTML format, with\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2018\/05\/phpmetrics-500x253.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":28452,"url":"https:\/\/mamchenkov.net\/wordpress\/2018\/03\/26\/kitab-documentation-rendering-and-testing-tool-for-php\/","url_meta":{"origin":27105,"position":1},"title":"Kitab &#8211; documentation rendering and testing tool for PHP","author":"Leonid Mamchenkov","date":"March 26, 2018","format":false,"excerpt":"Kitab is a handy tool for PHP developers that helps with two things: Render static HTML (with added search) from the doc-blocks in source code. Unit test the examples that are in the doc-blocks. There are a number of tools that do the first one (phpDocumentor, Doxygen, Sami, etc).\u00a0 However\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":28559,"url":"https:\/\/mamchenkov.net\/wordpress\/2018\/05\/08\/composer-plugin-qa-composer-plugin-for-php-quality-assurance-tools\/","url_meta":{"origin":27105,"position":2},"title":"composer-plugin-qa &#8211; Composer Plugin for PHP Quality Assurance Tools","author":"Leonid Mamchenkov","date":"May 8, 2018","format":false,"excerpt":"composer-plugin-qa is a Composer plugin which adds all the most popular PHP quality assurance tools as composer scripts, so that you don't have to install and set them up one by one.\u00a0 The list of tools includes the following: PHPUnit: Testing Framework PHPCOV: CLI frontend for the\u00a0PHP_CodeCoverage Paratest: Parallel testing\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2018\/05\/composer-plugin-qa-500x296.jpeg?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":27641,"url":"https:\/\/mamchenkov.net\/wordpress\/2017\/05\/29\/php-smart-analyzer\/","url_meta":{"origin":27105,"position":3},"title":"PHP Smart Analyzer","author":"Leonid Mamchenkov","date":"May 29, 2017","format":false,"excerpt":"PHP Smart Analyzer (or PHPSA for short) is yet another item in a growing list of tools for PHP code static analysis. \u00a0It's in an early alpha state, but looking at the list of goals, it's quite promising. If that's up your valley, have a look also at PHPQA and\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2017\/05\/php-smart-analyzer-500x129.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":27245,"url":"https:\/\/mamchenkov.net\/wordpress\/2017\/01\/16\/phpmetrics-a-static-analysis-tool-for-php\/","url_meta":{"origin":27105,"position":4},"title":"PhpMetrics &#8211; a static analysis tool for PHP","author":"Leonid Mamchenkov","date":"January 16, 2017","format":false,"excerpt":"PHPMetrics is yet another tool for static analysis of your PHP codebase. \u00a0It aims to provide a simpler and easier to understand report, than all those other tools in the PHP ecosystem today.","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2017\/01\/animated-demo-annoted-500x329.gif?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":18611,"url":"https:\/\/mamchenkov.net\/wordpress\/2013\/09\/17\/php-self-vs-static\/","url_meta":{"origin":27105,"position":5},"title":"PHP: self:: vs. static::","author":"Leonid Mamchenkov","date":"September 17, 2013","format":false,"excerpt":"I am seeing more and more PHP code with static:: key used for method calls instead of self::. \u00a0Today I've finally found some time to examine the novelty. \u00a0The page that is useful for more details is PHP's late static binding. \u00a0This functionality is available since PHP 5.3.0 so you\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_sharing_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/posts\/27105","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/comments?post=27105"}],"version-history":[{"count":0,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/posts\/27105\/revisions"}],"wp:attachment":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/media?parent=27105"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/categories?post=27105"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/tags?post=27105"},{"taxonomy":"keyring_services","embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/keyring_services?post=27105"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}