On Mon, Mar 11, 2024, at 4:58 PM, Michał Marcin Brzuchalski wrote:
>> Hm, interesting. I'll have to check with Ilija on feasibility. My question
>> is, how would it eliminate it?
>>
>> Suppose we hypothetically have a "ReflectionPropertyWithHooks" reflection
>> object. It has those three extra methods on it. But that means
>> $rObject->getProperty() could return a ReflectionProperty or
>> ReflectionPropertyWithHooks, and you don't know which it is. You'd have to
>> do an instanceof check to know which type of property it is, and thus what
>> methods are available. That doesn't seem any less clumsy (nor more, to be
>> fair) than calling isVirtual().
>
> It is similar when you work with ReflectionType or ReflectionEnum, you
> always need to match against a certain type to ensure the code will
> behave predictably.
>
>> $rProp = $rObject->getProperty('foo', $obj);
>> $rProp->getValue(); // works always.
>>
>> if (!$rProp->isVirtual()) {
>> $rProp->getRawValue(); // Works, may or may not be the same return as
>> getValue()
>> }
>>
>> vs.
>>
>> if (!$rProp instanceof VirtualProperty) {
>> $rProp->getRawValue(); // Works.
>> }
>>
>> That doesn't seem to be an improvement. If you omit the conditional, you
>> still need a catch one way or the other. It just changes what gets thrown
>> (an Exception vs an Error). What type of hierarchy were you thinking of
>> that would help here?
>
> My thinking was like:
> 1. if the property has hooks, only then calling getRawValue,
> setRawValue, or isVirtual make sense,
> 2. if the property has no hooks and is static calling getRawValue, or
> setRawValue always throws because of "On a static property, this method
> will always throw an error."
> 3. if the property is "virtual", calling getRawValue, or setRawValue
> always throws an error,
> 4. if the property is not "virtual", calling getValue, or setValue is
> safe and never throws, otherwise it may throw under some conditions
> related to certain hook presence.
>
> In conclusion, I thought that the presence of hooks introduces 3 new
> methods but some will always be thrown because of incorrect usage.
> Normally, I'd model it with subtypes to completely avoid try-catch
> blocks for the cost of a simple instanceof check which I consider much
> cleaner for the reader than a bunch of try-catch blocks. Remember about
> static analysis, each of them when checked will propose to handle
> possible exceptions.
>
> But as wrote before, I don't know how to model it well.
Agreed, though I don't know how to model it either. :-) If someone can figure
out a way to do so before we go to a vote, we'll consider it.
--Larry Garfield