Skip to main content

Constructors and Destructors

Constructors are one of the most important concepts in Object Oriented Programming.

Almost every framework heavily relies on constructors.

Examples:

  • PocketMine-MP
  • Laravel
  • Symfony
  • APIs
  • Dependency Injection Containers
  • Enterprise Applications

What is a Constructor?

A constructor is a special method that automatically runs when an object is created.

Example:

$player =
new Player();

Immediately after:

new Player()

PHP automatically executes:

__construct()

Constructor Lifecycle

new Player()
↓
Memory Allocated
↓
__construct()
↓
Object Ready

Constructor Syntax

class Player {

public function __construct() {

echo "Player Created";

}

}

Example

$player =
new Player();

Output:

Player Created

Why Constructors Exist

Without constructors:

$player =
new Player();

$player->name =
"Aayan";

$player->money =
5000;

$player->rank =
"Owner";

This becomes repetitive.

Constructors solve this.


Constructor Parameters

class Player {

public string $name;

public function __construct(
string $name
) {

$this->name =
$name;

}

}

Usage

$player =
new Player(
"Aayan"
);

Visualization

new Player("Aayan")
↓
__construct()
↓
$this->name = Aayan

Multiple Parameters

class Player {

public string $name;

public int $money;

public string $rank;

public function __construct(

string $name,
int $money,
string $rank

) {

$this->name =
$name;

$this->money =
$money;

$this->rank =
$rank;

}

}

Usage

$player =
new Player(

"Aayan",
5000,
"Owner"

);

Constructor Property Promotion

PHP 8 introduced Constructor Property Promotion.

Instead of:

class Player {

private string $name;

public function __construct(
string $name
) {

$this->name =
$name;

}

}

You can write:

class Player {

public function __construct(

private string $name

) {

}

}

Benefits

✅ Less code

✅ Cleaner classes

✅ Easier maintenance


Large Example

class Database {

public function __construct(

private string $host,
private string $user,
private string $password,
private string $database

) {

}

}

Constructor Defaults

public function __construct(

private string $rank =
"Player"

) {

}

Usage:

$player =
new Player();

Rank automatically becomes:

Player

Named Arguments

PHP 8+

$player =
new Player(

name: "Aayan",
money: 5000,
rank: "Owner"

);

Validation Inside Constructors

Example:

class Player {

public function __construct(

private int $money

) {

if (
$money < 0
) {

throw new Exception(
"Money cannot be negative"
);

}

}

}

Constructor Overloading

PHP does NOT support multiple constructors.

Invalid:

__construct()
__construct(string $name)

Alternative

Use optional parameters.

public function __construct(

?string $name = null

) {

}

Factory Methods

Another alternative:

Player::create();

Example:

class Player {

public static function create(
string $name
): self {

return new self(
$name
);

}

}

Usage:

$player =
Player::create(
"Aayan"
);

Constructor Chaining

Classes may call parent constructors.

Example:

class Human {

public function __construct() {

echo "Human";

}

}

Child:

class Player
extends Human {

public function __construct() {

parent::__construct();

echo " Player";

}

}

Output:

Human Player

Why Parent Constructors Matter

Example:

Entity
↓
Human
↓
Player

Each class initializes different things.


PocketMine Example

Simplified:

Entity Constructor
↓
Human Constructor
↓
Player Constructor

Dependency Injection

One of the most important concepts.

Instead of:

class PlayerManager {

private Config $config;

public function __construct() {

$this->config =
new Config();

}

}

Use:

class PlayerManager {

public function __construct(

private Config $config

) {

}

}

Benefits

✅ Easier testing

✅ Easier maintenance

✅ Lower coupling


Real World Example

class UserService {

public function __construct(

private Database $database,
private Logger $logger

) {

}

}

Constructor Injection Flow

Database
Logger
↓
UserService

Object Composition

Objects can receive objects.

Example:

class Server {

public function __construct(

private WorldManager $worldManager

) {

}

}

Destructors

Destructors are another special method.

Executed when object is destroyed.

Syntax:

public function __destruct() {

}

Lifecycle

new Object
↓
Object Used
↓
Object Destroyed
↓
__destruct()

Example

class Test {

public function __destruct() {

echo "Destroyed";

}

}

When Does Destructor Run?

Usually:

  • End of script
  • Object unset
  • Garbage Collection

Example

$test =
new Test();

unset(
$test
);

Output:

Destroyed

Destructor Usage

Useful for:

  • Closing files
  • Closing sockets
  • Saving cache
  • Logging

Example

class Database {

public function __destruct() {

$this->connection
->close();

}

}

Real PocketMine Usage

Examples:

Network Sessions
File Streams
Database Connections
Async Tasks

Constructor vs Destructor

ConstructorDestructor
__construct()__destruct()
Runs on creationRuns on destruction
Initialize objectCleanup object

Memory Flow

new Player()
↓
Constructor
↓
Object Active
↓
Destroy
↓
Destructor

Common Beginner Mistakes


Forgetting Parent Constructor​

Bad:

class Player
extends Human {

public function __construct() {

}

}

May break initialization.


Huge Constructors​

Bad:

__construct()

500 lines...

Keep constructors simple.


Heavy Logic​

Avoid:

database queries
network requests
large loops

inside constructors.


Using Destructor for Important Saves​

Destructor execution timing may vary.

Prefer explicit:

save();

Best Practices

✅ Keep constructors small.

✅ Use Dependency Injection.

✅ Prefer property promotion.

✅ Validate constructor arguments.

✅ Use destructors only for cleanup.


Exercises


Exercise 1​

Create:

class Car {

public function __construct(

private string $brand

) {

}

}

Exercise 2​

Create:

Player

Properties:

name
money
rank

Initialize using constructor.


Exercise 3​

Create:

Database

Destructor should close connection.


Mini Project

Create:

class Server {

public function __construct(

private string $name,
private int $port,
private int $maxPlayers

) {

}

}

Quiz

Which method runs automatically on object creation?​

Answer
__construct()

Which method runs on destruction?​

Answer
__destruct()

Which PHP version introduced property promotion?​

Answer

PHP 8.0


Which concept passes dependencies through constructors?​

Answer

Dependency Injection


Real PocketMine Examples

new Config(...)
new Position(...)
new Item(...)
new World(...)
new Vector3(...)

Every one of these internally uses constructors.


References

https://www.php.net/manual/en/language.oop5.decon.php


Next Chapter

➡ The $this Keyword

➡ Access Modifiers

➡ Encapsulation ➡ Inheritance