{"record":{"id":"5f132b1dff792745","repo":"PHPOffice/PhpSpreadsheet","slug":"unknown-class-class","errorCode":null,"errorMessage":"Unknown class $class","messagePattern":"Unknown class \\$class","errorType":"exception","errorClass":"PhpOffice\\PhpSpreadsheet\\Writer\\Exception","httpStatus":null,"severity":"error","filePath":"src/PhpSpreadsheet/Writer/Xls/Parser.php","lineNumber":670,"sourceCode":"            [$cell1, $cell2] = explode(':', $range);\n        } else {\n            // TODO: use real error codes\n            throw new WriterException('Unknown range separator');\n        }\n        // Convert the cell references\n        [$row1, $col1] = $this->cellToPackedRowcol($cell1);\n        [$row2, $col2] = $this->cellToPackedRowcol($cell2);\n\n        // The ptg value depends on the class of the ptg.\n        if ($class == 0) {\n            $ptgArea = pack('C', $this->ptg['ptgArea']);\n        } elseif ($class == 1) {\n            $ptgArea = pack('C', $this->ptg['ptgAreaV']);\n        } elseif ($class == 2) {\n            $ptgArea = pack('C', $this->ptg['ptgAreaA']);\n        } else {\n            // TODO: use real error codes\n            throw new WriterException(\"Unknown class $class\");\n        }\n\n        return $ptgArea . $row1 . $row2 . $col1 . $col2;\n    }\n\n    /**\n     * Convert an Excel 3d range such as \"Sheet1!A1:D4\" or \"Sheet1:Sheet2!A1:D4\" to\n     * a ptgArea3d.\n     *\n     * @param string $token an Excel range in the Sheet1!A1:A2 format\n     *\n     * @return string the packed ptgArea3d token on success\n     */\n    private function convertRange3d(string $token): string\n    {\n        // Split the ref at the ! symbol\n        [$ext_ref, $range] = PhpspreadsheetWorksheet::extractSheetTitle($token, true, true);\n","sourceCodeStart":652,"sourceCodeEnd":688,"githubUrl":"https://github.com/PHPOffice/PhpSpreadsheet/blob/65b080eef4d9fd11a5796135ab145883e5c3d6a6/src/PhpSpreadsheet/Writer/Xls/Parser.php#L652-L688","documentation":"Internal invariant in convertRange2d(): the ptg 'class' selects ptgArea (0), ptgAreaV (1), or ptgAreaA (2); any other integer is impossible from the parser's own call sites, which pass only 0/1/2. This exception guards against future internal regressions rather than user input and is effectively unreachable through the public API.","triggerScenarios":"Not triggerable via documented API; only reachable if internal parser code or a subclass passes an out-of-range class value to convertRange2d().","commonSituations":"Virtually never encountered; if it appears, you are running a patched/forked PhpSpreadsheet or a corrupted installation where internal call arguments diverge from upstream.","solutions":["If using a fork or patched Parser, audit custom callers of convertRange2d()/convertRange3d() for the class argument - it must be 0, 1, or 2.","Reinstall/verify the pristine vendor package (composer install --classmap-authoritative) to rule out drift.","Report upstream if it reproduces on an unmodified release."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n    (new \\PhpOffice\\PhpSpreadsheet\\Writer\\Xls($spreadsheet))->save($path);\n} catch (\\PhpOffice\\PhpSpreadsheet\\Writer\\Exception $e) {\n    if (str_starts_with($e->getMessage(), 'Unknown class')) {\n        // internal invariant broken: vendor package likely patched/corrupted\n        throw new RuntimeException('PhpSpreadsheet install appears modified; run composer install', 0, $e);\n    }\n    throw $e;\n}","preventionTips":["Pin PhpSpreadsheet to an exact released version and let composer verify integrity (composer install).","Audit any fork/patch that touches Writer\\Xls\\Parser for convertRange2d()/convertRange3d() call arguments."],"tags":["xls","internal","invariant","parser","unreachable"],"backgroundTag":"internal-invariant-violation","analyzedSha":"65b080eef4d9fd11a5796135ab145883e5c3d6a6","analyzedAt":"2026-08-17T05:40:41.646Z","schemaVersion":2},"datasetVersion":"2026-08-17T09:17:11.063Z"}