专栏首页智能合约PHP魔术方法之__set()和__get()

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

先来看一段代码:

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)来实现。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • centos之SSH安装

    Marser
  • 剖析Redis持久化之RDB方式

    Marser
  • centos安装lnmp环境

    Marser
  • BAT面试题7和8:xgboost为什么用泰勒展开?是有放回选特征吗?

    接下来,每天推送一道BAT面试题,日积月累,相信大家会从中学到一些东西。最后希望大家顺利拿到自己期盼已久的OFFER.

    double
  • NVIDIA Deepstream 笔记(二):如何设计视频分析的框架?

    你已经非常清楚什么是Deepstream,它为什么存在以及3.0中的一些新功能和增强功能。我们现在要退后一步,深入了解是什么驱动Deepstream.

    GPUS Lady
  • 图形数据库neo4j——(1)基础概要

    节点可以想象成图中的对象,节点包含属性,属性可以是任何键值对的形式存储,节点可以有一个或多个标签,也可以没有标签,标签把节点组织在一起。

    羊羽shine
  • Neo4j服务关闭启动·常用配置·快速设定新密码

    Neo4j分社区版(Community Edition)和企业版(Enterprise Edition),社区版本为免费版本。目前的最新版本为Neo4j 3.1...

    陈黎栋
  • 小甲鱼《零基础学习Python》课后笔记(二十五):字典——当索引不好用时1

    测试题 0.当你听到小伙伴在讨论“映射”、“哈希”、“散列”或者“关系数列”的时候,事实上他们就是在讨论什么呢? 事实上是在讨论字典,字典是python中的...

    小火柴棒
  • centos neo4j 安装+远程访问配置

    直接用yum install neo4j不可行,可能是版本库中不存在neo4j,得手动加入。

    尾尾部落
  • 【文章】Java应用程序运行时监控方法之JVMTI的应用

    The JVM Tool Interface (JVMTI) 是一个由JVM提供的用于开发针对Java程序开发与监控工具的编程接口,通过JVMTI接口(Nati...

    Criss@陈磊

扫码关注云+社区

领取腾讯云代金券