Кажется, что существует довольно много статических инструментов анализа кода для PHP, не могли бы вы предложить тот, который может обнаруживать исключения, которые выбрасываются в PHP-код, но никогда не пойманы? (те, которые теоретически могут остановить выполнение скрипта PHP).
Я был бы достаточно счастлив увидеть только такие вещи, как throw new SomeException()
, где SomeException
расширяет Exception
.
Я не ищу что-то слишком сложное – просто чтобы предупредить меня, что если я запустил someFunctionThatCanThrow
(потому что внутри есть инструкция throw
) из index.php
(вы получаете точку), я могу попасть в беду. Даже если во время выполнения это никогда не произойдет.
Благодарю.
Ответ на вопрос PHPLint . Например, он анализирует
<?php function some() { if (time() == 123) { throw new Exception("I can't happen"); } } some();
, который никогда не будет генерировать исключение (если вы не в прошлом), в:
BEGIN parsing of test-cSdHoW 1: <?php 2: 3: function some() 4: { 5: if (time() == 123) { 6: throw new Exception("I can't happen"); throw new Exception("I can't happen"); \_ HERE ==== 6: notice: here generating exception(s) Exception throw new Exception("I can't happen"); \_ HERE ==== 6: ERROR: exception(s) must be caught or declared to be thrown: Exception 7: } 8: } 9: 10: some(); ==== 3: notice: guessed signature of the function `some()' as void() some(); \_ HERE ==== 10: notice: here generating exception(s) Exception some(); \_ HERE ==== 10: Warning: uncaught exception(s): Exception END parsing of test-cSdHoW ==== ?: notice: unused package `dummy.php' ==== ?: notice: required module `standard' Overall test results: 1 errors, 1 warnings.
Именно это я и просил 🙂 Добавление docblock и перехват исключения приводит к тому, что больше не появляется никаких ошибок или предупреждений из PHPLint.
Что касается 2015 года, для PhpStorm существует инструмент SCA, доступный как плагин Php Inspections (EA Extended) – он выполняет этот вид анализа, включая вложенные вызовы. Кроме того, он учитывает контекст, например, в пределах __toString без исключения исключения, приводящие к смертельным, и плагин сообщает об этом.