Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Initializing properties in PHP

Tags:

php

While I'm led to believe its likely just a design choice, is there any advantage to initializing properties in PHP to an explicit null?

As a force of habit I find myself doing:

// ...
protected $_foo = null;
protected $_bar = null;
protected $_baz = null;
// ...

Of course, under circumstances where actual data is intended to be present at object instantiation, there is purpose:

// ...
protected $_array = array('a', 'b', 'c');
protected $_boolean = true;
// ...

Is omission of a null initialization value completely functionally equivalent to inclusion of a null initialization? Are there any other caveats? Also, unless a property is type-checked before any assignments would be made, initialization to an empty array seems like similar situation (and I find myself doing that constantly)

like image 528
Dan Lugg Avatar asked Aug 09 '11 19:08

Dan Lugg


4 Answers

PHP 7.4 introduced a new feature called "typed properties" which adds the existing PHP type system to class properties. This means that you can now enforce which types a property has without having to encapsulate it in an object.

Typed properties are a very useful feature, however, typed properties without a default value have a new state: uninitialized. And if they're accessed before being initialised, you'll run into a Typed property must not be accessed before initialization error.

So the correct answer to OPs question if you're using PHP 7.4+ is yes, it does matter whether or not you explicitly initialise your class variables and the following two lines are not equivalent any more:

protected int $_foo = null;
protected int $_foo; // The default value in PHP 7.4+ is now uninitialized, not NULL

Further reading (no relation): https://madewithlove.com/typed-property-must-not-be-accessed-before-initialization/

like image 126
dearsina Avatar answered Sep 29 '22 16:09

dearsina


Yes,

protected $_foo = null;
protected $_foo;

are completely equivalents.
As for me great choise is

  • initialize clearly by null, if it will null by default
  • don't initialize, if it will be overriden in constructor

It helps you to see default values quickly, helps code be self-documenting

Don't initialize array by array() seems to be bad idea because you can't use some function (ex. array_push, array_map)

like image 28
RiaD Avatar answered Sep 29 '22 15:09

RiaD


is omission of a null initialization value completely functionally equivalent to inclusion of a null initialization?

yes

initialization to an empty array seems like similar situation

no. You can try foreach ($this->arr) (or something else) and that variable should be initialized with array to avoid notice.

like image 36
OZ_ Avatar answered Sep 29 '22 16:09

OZ_


Properties are implicitly initialized to NULL, there is no advantage to do this explicitly.

like image 30
Arnaud Le Blanc Avatar answered Sep 29 '22 15:09

Arnaud Le Blanc