__set()与__get()

当一个类里面,属性被设置为私有属性时,这个属性是不能在外部被访问的。那么当我们又想在外部访问时该怎么办呢,我们可以用方法来实现。举例如下:

 1 class Test
2 {
3 private $abc;
4
5 public function setAbc($val)
6 {
7 $this->abc=$val;
8 }
9
10 public function getAbc()
11 {
12 return $this->abc;
13 }
14 }
15
16 $test=new Test();
17 $test->setAbc("this is abc!");
18 var_dump($test->getAbc());

以上这个代码就可以实现在外部访问私有属性,但是如果我们的私有属性不只一个时,假如还有一个ABD,那么我们要外部访问的话,还需要再写一个专门针对ABD的方法,这样就显得很麻烦了。如何实现多个私有属性访问,而又不用一个个去写方法呢?这时候 __set跟__get就派上用场了。上面的代码就可以这样写了,举例如下:

 1 class Test
2 {
3 private $abc;
4 private $abd;
5
6 public function __set($var, $val)
7 {
8 $this->$var=$val;
9 }
10
11 public function __get($var)
12 {
13 return $this->$var;
14 }
15 }
16
17 $test=new Test();
18 $test->abc="this is private abc";
19 echo $test->abc;

__set($var,$val):有两个参数,第一个是属性名,第二个是属性值。

__get($var):只有一个参数,属性名。

以上这段代码中,当我们给私有属性赋值时,它就会自动去执行__set()这个方法,同样的,当我们要获取属性值时,它也会自动去执__get()这个方法。访问的语法跟访问公有属性语法一样。

__isset()

__isset($var):是用来检测私有属性是否存在。只有一个参数,属性名。我们用代码来举例说明,如下:

1 class Test
2 {
3 private $abc='abc';
4 }
5 $test=new Test();
6 var_dump(isset($test->abc));

上面这段代执行的结果是返回布尔FALSE,虽然类里面有abc这个属性,但是它是私有属性,是不能被外部所访问的,所以返回布尔FALSE。如果要测试,我们可以在类里面加上__isset()方法,举例如下:

 1 class Test
2 {
3 private $abc='abc';
4
5 public function __isset($var)
6 {
7 return isset($this->$var)?true:false;
8 }
9 }
10 $test=new Test();
11 var_dump(isset($test->abc));

上面这段代码执行的结果是返回布尔TRUE,当外部的isset($test->abc) 检测不到abc时,它就会自动去执行类里面的__isset()这个方法,然后返回结果。

__unset()

__unset($var):用来删除私有属性,只有一个参数,属性名。举例如下:

 1 class Test
2 {
3 private $abc='abc';
4
5 public function __unset($var)
6 {
7 echo "__unset:".$var;
8 unset($this->$var);
9 }
10 }
11 $test=new Test();
12 unset($test->abc);

上面这段代码中,当外部的unset($test->abc)检测不到abc时,就会去执行类里面的__unset()这个方法,然后删除属性。

php之魔术方法 __set(),__get(),__isset(),__unset()的更多相关文章

  1. php __set() __get() __isset() __unset()四个方法的应用

    一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是,对属性的读取 和赋值操作是非常频繁的,因此在PHP5 中,预定义了两个函数“__get()”和“__set()”来获 取和赋值其 ...

  2. PHP 魔术方法__set() __get() 方法

    a); //output: 123 var_dump($s->b); //output: 123 var_dump($s->c); //output: null var_dump($s-& ...

  3. PHP 魔术方法__set() __get() 方法详解

    __set() is run when writing data to inaccessible properties. __get() is utilized for reading data fr ...

  4. php魔术方法__SET __GET

    __SET  设置一个不可访问的属性的时候 调用_set方法 __GET 获取一个不可访问的属性的时候  调用_get 方法 <?php class stu{ private $a; priva ...

  5. PHP面向对象魔术方法之__get 和 __set函数

    l 基本的介绍 (1) 当我们去使用不可以访问的属性时,系统就会调用__get方法. (2) 不可以访问的属性指的是(1 . 该属性不存在 2. 直接访问了protected或者private属性) ...

  6. PHP的魔法方法__set() __get()

    php的魔法方法__set()与__get() Tags: PHP 我们先来看看官方的文档如何定义他们的: public void __set(string $name, mixed $value); ...

  7. __set() __get() _isset() __unset() 在__unset() 在类中没有事先声明和已经声明过的属性调用unset的区别

    <?php //echo strtr("I Love Mysql, Love PHP", "Mysql","MYSQL"); //$a ...

  8. PHP中常见魔术方法解析

    <?php class info { private $province; //省 public $city; //城市 private $myname; //姓名 //__construct( ...

  9. PHP几种常见魔术方法与魔术变量解析

    原文地址:http://small.aiweimeng.top/index.php/archives/49.html 先不多说,直接上代码,如下: class Demo { private $str ...

随机推荐

  1. spark知识点_RDD

    来自官网的Spark Programming Guide,包括个人理解的东西. 这里有一个疑惑点,pyspark是否支持Python内置函数(list.tuple.dictionary相关操作)?思考 ...

  2. 【模拟】P1143进制转换

    题目相关 题目描述 请你编一程序实现两种不同进制之间的数据转换. 输入格式 共三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16),第二行是一个n进制数,若n>10则用大写字母A- ...

  3. JAVA_基础反射创建运行时类的对象

    通过反射去创建对应的运行时类的对象 newInstance():调用此方法,创建对应的运行时类的对象.内部调用的是空参的构造器. 要想此方法正常的创建运行时类的对象,要求: 1.运行时类必须提供空参构 ...

  4. 一文带你探究Sentinel的独特初始化

    摘要:本系列通过作者对Redis Sentinel源码的理解,详细说明Sentinel的代码实现方式. Redis Sentinel 是Redis提供的高可用模型解决方案.Sentinel可以自动监测 ...

  5. MongoDB备份(mongodump)与恢复(mongorestore)工具实践

    mongodump和mongorestore实践 1.mongodump备份工具 mongodump能够在Mongodb运行时进行备份,它的工作原理是对运行的Mongodb做查询,然后将所有查到的文档 ...

  6. Error: Could not open input file: /usr/java/jdk1.7.0_07/jre/lib/jsse.pack

    [root@localhost ~]# rpm -ivh jdk-7u7-linux-i586.rpm Preparing... ################################### ...

  7. zabbix_agent items not supported状态

    不记得自己究竟更改了什么东西,然后突然发现所有的有关mysql的监控items都变成了not supported,怎么做不行,最后在web主页把主机删除,又重新添加一下,重新添加了一下模版就好了.这究 ...

  8. 【RAC】oracle11g r2 rac环境删除节点步骤

    1.移除数据库实例 如果节点运行了service首先需要删除service使用dbca图形化界面删除节点依次选择 Real Application Clusters -- > Instance ...

  9. qt for webassembly环境搭建图文教程

    一.前言 从Qt5.14开始,官方的在线安装提供了qt for webassembly构建套件,这对很多小白来说绝对是个好消息,也绝对是个好东西,好消息是不用再去交叉编译自己生成qt for weba ...

  10. 编年史:OI算法总结

    目录(按字典序) A --A* D --DFS找环 J --基环树 S --数位动规 --树形动规 T --Tarjan(e-DCC) --Tarjan(LCA) --Tarjan(SCC) --Ta ...