前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP魔术方法之__set()和__get()

PHP魔术方法之__set()和__get()

作者头像
Marser
发布2018-06-25 16:57:10
1K0
发布2018-06-25 16:57:10
举报
文章被收录于专栏:智能合约智能合约

先来看一段代码:

代码语言:javascript
复制
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成员属性。

代码语言:javascript
复制
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);

执行结果如下:

代码语言:javascript
复制
string(6) "标题" string(6) "作者" string(6) "简介"

可以看出,__get()魔术方法并不需要我们显示的去调用;类本身会隐式的去调用此方法。而且,private和protected成员属性都可以通过此魔术方法获取相应的数据。

2、魔术方法__set()

如果对象要直接对类中的private和protected成员属性赋值呢?

PHP给我们提供了一个魔术方法“__set()”,用于对private和protected成员属性进行赋值操作。

代码语言:javascript
复制
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);

执行结果如下:

代码语言:javascript
复制
string(12) "文章标题" string(12) "文章作者" string(12) "文章简介"

__set()魔术方法也不需要显示的调用;类本身也会隐式的去调用此方法。而且,private和protected成员属性都可以通过此魔术方法去设置相应的值。特别注意一点,所有的魔术方法都必须声明为public,各位可以去实现一遍代码,测试便知。

其实get()和set()这两个魔术方法都是PHP“重载(overload)”特性的体现。PHP中的"重载"与其它绝大多数面向对象语言不同。传统的"重载"是用于提供多个同名的类方法,但各方法的参数类型和个数不同。而PHP中的“重载”是指动态地“创建”类属性和方法,即通过魔术方法(magic methods)来实现。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:201509-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、魔术方法__get()
  • 2、魔术方法__set()
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档