Php8.1/Phpstan Problems (#2649)
I made some changes to make our code ready when Phpstan is configured to run on Php8. These were regressed. I reinstalled. All was good for an hour or so till Dependabot pushed a version change for Phpstan. Checking that out, it runs clean on Php7, has 3 errors on Php8.0, and 100 errors on Php8.1. Although that number seems alarming, most of these were caused because Phpstan was reporting the same problem in a trait everywhere it was used, and a single change sufficed to eliminate most of those. The remainder, some of which caused run-time problems with Php8.1 on my system but which are not yet showing up on Github, are mostly the usual "null supplied where string expected". However, a new problem showed up - `float % 2` gets an "implicit conversion from float to int" warning (and Phpunit issues an extraordinarily long message when this happens). There was also a totally undocumented Php change where `array_combine` throws an exception in Php8 when it would have returned `false` as it does in Php7. These problems are all addressed with very minor changes in this PR.
This commit is contained in:
parent
ee1e56d8e7
commit
0d5d9eb0ff
|
|
@ -12,12 +12,15 @@ trait ArrayEnabled
|
|||
*/
|
||||
private static $arrayArgumentHelper;
|
||||
|
||||
private static function initialiseHelper(array $arguments): void
|
||||
/**
|
||||
* @param array|false $arguments Can be changed to array for Php8.1+
|
||||
*/
|
||||
private static function initialiseHelper($arguments): void
|
||||
{
|
||||
if (self::$arrayArgumentHelper === null) {
|
||||
self::$arrayArgumentHelper = new ArrayArgumentHelper();
|
||||
}
|
||||
self::$arrayArgumentHelper->initialise($arguments);
|
||||
self::$arrayArgumentHelper->initialise($arguments ?: []);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -70,6 +73,14 @@ trait ArrayEnabled
|
|||
return ArrayArgumentProcessor::processArguments(self::$arrayArgumentHelper, $method, ...$arguments);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $value
|
||||
*/
|
||||
private static function testFalse($value): bool
|
||||
{
|
||||
return $value === false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles array argument processing when the function accepts multiple arguments,
|
||||
* but only the last few (from start) can be an array arguments.
|
||||
|
|
@ -85,7 +96,7 @@ trait ArrayEnabled
|
|||
range($start, count($arguments) - $start),
|
||||
array_slice($arguments, $start)
|
||||
);
|
||||
if ($arrayArgumentsSubset === false) {
|
||||
if (self::testFalse($arrayArgumentsSubset)) {
|
||||
return ['#VALUE!'];
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -87,7 +87,7 @@ class Value
|
|||
return ExcelError::VALUE();
|
||||
}
|
||||
|
||||
return $value % 2 == 0;
|
||||
return ((int) fmod($value, 2)) === 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -112,7 +112,7 @@ class Value
|
|||
return ExcelError::VALUE();
|
||||
}
|
||||
|
||||
return abs($value) % 2 == 1;
|
||||
return ((int) fmod($value, 2)) !== 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -92,6 +92,7 @@ abstract class Coordinate
|
|||
}
|
||||
|
||||
// Create absolute coordinate
|
||||
$cellAddress = "$cellAddress";
|
||||
if (ctype_digit($cellAddress)) {
|
||||
return $worksheet . '$' . $cellAddress;
|
||||
} elseif (ctype_alpha($cellAddress)) {
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ class Dimension
|
|||
public function __construct(string $dimension)
|
||||
{
|
||||
[$size, $unit] = sscanf($dimension, '%[1234567890.]%s');
|
||||
$unit = strtolower(trim($unit));
|
||||
$unit = strtolower(trim($unit ?? ''));
|
||||
|
||||
// If a UoM is specified, then convert the size to pixels for internal storage
|
||||
if (isset(self::ABSOLUTE_UNITS[$unit])) {
|
||||
|
|
|
|||
|
|
@ -794,7 +794,7 @@ class Html
|
|||
$domText = preg_replace(
|
||||
'/\s+/u',
|
||||
' ',
|
||||
str_replace(["\r", "\n"], ' ', $textNode->nodeValue)
|
||||
str_replace(["\r", "\n"], ' ', $textNode->nodeValue ?: '')
|
||||
);
|
||||
$this->stringData .= $domText;
|
||||
$this->buildTextRun();
|
||||
|
|
|
|||
|
|
@ -619,7 +619,7 @@ class Html extends BaseReader
|
|||
{
|
||||
foreach ($element->childNodes as $child) {
|
||||
if ($child instanceof DOMText) {
|
||||
$domText = preg_replace('/\s+/u', ' ', trim($child->nodeValue));
|
||||
$domText = preg_replace('/\s+/u', ' ', trim($child->nodeValue ?: ''));
|
||||
if (is_string($cellContent)) {
|
||||
// simply append the text if the cell content is a plain text string
|
||||
$cellContent .= $domText;
|
||||
|
|
|
|||
|
|
@ -617,7 +617,7 @@ class Ods extends BaseReader
|
|||
foreach ($settings->getElementsByTagNameNS($configNs, 'config-item') as $t) {
|
||||
if ($t->getAttributeNs($configNs, 'name') === 'ActiveTable') {
|
||||
try {
|
||||
$spreadsheet->setActiveSheetIndexByName($t->nodeValue);
|
||||
$spreadsheet->setActiveSheetIndexByName($t->nodeValue ?: '');
|
||||
} catch (Throwable $e) {
|
||||
// do nothing
|
||||
}
|
||||
|
|
|
|||
|
|
@ -386,7 +386,7 @@ class AutoFilter
|
|||
/** @var string */
|
||||
$ruleOperator = $rule['operator'];
|
||||
/** @var string */
|
||||
$cellValueString = $cellValue;
|
||||
$cellValueString = $cellValue ?? '';
|
||||
$retVal = false;
|
||||
|
||||
if (is_numeric($ruleValue)) {
|
||||
|
|
|
|||
|
|
@ -1279,7 +1279,7 @@ class Worksheet extends WriterPart
|
|||
$objWriter,
|
||||
$this->getParentWriter()->getOffice2003Compatibility() === false,
|
||||
'v',
|
||||
($this->getParentWriter()->getPreCalculateFormulas() && !is_array($calculatedValue) && substr($calculatedValue, 0, 1) !== '#')
|
||||
($this->getParentWriter()->getPreCalculateFormulas() && !is_array($calculatedValue) && substr($calculatedValue ?? '', 0, 1) !== '#')
|
||||
? StringHelper::formatNumber($calculatedValue) : '0'
|
||||
);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue