Skip to content

'Uninitialized' creates a lot of cluttering #10537

@flexjoly

Description

@flexjoly

Hi,
I hope I am allowed to write this here. I cannot make a real RFC or so. So I hope this is ok.

At last I have the opportunity to start using php8, I am very happy with it and how mature it has become; implementing all kinds of code quality.

But this new uninitialized state is really a pain.
When you set a property in a class, I consider it as set into the class; it is part of that class, that object.
Whether it is undefined or not. You could access it with an easy if or ternary operator.

And you got a clean overview of all your properties and how they are initialized.

class Test {

  protected string $name;

  protected string $type = 'mytype';

  protected ?array $arrLog;

  protected ?string $optionalVar;

  protected string $table = 'category';

 protected bool $isOk = false;
}

This looks clean and gives clear, easy insight to the purpose of each property.
But since php8, you have to use isset() or empty() to check whether a property is initialized.

Also php is offering more and more shorthand alternatives like nullsafe operator, ternary operator etc. Which I was not in favor of, but it seems to be the standard nowadays, so I let phpstorm do its thing and use the shorthands.

But when you start using the (very necessary!!!) typed properties this is not working anymore unless you 'initialize' the property with at least an empty or dummy value or null.
I read the RFC trying to understand.....

Maybe it is technically difficult or it is against high-standard rules (which I love!), but this is really unpractical and gives to much overhead and clutter.
I love good quality in coding, I endured years of being called crazy by colleagues who learned php by google and stackoverflow and loved it because it allowed all the bad coding. (Good is good enough)

But now it seems to go over the top, making php less practical.

For this uninitialized-thing we can choose one the following solutions at the moment:

  • leave properties untyped, which is really bad
  • set many properties to null or other empty values, which clutters your property list
  • add those empty values inside the constructor, which creates useless extra lines of code
  • use isset or empty to check if it is set or not, and not be able to use shorthands

To use typed properties and profit from all the new shorthands and nice new feature of php 8, my class has to be something like:

class Test {

  protected string $name = '';

  protected string $type = 'mytype';

  protected ?array $arrLog = [];

  protected ?string $optionalVar = null;

  protected string $table = 'category';

 protected bool $isOk = false;
}

This looks cluttered. And I do not understand that we get all those nice shorthands, but for typed properties, we need to type more....

Why does a nullable type not automaticly default to null, or even to the empty variant of the type (by giving it not an question-mark but the exclamation mark, maybe) like:

class Test {

  protected !string $name;  // defaults to ''

  protected string $type = 'mytype';

  protected !array $arrLog;  // defaults to []

  protected ?string $optionalVar;  // defaults to null

  protected string $table = 'category';

 protected !bool $isOk;  // defaults to false
 
 protected !float $someNumber;  // default to 0

 protected ?myObject $oObject;   // no default for objects... to complicated and risky, or not??, so only nullable
}

I hope this can be considered again.

Thanks in advance, flexJoly

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions