On Fri, May 17, 2024 at 11:43 PM Luigi Cardamone
<cardamonelu...@gmail.com> wrote:
>
> Hello Internals,
> during last PHPDay in Verona I discussed this topic with some of
> you and it was suggested to me to send an email here.
>
> Here is an example to describe my problem. Imagine a simple
> DTO like this:
>
> class MyDTO{
>     public ?int $propA;
>     public ?int $propB;
> }
>
> Imagine that a Form processor or a generic mapper fill some of
> these fields with a null value:
>
> $dto = new MyDTO();
> $dto->propA = null;
>
> Sometimes we use DTOs to handle PATCH requests and not all
> the properties are mapped with a value. In a scenario like this,
> "null" is often a valid value.
>
> At this point, I need a way to find if a property was initialized or
> not but unfortunately "isset" is not a solution. When I write:
>
> echo isset($dto->propA) ? 'init' : 'not-init';
>
> I get "not-init" since isset returns true only if the variable is set
> and different from null.
>
> Full example: https://3v4l.org/4cCj0
>
> Is the language missing a clean way to check if a property is
> initialized or not? Is there any solution to this problem?
>
> The only alternative is using reflection but I need to pass the
> property name as a string losing static analysis.
> Proposing a new language syntax like
> "is_initialized($dto->propA)" can be an interesting solution?
>
> Thank you in advance.
>
> Luigi Cardamone
> Backend developer
> Italy

I wouldn't rely on checking initialized or not. Instead, use a sentinel value:

class NotSet {}

define("NotSet", new NotSet());

class MyAwesomeValue {
    public NotSet|null|string $aValue = NotSet;
}

This way, even programmers can "unset" a property by simply setting
$value->aValue = NotSet without having to rely on the weird PHP
semantics of unsetting a property. You can also use this to
declaratively encode which properties cannot be unset, without having
to define it in your mapping code.

Robert Landers
Software Engineer
Utrecht NL

Reply via email to