先来看一段代码:
class Article{
//私有成员属性
private $title = '标题';
//受保护的成员属性
protected $author = '作者';
//公有成员属性
public $introduce = '简介';
}
$article = new Article();
var_dump($article -> title);
var_dump($article -> author);
var_dump($article -> introduce);
对象直接访问类中的private和protected成员属性时,会报一个Fatal error的错误,提示“Cannot access private property”或者“Cannot access protected property”。
1、魔术方法__get()
如果对象要直接访问类中的private和protected成员属性呢?
PHP给我们提供了一个魔术方法“__get()”,用于获取private和protected成员属性。
class Article{
//私有成员属性
private $title = '标题';
//受保护的成员属性
protected $author = '作者';
//公有成员属性
public $introduce = '简介';
//获取private和protected成员属性
public function __get($name){·
if(isset($this -> $name)) {
return $this->$name;
}
return false;
}
}
$article = new Article();
var_dump($article -> title);
var_dump($article -> author);
var_dump($article -> introduce);
执行结果如下:
string(6) "标题" string(6) "作者" string(6) "简介"
可以看出,__get()魔术方法并不需要我们显示的去调用;类本身会隐式的去调用此方法。而且,private和protected成员属性都可以通过此魔术方法获取相应的数据。
2、魔术方法__set()
如果对象要直接对类中的private和protected成员属性赋值呢?
PHP给我们提供了一个魔术方法“__set()”,用于对private和protected成员属性进行赋值操作。
class Article{
//私有成员属性
private $title = '标题';
//受保护的成员属性
protected $author = '作者';
//公有成员属性
public $introduce = '简介';
//获取private和protected成员属性
public function __get($name){
if(isset($this -> $name)) {
return $this->$name;
}
return false;
}
//设置private和protected成员属性
public function __set($name, $value){
if(isset($this -> $name)){
$this -> $name = $value;
}
}
}
$article = new Article();
$article -> title = '文章标题';
$article -> author = '文章作者';
$article -> introduce = '文章简介';
var_dump($article -> title);
var_dump($article -> author);
var_dump($article -> introduce);
执行结果如下:
string(12) "文章标题" string(12) "文章作者" string(12) "文章简介"
__set()魔术方法也不需要显示的调用;类本身也会隐式的去调用此方法。而且,private和protected成员属性都可以通过此魔术方法去设置相应的值。特别注意一点,所有的魔术方法都必须声明为public,各位可以去实现一遍代码,测试便知。
其实get()和set()这两个魔术方法都是PHP“重载(overload)”特性的体现。PHP中的"重载"与其它绝大多数面向对象语言不同。传统的"重载"是用于提供多个同名的类方法,但各方法的参数类型和个数不同。而PHP中的“重载”是指动态地“创建”类属性和方法,即通过魔术方法(magic methods)来实现。
「真诚赞赏,手留余香」

- 本站文章除注明转载外,均为本站原创
- 欢迎任何形式的转载,但请务必注明出处,尊重他人劳动
- 转载请注明:文章转载自:Marser [https://www.marser.cn]
- 本文标题:PHP魔术方法之__set()和__get()
- 本文固定链接: https://www.marser.cnarticle/98.html