Am 28.05.2025, 06:54:22 schrieb Daniel Scherzer <daniel.e.scher...@gmail.com >:
> On Tue, May 27, 2025 at 9:41 PM Ben Ramsey <ram...@php.net> wrote: > >> >> Last night, I identified a need for `#[Deprecated]` on a userland class >> in one of my libraries, but I had to settle on `@deprecated` for the widest >> range of compatibility. >> >> Has there been anymore thought on putting together an implementation for >> this? I’m happy to draft an RFC if someone is able to help with the >> implementation. I don’t understand the complexities around the >> implementation, but is this something that could make it into 8.5, provided >> an RFC vote passes? >> >> Cheers, >> Ben >> >> > > I'd be willing to work on the implementation, but what I'm wondering is > what exactly it would mean to deprecate a class. Without a clear idea of > the goal, I didn't include this in > https://news-web.php.net/php.internals/127305 even though I had > considered it. Would a deprecated class > > * Emit warnings when constructed? Just deprecate the constructor, > https://3v4l.org/DNrqm > * Emit warnings when used as a type? But we allow types to include classes > that don't exist (https://3v4l.org/pdkbv) so needing to look up the types > that are declared to emit warnings (rather than just when used to verify > that the type is respected) would presumably have a performance impact. > * Emit warnings when extended? I suggested that in my email a few weeks > ago, and when I have time I was going to look into that - I was thinking > something like `#[\WillBeFinal]` that would work for classes, methods, > properties, and constants, and would emit warnings just like > `#[\Deprecated]` but not when a method is called or a constant is used, > just when things are overridden > > What were you thinking in terms of desired semantics? > > —Daniel > Hi Daniel, Hi Ben, Tim and I ideated on this topic before, but we haven’t gotten further yet. I wanted to share my notes though, so that you have them as one idea. Its not more than a brain dump though: - Deprecated classes - mark the following elements deprecated: - constructor method (what if it doesnt have one?) - public static methods - public static properties - public constants - not public properties or methods, because the message is already generated on new DeprecatedClass - during generating the message see if its classed based and slightly change message to indicate its a class based deprecation