Am 28.05.2025, 06:54:22 schrieb Daniel Scherzer <daniel.e.scherzer@gmail.com
:
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,
BenI'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 overriddenWhat 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
- mark the following elements deprecated: