March 9, 2017
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.orgTags: 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-----