PHP中的__get和__set理解
先来了解一下PHP类中的__get
和__set
函数
当我们试图获取一个不可达属性时(比如private),类会自动调用__get
函数。
当试图设置一个不可达属性时(比如private),类会自动调用__set
函数,我们一起来看个例子:
<?php
class Person{
public $name = '周伯通';
private $sex = '男';
}
$class = new Person();
echo $class->sex;
这里$sex声明了私用变量,私有变量或方法在类实例化是不能直接访问的,所以上面会抛出异常
Fatal error: Uncaught Error: Cannot access private property Person::$sex
我们再稍加改造一下:
<?php
class Person{
public $name = '周伯通';
private $sex = '男';
function __get($name){
echo '个人信息:'.$name.$this->sex;
}
}
$class = new Person();
echo $class->sex;//个人信息:sex男
可以看出sex方法自动调用了,并可以访问私有变量。
我们再来看一下__set
函数,同样也是先使用可达的私有属性:
<?php
class Person{
public $name = '周伯通';
private $sex = '男';
function __set($name, $val){
echo '个人信息:'.$name. $val;
}
}
$class = new Person();
$class->sex = '女';
echo $class->sex;
个人信息:sex女
( ! ) Fatal error: Uncaught Error: Cannot access private property Person::$sex in G:\web\gitlearn\set.php on line
( ! ) Error: Cannot access private property Person::$sex in G:\web\gitlearn\set.php on line
这里调用了__set
函数并提示我们不能使用类的私有属性。可以看到sex在外部是被改变 了,但是抛出了致命错误
现在我们来通过__set
函数实现外部使用私有属性:
<?php
class Person{
public $name = '周伯通';
private $sex = '男';
function __set($name, $val){
//echo '个人信息:'.$this->$name = $val;
$this->$name = $val; //注意 这里是$name,是要设置访问的变量名,如果大家用$this->name,会看到本例会输出的是 男
}
function getSex(){
echo $this->sex; //获取新的属性
}
}
$class = new Person();
$class->sex = '女';
echo $class->getSex();// 输出 女
通过上面几个例子,相信大家对set/get应该有更深的理解啦。
PHP中的__get和__set理解的更多相关文章
- PHP类中的__get()和__set函数到底有什么用
PHP类中的__get()和__set函数到底有什么用 一.总结 一句话总结:当试图获取一个不可达变量时,类会自动调用__get.同样的,当试图设置一个不可达变量时,类会自动调用__set.在网站中, ...
- php 魔术方法__get()和__set()理解
__get()方法,官方手册上是这样解释的 : ' 当调用(自己加的:或设置|赋值)当前环境下未定义或不可见的类属性或方法时,重载方法会被调用.本节后面将使用"不可访问属性(inaccess ...
- PHP类中的__get()和__set函数到底有什么用?
当试图获取一个不可达变量时,类会自动调用__get. 同样的,当试图设置一个不可达变量时,类会自动调用__set. 在网站中,这两个并不是什么非用不可的函数. 例如: Class Test { ...
- PHP中的__get()和__set()方法获取设置私有属性
在类的封装中,获取属性可以自定义getXXX()和setXXX()方法,当一个类中有多个属性时,使用这种方式就会很麻烦.为此PHP5中预定义了__get()和__set()方法,其中__get()方法 ...
- php中的__get和__set方法
1.__get() 作用:当实例化对象调用一个没有定义的属性时,会自动调用__get()方法 当实例化对象调用一个私有或者受保护的属性时,也会调用这个方法,方式类似 结果是:你访问的公开属性:name ...
- PHP中__get()和__set()的用法实例详解
php面向对象_get(),_set()的用法 一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数“__ge ...
- PHP5中__call、__get、__set、__clone、__sleep、__wakeup的用法
__construct(),__destruct(),__call(),__callStatic(),__get(),__set(),__isset(),__unset(),__sleep(),__w ...
- php中__get()和__set的用法
php版本5.6 一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数“__get()”和“__set()”来 ...
- PHP中__get()和__set()的用法实例详
刚刚看到一个对我有用的文章,我就把它摘抄下来了. php面 ...
随机推荐
- selenium python 设置窗口打开大小
1. 窗口最大化 1 driver.maximize_window() 2. 设置窗口大小 1 driver.set_window_size(1920,1080) #分辨率1920 x 1080
- Red and Black---POJ - 1979
There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A ...
- Dora.Interception,为.NET Core度身打造的AOP框架 [2]:以约定的方式定义拦截器
上一篇<更加简练的编程体验>提供了最新版本的Dora.Interception代码的AOP编程体验,接下来我们会这AOP框架的编程模式进行详细介绍,本篇文章着重关注的是拦截器的定义.采用“ ...
- emWin表盘界面设计,含uCOS-III和FreeRTOS两个版本
第4期:简易表盘界面设计 配套例子:V6-906_STemWin提高篇实验_简易表盘界面设计(uCOS-III)V6-907_STemWin提高篇实验_简易表盘界面设计(FreeRTOS) 例程下载地 ...
- [Java]LeetCode133. 克隆图 | Clone Graph
Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. OJ's ...
- [Swift]LeetCode303. 区域和检索 - 数组不可变 | Range Sum Query - Immutable
Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...
- [Swift]LeetCode463. 岛屿的周长 | Island Perimeter
You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 represen ...
- [Swift]LeetCode546. 移除盒子 | Remove Boxes
Given several boxes with different colors represented by different positive numbers. You may experie ...
- [Abp 源码分析]十五、自动审计记录
0.简介 Abp 框架为我们自带了审计日志功能,审计日志可以方便地查看每次请求接口所耗的时间,能够帮助我们快速定位到某些性能有问题的接口.除此之外,审计日志信息还包含有每次调用接口时客户端请求的参数信 ...
- Hive篇---Hive与Hbase整合
一.前述 Hive会经常和Hbase结合使用,把Hbase作为Hive的存储路径,所以Hive整合Hbase尤其重要. 二.具体步骤 hive和hbase同步https://cwiki.apache ...