1

I have a PHP program,

<?php
class Zap {
}

class Zip {
    public Zap $zap;
}
$object = new Zip;

var_dump(
    $object->zap
);

This program produces an error because of an initialized non-nullable property.

Fatal error: Uncaught Error: Typed property Zip::$zap must not be accessed before initialization in

Can phpstan detect these sorts of errors? I've scanned this program at the highest level, and phpstan seems happy

% ./vendor/bin/phpstan analyse --level=8 /tmp/test.php
 1/1 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%


                                                                                                                        
 [OK] No errors                                                                                                         

If phpstan can't detect these situations, is there another PHP Static Analyzer that can?

Alana Storm
  • 164,128
  • 91
  • 395
  • 599

1 Answers1

3

It looks like the ability to scan for uninitialized property values was added in July of 2020

However, this feature is disabled by default. You'll need to be using a configuration file that sets the checkUninitializedProperties value

% cat phpstan.neon 
parameters:
    checkUninitializedProperties: true

and then tell `phpstan` to use this configuration file.

 % ./vendor/bin/phpstan analyse --level=8 --configuration=./phpstan.neon /tmp/test.php
 1/1 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%

 ------ ------------------------------------------------------------------------------------------------------ 
  Line   /tmp/test.php                                                                                         
 ------ ------------------------------------------------------------------------------------------------------ 
  6      Class Zip has an uninitialized property $zap. Give it default value or assign it in the constructor.  
 ------ ------------------------------------------------------------------------------------------------------ 

                                                                                                                
 [ERROR] Found 1 error                                                                                                  

Also, at the risk of saying the obvious part loud, this check assumes a particular style of programming. For example, the following valid PHP program

<?php
class Zap {
}

class Zip {
    public Zap $zap;
}
$object = new Zip;
$object->zap = new Zap;
var_dump(
    $object->zap
);

Still fails the checkUninitializedProperties check.

Alana Storm
  • 164,128
  • 91
  • 395
  • 599