php之魔术方法 __set(),__get(),__isset(),__unset()
__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()的更多相关文章
- php __set() __get() __isset() __unset()四个方法的应用
一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是,对属性的读取 和赋值操作是非常频繁的,因此在PHP5 中,预定义了两个函数“__get()”和“__set()”来获 取和赋值其 ...
- PHP 魔术方法__set() __get() 方法
a); //output: 123 var_dump($s->b); //output: 123 var_dump($s->c); //output: null var_dump($s-& ...
- PHP 魔术方法__set() __get() 方法详解
__set() is run when writing data to inaccessible properties. __get() is utilized for reading data fr ...
- php魔术方法__SET __GET
__SET 设置一个不可访问的属性的时候 调用_set方法 __GET 获取一个不可访问的属性的时候 调用_get 方法 <?php class stu{ private $a; priva ...
- PHP面向对象魔术方法之__get 和 __set函数
l 基本的介绍 (1) 当我们去使用不可以访问的属性时,系统就会调用__get方法. (2) 不可以访问的属性指的是(1 . 该属性不存在 2. 直接访问了protected或者private属性) ...
- PHP的魔法方法__set() __get()
php的魔法方法__set()与__get() Tags: PHP 我们先来看看官方的文档如何定义他们的: public void __set(string $name, mixed $value); ...
- __set() __get() _isset() __unset() 在__unset() 在类中没有事先声明和已经声明过的属性调用unset的区别
<?php //echo strtr("I Love Mysql, Love PHP", "Mysql","MYSQL"); //$a ...
- PHP中常见魔术方法解析
<?php class info { private $province; //省 public $city; //城市 private $myname; //姓名 //__construct( ...
- PHP几种常见魔术方法与魔术变量解析
原文地址:http://small.aiweimeng.top/index.php/archives/49.html 先不多说,直接上代码,如下: class Demo { private $str ...
随机推荐
- Hive 中的四种排序详解,再也不会混淆用法了
Hive 中的四种排序 排序操作是一个比较常见的操作,尤其是在数据分析的时候,我们往往需要对数据进行排序,hive 中和排序相关的有四个关键字,今天我们就看一下,它们都是什么作用. 数据准备 下面我们 ...
- 风炫安全web安全学习第三十节课 命令执行&代码执行基础
风炫安全web安全学习第三十节课 命令执行&代码执行基础 代码执行&命令执行 RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统. 远程系统命令执行 ...
- C++语言基础——02数据的存取
常量 常量是指在程序中使用的一些具体的数.字符.在程序运行过程中,其值不能更改.如123.1.23.'a'."abc".True等. 常量的定义 const 类型 常量名 = 常量 ...
- 2021升级版微服务教程5—通过IDEA运行多个项目实例「模拟集群」
2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」 教程全目录「含视频」:https://gitee.c ...
- 用 Flutter 搭建标签+导航框架
前言 在 Flutter 这个分类的第一篇文章总结了下最新的 Mac 搭建 Flutter 开发环境和对声明式UI这个理解的东西,前面也有提过,准备像在 SwiftUI 分类中那样花一些功夫来写一个 ...
- 二进制格式 PLY 模型文件的读取与渲染
PLY 文件头部信息: ply format binary_little_endian 1.0 comment VCGLIB generated element vertex 13469 proper ...
- Lambda表达式你会用吗?
函数式编程 在正式学习Lambda之前,我们先来了解一下什么是函数式编程 我们先看看什么是函数.函数是一种最基本的任务,一个大型程序就是一个顶层函数调用若干底层函数,这些被调用的函数又可以调用其他函数 ...
- bat批处理积累
1 ::所有命令不回显,包含echo off自身也不回显 2 @echo off 3 4 ::rem或双冒号都为注释行 5 6 rem 变量赋值,注意变量和等号之间不能有空格,等号后的空格会作为变量值 ...
- 超精讲-逐例分析CS:LAB2-Bomb!(上)
0. 环境要求 关于环境已经在lab1里配置过了这里要记得安装gdb 安装命令 sudo yum install gdb 实验的下载地址 http://csapp.cs.cmu.edu/3e/labs ...
- 【Azure 存储服务】Python模块(azure.cosmosdb.table)直接对表存储(Storage Account Table)做操作示例
什么是表存储 Azure 表存储是一项用于在云中存储结构化 NoSQL 数据的服务,通过无结构化的设计提供键/属性存储. 因为表存储无固定的数据结构要求,因此可以很容易地随着应用程序需求的发展使数据适 ...