How to Use PHP __isset and __unset Magic Methods

In PHP, magic methods allow you to intercept actions performed on overloaded or inaccessible class properties. This article explains how to implement and use the __isset() and __unset() magic methods to dynamically check for existence and remove properties in your PHP classes.

Understanding Property Overloading

Property overloading in PHP allows you to dynamically create and manage properties. When you try to access, write, check, or delete properties that are not declared in the class scope (or are private/protected), PHP automatically calls specific magic methods.

These methods act as gateways to a private data store, usually an associative array inside the object.

Implementing __isset() and __unset()

To use these magic methods, you typically define a private array to hold your dynamic data, and then define the magic methods to interact with that array.

Here is a practical code example:

class DynamicUser {
    // Array to store dynamic properties
    private array $properties = [];

    // Magic setter to assign dynamic properties
    public function __set(string $name, mixed $value): void {
        $this->properties[$name] = $value;
    }

    // Magic getter to retrieve dynamic properties
    public function __get(string $name): mixed {
        return $this->properties[$name] ?? null;
    }

    // Triggered when calling isset() or empty() on a dynamic property
    public function __isset(string $name): bool {
        return isset($this->properties[$name]);
    }

    // Triggered when calling unset() on a dynamic property
    public function __unset(string $name): void {
        unset($this->properties[$name]);
    }
}

How the __isset() Method Works

By default, calling isset($user->email) on an undeclared property returns false, even if you have created it dynamically. By defining __isset(), you tell PHP how to check if that property exists in your internal storage.

$user = new DynamicUser();
$user->email = "user@example.com"; // Handled by __set()

// Without __isset() defined, this would return false
if (isset($user->email)) {
    echo "Email is set: " . $user->email;
} else {
    echo "Email is not set.";
}

How the __unset() Method Works

Similarly, calling unset($user->email) on an undeclared property will do nothing to your internal $properties array unless you define the __unset() magic method.

$user = new DynamicUser();
$user->email = "user@example.com";

// Remove the dynamic property
unset($user->email); // Handled by __unset()

// Check if it still exists
if (isset($user->email)) {
    echo "Email still exists.";
} else {
    echo "Email has been successfully removed.";
}

Why Use These Methods?

Implementing __isset() and __unset() is essential when building flexible classes such as database active records, data transfer objects (DTOs), or configuration wrappers. They ensure that standard PHP functions like isset() and unset() behave predictably and correctly when interacting with your custom, dynamically-allocated object properties.