Dynamic Getters and Setters in PHP

Use dynamic accessor-methods in a PHP class with one simple code-block. You don't have to create them over and over again with copy/paste anymore. Kinda like Lombok[1] does for Java.

Example 1

class Person {
    private $firstname;
    private $lastname;
    private $birthdate;
    private $externalReference;

    /**
     * Dynamic getters and setters
     */
    public function __call($method, $params){
        $prefix = substr($method, 0, 3);
        $var = lcfirst(substr($method, 3));
        if($prefix == 'get'){
            return $this->{$var};
        }
        else if($prefix == 'set'){
            $this->{$var} = $params[0];
        }
        else if($prefix == 'out'){
            return htmlspecialchars($this->$var, ENT_QUOTES, 'UTF-8'); //prevent XSS
        }
    }
}

Simple class with use of PHP's magic method __call.


$person = new Person();
$person->setFirstname('John');
$person->setLastname('Doe');
$person->setBirthdate(DateTime::createFromFormat('Y-m-d H:i:s','1955-11-05 00:00:00'));
$person->setExternalReference(1000);

Instantiate the class and set the values


object(Person)[1]
  private 'firstname' => string 'John' (length=4)
  private 'lastname' => string 'Doe' (length=3)
  private 'birthdate' => 
    object(DateTime)[2]
      public 'date' => string '1955-11-05 00:00:00.000000' (length=26)
      public 'timezone_type' => int 0
      public 'timezone' => string 'Hill Valley' (length=13)
  private 'externalReference' => int 1000 

Output of the instance



Extended example

class BestClassEver {
    /**
     * Dynamic getters and setters
     */
    public function __call($method, $params){
        $prefix = substr($method, 0, 3);
        $var = lcfirst(substr($method, 3));
        if($prefix == 'get'){
            return $this->{$var};
        }
        else if($prefix == 'set'){
            $this->{$var} = $params[0];
        }
        else if($prefix == 'out'){
            return htmlspecialchars($this->$var, ENT_QUOTES, 'UTF-8'); //prevent XSS
        }
    }
}

class Person extends BestClassEver {
    protected $firstname;
    protected $lastname;
    protected $birthdate;
    protected $externalReference;
}

Put the code-block into a superclass. (Notice the change of the access-modifier by the class-properties)

$person = new Person();
$person->setFirstname('John');
$person->setLastname('Doe');
$person->setBirthdate(DateTime::createFromFormat('Y-m-d H:i:s','1955-11-05 00:00:00'));
$person->setExternalReference(1000);

Instantiate the class and set the values


object(Person)[1]
  protected 'firstname' => string 'John' (length=4)
  protected 'lastname' => string 'Doe' (length=3)
  protected 'birthdate' => 
    object(DateTime)[2]
      public 'date' => string '1955-11-05 00:00:00.000000' (length=26)
      public 'timezone_type' => int 0
      public 'timezone' => string 'Hill Valley' (length=13)
  protected 'externalReference' => int 1000

Output of the instance


Sources:

[1] https://projectlombok.org

Tags: php, oop


« back

010100100110000101101110011001000110111101101101010000110110100101110000011010000110010101110010

About the author

human, software engineer, tech enthusiast, security researcher

E-Mail: blog@cipher.digital

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: OpenPGP (RSA-2048)

xsBNBFjAYL4BCACsmBS6zE+0b7mZVtQhmfnRn3+IIQfT6WlE6izM39Q42yxj
Hf2GOZU15Xc1x5RM9ZZx7HnMyTQWJMkwCzEba4Ju8dbn8gbFzLFp+mXAWQVJ
NOhsLvt58X/k1nQ3HYaYAbJPFE4k89zlFUjBG+a1Qs0kNg5RkaSTcE4iV6L4
749LYRba1VFK1p3eIFmIh1zQnzwFY1WYJjvXHURZel8MA0BJTkmfOW4MRHZL
lz8mjmTeWoRyxismRDprEtGynK7oIb3qUKAIr5MtoyESHBhVR+EpWHP0+06T
IfOsrsp8maNztXRQRKZxHzNZj/ayGpxBGO19e0/6jNpWGI5Nflwo/oHbABEB
AAHNI0RpZ2l0YWxDaXBoZXIgPGJsb2dAY2lwaGVyLmRpZ2l0YWw+wsByBBAB
CAAmBQJYwGDQBgsJCAcDAgkQMsB3T2XG/XYEFQgCCgMWAgECGwMCHgEAAOzo
B/4obbCU7u4f8kXQiaqAhSCjjyR5ZzdApPCh9i9XJ0qGTULTUuBrin1JDXSj
HoiByL2mYh92+I8S+YMWLMiTQzl9O4wx+A0eDnfwbs5jKJSQt5Pc8NMlwWKU
pG+R7escZ7le/qJYMgGPUWzFhgaKi8jueMW/NJSmPu/Tu4V9nhyxG9oaV3oP
rF+W0bekP84tDJ477clRSSK9ZzjMbLL1PWuNmCd8Gsnd3fyP1WcadIMDrnBB
sb+7AQ9eTywJ4Yzogh+cWjwy+TkkfEyCJ0X2n5WPURWc0YOFVqhcV4TYDR4v
CHSbh+r7OVKIjqdQKDJwAUCYeSkePbxJYmzRoaTd2+RgzsBNBFjAYL4BCADE
i8WrXxZWn42DlKDpnwTFBo/8asY4SJ22Zagkoj3cVvkechDWqQnWD753y5Xo
gymfPnNjoQGmClDaQoZ29kC4kHTmBPICHCCLvV/7YVCZC4WPpSnpklbllmk7
S8WTnyEm09gniGyLVy5st6MYmFDB4VnfXpzVYtpyEOyIfGV+JmuT90L872xc
+rI1/UuZA15k8M+ViD2xDlBMz3fbWxbt/KEUvbGoh2RW6SBJl1/z33ainQmO
oqygZtHhoFybqf/OUAHzASPcy+E4byWBIqwDDumKWfsd1YYkUgPMIxEvNaU3
2Olh5+2HX1y8WAf5cIfXUDfmZ88HmWVVXAK9JjztABEBAAHCwF8EGAEIABMF
AljAYNEJEDLAd09lxv12AhsMAACSqQf/Tz5KsfN3Yr82jXeO7jEWqI8yUaV2
vfK2JNfQXMIYDezIPxZU/sOOz9QF5gzHaLzt6moDQzHTZy9IE6q4l5gH1Wcm
1rX2b2b4ST3ThRzuDcfSCDZvUIAQ0WEBlXJZbCMwV8Rs5vsvv/CeXaT19zMb
CGD+23A1dKDSDmnlycCSDlTK0dc4flc8qqsMAXXtV7F370L3r76GQGj/ap57
k8K5l8VOqNCU2E8PJ1nU3Kf0fpaPJCpmDp51iZB6Ndx7ujb3qCzt5ND0Nqpz
8wuA9uuzf7LdYsz6MdDo3u8cBYeT2KA2pOA6W1SJgSx62Z4hFZxS5nseW3al
tfhqcXA+Ox3+gw==
=GS1N
-----END PGP PUBLIC KEY BLOCK-----