__construct() — called on new ClassName()__destruct() — when the object is destroyed__get($name) / __set($name, $value) — access to non-existent or protected properties__call($name, $args) — calling a non-existent method__toString() — object-to-string conversion__invoke() — calling the object like a function: $obj()__clone() — after object cloning__serialize() / __unserialize() — serialisation controlMagic methods are slower than regular ones. __get/__set hinder static analysis — the IDE cannot "see" the properties. Use them only where dynamic behaviour is genuinely needed.