Coverage of a line is not coverage of a branch

Line coverage counts whether a line executed, and a line with two outcomes is fully covered by exercising one of them.

<coverage>
  <report>
    <html outputDirectory="build/coverage"/>
    <text outputFile="php://stdout" showOnlySummary="true"/>
  </report>
</coverage>

# and the flag that reports the useful number
$ phpunit --coverage-text --path-coverage
#   Lines:   94.20%
#   Branches: 71.40%      ← the one that means something
#   Paths:    52.10%

Path coverage requires Xdebug rather than PCOV and is considerably slower, which is why it belongs on a nightly run rather than every push. The gap between line and branch coverage is a useful single number: a large one means the tests execute the code without exploring it, which is the condition mutation testing measures more precisely.