Purpose of PHP constructors Purpose of PHP constructors php php

Purpose of PHP constructors


A constructor is a function that is executed after the object has been initialized (its memory allocated, instance properties copied etc.). Its purpose is to put the object in a valid state.

Frequently, an object, to be in an usable state, requires some data. The purpose of the constructor is to force this data to be given to the object at instantiation time and disallow any instances without such data.

Consider a simple class that encapsulates a string and has a method that returns the length of this string. One possible implementation would be:

class StringWrapper {    private $str;    public function setInnerString($str) {        $this->str = (string) $str;    }    public function getLength() {        if ($this->str === null)            throw new RuntimeException("Invalid state.");        return strlen($this->str);    }}

In order to be in a valid state, this function requires setInnerString to be called before getLength. By using a constructor, you can force all the instances to be in a good state when getLength is called:

class StringWrapper {    private $str;    public function __construct($str) {        $this->str = (string) $str;    }    public function getLength() {        return strlen($this->str);    }}

You could also keep the setInnerString to allow the string to be changed after instantiation.

A destructor is called when an object is about to be freed from memory. Typically, it contains cleanup code (e.g. closing of file descriptors the object is holding). They are rare in PHP because PHP cleans all the resources held by the script when the script execution ends.


Learn by example:

class Person {  public $name;  public $surname;  public function __construct($name,$surname){    $this->name=$name;    $this->surname=$surname;  }}

Why is this helpful? Because instead of:

$person = new Person();$person->name='Christian';$person->surname='Sciberras';

you can use:

$person = new Person('Christian','Sciberras');

Which is less code and looks cleaner!

Note: As the replies below correctly state, constructors/destructors are used for a wide variety of things, including: de/initialization of variables (especially when the the value is variable), memory de/allocation, invariants (could be surpassed) and cleaner code.I'd also like to note that "cleaner code" is not just "sugar" but enhances readability, maintainability etc.


The constructor is run at the time you instantiate an instance of your class. So if you have a class Person:

class Person {    public $name = 'Bob'; // this is initialization    public $age;    public function __construct($name = '') {        if (!empty($name)) {            $this->name = $name;        }    }    public function introduce() {        echo "I'm {$this->name} and I'm {$this->age} years old\n";    }    public function __destruct() {        echo "Bye for now\n";    }}

To demonstrate:

$person = new Person;$person->age = 20;$person->introduce();// I'm Bob and I'm 20 years old// Bye for now

We can override the default value set with initialization via the constructor argument:

$person = new Person('Fred');$person->age = 20;$person->introduce();// if there are no other references to $person and // unset($person) is called, the script ends // or exit() is called __destruct() runsunset($person);// I'm Fred and I'm 20 years old// Bye for now

Hopefully that helps demonstrate where the constructor and destructor are called, what are they useful for?

  1. __construct() can default class members with resources or more complex data structures.
  2. __destruct() can free resources like file and database handles.
  3. The constructor is often used for class composition or constructor injection of required dependencies.