PHP Magic methods are special methods that begin with double underscores (__) and are automatically triggered by specific actions within your code. These methods allow you to define powerful and dynamic behaviors in your classes. In this article, we’ll cover:
1) What magic methods are
2) The most commonly used magic methods
3) Code examples for each
4) Best practices
What Are PHP Magic Methods?
Magic methods are predefined methods that PHP calls automatically when certain events occur. They are often used to control property access, method calls, and object behavior in a flexible and elegant way.
Common Magic Methods (with Examples)
1. __construct() – Constructor
Called automatically when a new object is created.
<?php class User { public function __construct($name) { echo "User $name created!"; } } $user = new User("Alice"); // Output: User Alice created! ?>
2. __destruct() – Destructor
Called when an object is destroyed (end of script or unset).
<?php class Logger { public function __destruct() { echo "Cleaning up..."; } } $log = new Logger(); // Output on script end: Cleaning up... ?>
3. __get() – Accessing Inaccessible/Nonexistent Properties
<?php class Product { private $data = ['name' => 'Laptop']; public function __get($property) { return $this->data[$property] ?? "Property not found!"; } } $p = new Product(); echo $p->name; // Output: Laptop echo $p->price; // Output: Property not found! ?>
4. __set() – Setting Inaccessible/Nonexistent Properties
<?php class Product { private $data = []; public function __set($key, $value) { $this->data[$key] = $value; } public function __get($key) { return $this->data[$key] ?? null; } } $p = new Product(); $p->name = "Smartphone"; echo $p->name; // Output: Smartphone ?>
5. __isset() and __unset()
Used when calling isset() or unset() on inaccessible properties.
<?php class User { private $data = ['email' => 'test@example.com']; public function __isset($key) { return isset($this->data[$key]); } public function __unset($key) { unset($this->data[$key]); } } $u = new User(); var_dump(isset($u->email)); // true unset($u->email); var_dump(isset($u->email)); // false ?>
6. __call() – Handling Undefined Method Calls (Object Context)
<?php class Magic { public function __call($name, $arguments) { return "Method '$name' does not exist. Arguments: " . implode(", ", $arguments); } } $obj = new Magic(); echo $obj->doSomething("arg1", "arg2"); // Output: Method 'doSomething' does not exist. Arguments: arg1, arg2 ?>
7. __callStatic() – Undefined Static Method Calls
<?php class StaticMagic { public static function __callStatic($name, $args) { return "Static method '$name' was called with arguments: " . implode(", ", $args); } } echo StaticMagic::unknown("x", "y"); // Output: Static method 'unknown' was called with arguments: x, y ?>
8. __toString() – When Object is Treated Like a String
<?php class Book { public function __toString() { return "Book object"; } } $b = new Book(); echo $b; // Output: Book object ?>
9. __invoke() – When Object is Called Like a Function
<?php class Greeter { public function __invoke($name) { return "Hello, $name!"; } } $greet = new Greeter(); echo $greet("John"); // Output: Hello, John! ?>
10. __clone() – When an Object is Cloned
<?php class Test { public function __clone() { echo "Object cloned!"; } } $t1 = new Test(); $t2 = clone $t1; // Output: Object cloned! ?>
Best Practices for Using Magic Methods
1) Avoid overusing magic methods—they can make code harder to read/debug.
2) Use them only when they provide real flexibility (e.g., dynamic properties or lazy loading).
3) Always document them well for maintainability.
Final Thoughts:
Magic methods in PHP give you the power to create flexible, dynamic, and clean OOP code. Whether you’re building custom property handlers, dynamic method calls, or string representations of objects, these methods can help—but use them wisely.
Read Also:
PHP and JSON: Encode, Decode, and Handle JSON Data
How to Create a Simple Form and Handle Form Data in PHP