Magic Getters and Setters is an actively used design pattern. Magic getters and setters are a feature in some object-oriented languages that allows you to define a function that will be called when an undefined property on the instance is called in either a getting or setting manner.

?Years Old

Languages without Magic Getters and Setters include cpp

Languages with Magic Getters and Setters include javascript, php

Example from javascript:

// Can be implemented in ES6 using proxies:
"use strict";
if (typeof Proxy == "undefined") {
    throw new Error("This browser doesn't support Proxy");
}
let original = {
    "foo": "bar"
};
let proxy = new Proxy(original, {
    get(target, name, receiver) {
        let rv = Reflect.get(target, name, receiver);
        if (typeof rv === "string") {
            rv = rv.toUpperCase();
        }
        return rv;
      }
});
console.log(`original.foo = ${original.foo}`); // "original.foo = bar"
console.log(`proxy.foo = ${proxy.foo}`);       // "proxy.foo = BAR"

Example from php:

    public function __set($name, $value)
   {
       echo "Setting '$name' to '$value'\n";
       $this->data[$name] = $value;
   }

   public function __get($name)
   {
       echo "Getting '$name'\n";
       if (array_key_exists($name, $this->data)) {
           return $this->data[$name];
       }

       $trace = debug_backtrace();
       trigger_error(
           'Undefined property via __get(): ' . $name .
           ' in ' . $trace[0]['file'] .
           ' on line ' . $trace[0]['line'],
           E_USER_NOTICE);
       return null;
   }

Last updated January 18th, 2020

Edit Magic Getters and Setters on GitHub