FAQ
Here is a list of common questions along with their answer.
What des "phantm" mean?
phantm is an acronym of “PHp ANalzer for Type Mistakes”
Why phantm?
We believe that even if PHP puts close to no restrictions on types, it is still interesting to verify that they are handled correctly. It is easy to identify patterns of type errors that are directly caused by programming mistakes. We thus bring some of the advantages of statically typed languages to PHP.
I get lots of errors, does that mean my code is all wrong?
No. First of all, static analysis has its limitations. There will always be false positives given the semantics of PHP. However, you can help phantm do a better job, by precisely annotating your code. See Annotations for more details.
Also, you'll notice that by default phantm is quite picky about uninitialized values, or implicit type conversions.
For instance, on the code $a = "2"; echo $a / 2;, phantm will report that $a is not a valid operand for /. Even though those “errors” are not critical and PHP itself handles them gracefully in most cases, it is still considered “bad style” by phantm.
I get errors mentioning Top or Bottom, what are those types?
phantm represents types as so-called Lattice elements. In the type Lattice,
Top
represents the supertype of all types, and Bottom
represents the
subtype of all PHP types. In short, Top
means “Every possible types”
(including uninitialized values) and Bottom
means “No type”.
What is the difference between Top and Any ?
Any
represents types of defined values. However, the fact that a variable
is undefined is represented as a type as well, namely Uninitialized
. Any
does not include Uninitialized
, but Top
does.
I have code that uses references, but it's not analyzed properly by phantm, why?
References are currently ignored by phantm.
I get errors on my arrays, but the error itself is riddled with "..."s ?
phantm will try to reduce the size of errors as much as possible by limitting the string representation of types to the parts that are relevant for the type error.
What is the Numeric type ?
Numeric
is simply Float or Int
. Unlike PHP's is_numeric
, It does not
include numeric string literals.
I'm getting weird complicated types in my errors, with my unannotated code, why doesn't it say Any?
This is because phantm refines types used in expressions. For instance, given the code
function foo($b) { $a = $b / 2; // (1) $c = $b / 3; // (2) }
Before (1), $b
is Any
and thus issue an error since / expects two numeric
types. However, after (1), we can assume that $b
is Numeric
. This is
essential, as it dramatically reduces the number of errors! For instance, on
(2), no error is issued.
However, if $b
is later used where a String
is specifically required, you'll
get an error looking like: expected String, found Numeric
.
Can I ask phantm to focus on most interesting errors?
Yes! Usually, the option --quiet or even --shy will do a decent job on removing the least significant errors. Note however that it might potentially hide important notices.