使用php的通用getter和setter
作者:互联网
有成千上万的php __get和__set的例子,不幸的是没有人真正告诉你如何使用它们.
所以我的问题是:如何在类中和实际使用对象时调用__get和__set方法.
示例代码:
class User{
public $id, $usename, $password;
public function __construct($id, $username) {
//SET AND GET USERNAME
}
public function __get($property) {
if (property_exists($this, $property)) {
return $this->$property;
}
}
public function __set($property, $value) {
if (property_exists($this, $property)) {
$this->$property = $value;
}
return $this;
}
}
$user = new User(1, 'Bastest');
// echo GET THE VALUE;
我如何在构造函数中设置值以及如何获得// echo中的值GET THE VALUE;
解决方法:
此功能在PHP中称为重载.正如documentation所述,如果您尝试访问不存在或不可访问的属性,则将调用__get或__set方法.您的代码中的问题是,您正在访问的属性是存在且可访问的.这就是为什么__get / __ set不会被调用的原因.
检查此示例:
class Test {
protected $foo;
public $data;
public function __get($property) {
var_dump(__METHOD__);
if (property_exists($this, $property)) {
return $this->$property;
}
}
public function __set($property, $value) {
var_dump(__METHOD__);
if (property_exists($this, $property)) {
$this->$property = $value;
}
}
}
测试代码:
$a = new Test();
// property 'name' does not exists
$a->name = 'test'; // will trigger __set
$n = $a->name; // will trigger __get
// property 'foo' is protected - meaning not accessible
$a->foo = 'bar'; // will trigger __set
$a = $a->foo; // will trigger __get
// property 'data' is public
$a->data = '123'; // will not trigger __set
$d = $a->data; // will not trigger __get
标签:php,getter-setter 来源: https://codeday.me/bug/20190728/1565600.html