Static Analysis

Компилятор Zephir предоставляет возможность статического анализа компилируемого кода. Идея этой функции заключается в том, чтобы помочь разработчику найти потенциальные проблемы и избежать неожиданного поведения задолго до времени исполнения.

Условные неинициализированные переменные

При присвоении значения переменно статический анализатор пытается определить, используется ли переменная до ее инициализации:

class Utils
{
    public function someMethod(b)
    {
        string a; char c;

        if b == 10 {
            let a = "привет";
        }

        // Есть вероятность, что переменная "a" не определена
        for c in a {
            echo c, PHP_EOL;
        }
    }
}

Приведенный выше пример иллюстрирует общую ситуацию. Переменной a будет присвоено значение только в том случае, если переменная b равна 10, но как видно из этого примера, значение проверяемой переменной не определено в явном виде. Компилятор Zephir определяет это, автоматически инициализирует переменную в пустую строку и генерирует предупреждение разработчику:

Warning: Variable 'a' was assigned for the first time in conditional branch,
consider initialize it in its declaration in
/home/scott/test/test/utils.zep on 21 [conditional-initialization]

    for c in a {

Finding such errors is sometimes tricky, however static analysis helps the programmer to find bugs in advance.

Удаление мёртвого кода

Zephir informs the developer about unreachable branches in the code and performs dead code elimination, which means it gets rid of all that code from the generated binary, since it cannot be executed anyway:

class Utils
{
    public function someMethod(b)
    {
        if false {
            // Этот код никогда не выполнится
            echo "hello";
        }
    }
}