{"record":{"id":"96268828b2d7914a","repo":"briannesbitt/Carbon","slug":"dateclass","errorCode":null,"errorMessage":"$dateClass","messagePattern":"\\$dateClass","errorType":"exception","errorClass":"NotACarbonClassException","httpStatus":null,"severity":"error","filePath":"src/Carbon/CarbonPeriod.php","lineNumber":944,"sourceCode":"     *\n     * @return static\n     */\n    public function clone()\n    {\n        return clone $this;\n    }\n\n    /**\n     * Set the iteration item class.\n     *\n     * @param string $dateClass\n     *\n     * @return static\n     */\n    public function setDateClass(string $dateClass)\n    {\n        if (!is_a($dateClass, CarbonInterface::class, true)) {\n            throw new NotACarbonClassException($dateClass);\n        }\n\n        $self = $this->copyIfImmutable();\n        $self->dateClass = $dateClass;\n\n        if (is_a($dateClass, Carbon::class, true)) {\n            $self->options = $self->options & ~static::IMMUTABLE;\n        } elseif (is_a($dateClass, CarbonImmutable::class, true)) {\n            $self->options = $self->options | static::IMMUTABLE;\n        }\n\n        return $self;\n    }\n\n    /**\n     * Returns iteration item date class.\n     *\n     * @return string","sourceCodeStart":926,"sourceCodeEnd":962,"githubUrl":"https://github.com/briannesbitt/Carbon/blob/b13f05955dcfd7da71d60af745fd148cbdb73505/src/Carbon/CarbonPeriod.php#L926-L962","documentation":"setDateClass() changes the class of dates the period yields (Carbon vs CarbonImmutable or your subclass). The target must be a class-string implementing CarbonInterface, verified with is_a($dateClass, CarbonInterface::class, true); native DateTime/DateTimeImmutable, non-Carbon classes and typos throw NotACarbonClassException with the given name (src/Carbon/CarbonPeriod.php:944).","triggerScenarios":"$period->setDateClass(DateTimeImmutable::class); ->setDateClass('App\\\\Value\\\\MyDate') where MyDate neither extends Carbon/CarbonImmutable nor implements CarbonInterface; passing an object instance instead of a class-string.","commonSituations":"Trying to make a period yield native PHP date objects; introducing custom date value objects that wrap instead of extend Carbon; IDE autocomplete inserting the wrong class name.","solutions":["Pass Carbon::class or CarbonImmutable::class (or a subclass of either)","Make custom classes extend Carbon/CarbonImmutable or implement CarbonInterface","If you want native objects as output, use $period->cast(DateTimeImmutable::class) or ->toDatePeriod() instead of setDateClass()"],"exampleFix":"// before\n$period->setDateClass(\\DateTimeImmutable::class); // NotACarbonClassException\n\n// after\n$period->setDateClass(\\Carbon\\CarbonImmutable::class);\n// or, for native objects at iteration time\nforeach ($period->cast(\\DatePeriod::class) as $date) { /* $date is DateTimeInterface */ }","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"/** @param class-string $dateClass */\nfunction isCarbonDateClass(string $dateClass): bool\n{\n    return is_a($dateClass, \\Carbon\\CarbonInterface::class, true);\n}\n\n$period->setDateClass(isCarbonDateClass($class) ? $class : \\Carbon\\CarbonImmutable::class);","tryCatchPattern":null,"preventionTips":["Only pass Carbon::class, CarbonImmutable::class or your own subclasses as date class","For native DateTime output use cast()/toDatePeriod(), not setDateClass()","Static-analyze with PHPStan/PSalm so non-class-strings are caught before runtime"],"tags":["carbon","carbon-period","class-validation","date-class"],"backgroundTag":"invalid-class-type","analyzedSha":"b13f05955dcfd7da71d60af745fd148cbdb73505","analyzedAt":"2026-08-17T04:40:56.953Z","schemaVersion":2},"datasetVersion":"2026-08-17T09:17:11.063Z"}