问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

php中__set和__get要怎么理解?

发布网友 发布时间:2022-04-29 14:19

我来回答

5个回答

懂视网 时间:2022-04-29 18:41

一般来说,总是把类的属性定义为private,这更符合现实的逻辑。但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数“__get()”和“__set()”来获取和赋值其属性。类似于java中的javabean的操作,使用的方法也类似,只是不需要像javabean中那样,对每个字段进行set和get的操作。只需要加上两个魔术方法即可。即私有成员的设值和取值的操作。

(推荐教程:php视频教程)

在 PHP5 中给我们提供了专门为属性设置值和获取值的方法,“ __set() ”和“ __get() ”这两个方法,这两个方法不是默认存在的,而是我们手工添加到类里面去的,像构造方法 (__construct()) 一样 , 类里面添加了才会存在,可以按下面的方式来添加这两个方法,当然也可以按个人的风格来添加:

//__set() 方法用来设置私有属性
 public function __set($name,$value){
 $this->$name = $value;
 }
 
//__get() 方法用来获取私有属性
 public function __get($name){
 return $this->$name;
 }

__get() 方法:这个方法用来获取私有成员属性值的 , 有一个参数, 参数传入你要获取的成员属性的名称,返回获取的属性值, 这个方法不用我们手工的去调用,因此我们也可以把这个方法做成私有的方法, 是在直接获取私有属性的时候对象自动调用的。

因为私有属性已经被封装上了,是不能直接获取值的 ,但是如果你在类里面加上了这个方法,在使用“ echo$p1->name ” 这样的语句直接获取值的时候就会自动调用 __get($name) 方法,将属性 name 传给参数 $name ,通过这个方法的内部执行,返回我们传入的私有属性的值。如果成员属性不封装成私有的,对象本身就不会去自动调用这个方法。

__set() 方法:这个方法用来为私有成员属性设置值的,有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。这个方法同样不用我们手工去调用,它也可以做成私有的,是在直接设置私有属性值的时候自动调用的。

同样属性私有的已经被封装上了, 如果没有 __set() 这个方法,是不允许的, 比如: $this->name= ‘ zhangsan ’ , 这样会出错,但是如果你在类里面加上了 __set($property_name, $value) 这个方法,在直接给私有属性赋值的时候,就会自动调用它,把属性比如 name 传给 $property_name, 把要赋的值“ zhangsan ”传给 $value ,通过这个方法的执行,达到赋值的目的。

如果成员属性不封装成私有的,对象本身就不会去自动调用这个方法。为了不传入非法的值, 还可以在这个方法给做一下判断。

代码如下:

<?php
class Person
{
// 下面是人的成员属性,都是封装的私有成员
private $ name ; // 人的名子
private $ sex ; // 人的性别
private $ age ; // 人的年龄
//__get() 方法用来获取私有属性
private function __get( $ property_name )
{
echo " 在直接获取私有属性值的时候,自动调用了这个 __get() 方法 <br>" ;
if ( isset ( $ this -> $ property_name ))
{
return ( $ this -> $ property_name );
}
else
{
return ( NULL );
}
}
//__set() 方法用来设置私有属性
private function __set( $ property_name , $ value )
{
echo " 在直接设置私有属性值的时候,自动调用了这个 __set() 方法为私有属性赋值 <br>" ;
$ this -> $ property_name = $ value ;
}
}
$ p1 = new Person();
// 直接为私有属性赋值的操作,会自动调用 __set() 方法进行赋值
$ p1 ->name= " 张三 " ;
$ p1 ->sex= " 男 " ;
$ p1 ->age= 20 ;
// 直接获取私有属性的值,会自动调用 __get() 方法,返回成员属性的值
echo " 姓名: " . $ p1 ->name. "<br>" ;
echo " 性别: " . $ p1 ->sex. "<br>" ;
echo " 年龄: " . $ p1 ->age. "<br>" ;
?>

执行结果:

在直接设置私有属性值的时候,自动调用了这个 __set() 方法为私有属性赋值
在直接设置私有属性值的时候,自动调用了这个 __set() 方法为私有属性赋值
在直接设置私有属性值的时候,自动调用了这个 __set() 方法为私有属性赋值
在直接获取私有属性值的时候,自动调用了这个 __get() 方法
姓名:张三
在直接获取私有属性值的时候,自动调用了这个 __get() 方法
性别:男
在直接获取私有属性值的时候,自动调用了这个 __get() 方法
年龄: 20

以上代码如果不加上__get()和__set()方法,程序就会出错,因为不能在类的外部操作私有成员,而上面的代码是通过自动调用__get()和__set()方法来帮助我们直接存取封装的私有成员的。

热心网友 时间:2022-04-29 15:49

没什么绕不过弯的东西啊,就是表面上定义的那样,php面向对象里面的取值和赋值,没必要把简单的问题复杂化

追问好吧,就是理解差,有些地方不明白

热心网友 时间:2022-04-29 17:07

__get()方法:这个方法用来获取私有成员属性值的,有一个参数,参数传入你要获取的成员属性的名称,返回获取的属性值。如果成员属性不封装成私有的,对象本身就不会去自动调用这个方法。
__set()方法:这个方法用来为私有成员属性设置值的,有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。(key=>value)

热心网友 时间:2022-04-29 18:41

通俗来说__set就是给类的私有属性赋值

__get获取类私有属性的值

热心网友 时间:2022-04-29 20:33

$ibj是一个类的实例

$obj–>a的时候自动调用__get

$obj–>a=10的时候自动调用__set

一般每个类都会有的,不用实现
除非你想自己定义一个关于这个类的规则,如想讲每个类的$a属性的取值都加10的情况
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 如何避免wps卡顿? 属鼠的男人找对象是属什么,属鼠的人和什么属相合 96年鼠的姻缘在哪年 属相相合年份运势提升 2024属鼠找对象属什么最佳 黑客攻击网站能报案吗 iphone6微博怎样设置桌面提醒 三星手机换机的流程是什么样的,已有 三星手机怎么一键换机 两本结婚证都丢了怎么补 解密 赶尸艳谈中,男主角是不是真的插入了 结婚证丢失怎么补办 兵马俑坑中,总共有哪些兵种?其中俑数最少的是哪个兵种,最特殊的是哪个兵种? 两份结婚证丢失了一本该怎么补办 电脑上的RB RT 和LT 都是什么键子 跪的兵马俑叫什么 结婚证弄丢了怎么办,两本结婚证都丢失了? 手机显示进程安卓系统已停止运行怎么办 兵马俑中的一张脸,为啥困扰了考古学家这么多年? “进程android.process.acore已停止运行”的问题怎么解决? 如何把LOL同时显示在两个显示器。 总是出现很抱歉,程序已停止运行怎么办 LOL双人分屏能玩吗?或者外接显示器 谁会写培训报告总结格式? 超速20%未达50%怎么处理扣6分 LOL比赛时可以看队友的屏幕吗 三星手机换机问题 口感丰厚的骨肉相连怎么做好吃又简单,做法图解分享 请问一下三星手机的一健换机功能在哪里? iphone锁屏状态如何再次显示微博或微信信息提示 快剪辑如何把横的视频做成竖的播放 手机拍的横屏视频为什么导入电脑就变成竖屏的了?怎么变回横屏的,同时清晰度不变? 长方形的s代表什么 王者荣耀录屏精彩时刻素材如何变成竖屏? oa办公win10无法上传附件 网上火车票改签出现改签中是什么意思? 请问贵阳航空职业技术学院好么?环境怎么样?教学质量可好?毕业就业 贵州航空职业技术学院专业 贵州航空职业技术学院怎么样?和贵州航天比起来怎么样?机电一体化专业。未来的发展前景如何?好找工作吗_百度问一问 长方形的面积=___;S=___. 您好!OA系统不能上传附件,您是怎么解决的? 盘州市海航学院是民办还是公办? 用S表示长方形的面积,a表示长方形的长,b表示长方形的宽,C表示长方形的周长。那么,S=(),C= oa无法上传附件所有控件都已经安装完成,intnet安全级别也下调了,但是仍然不能上传附件,是什么原因, 贵州航空职业技术学院专业这个学校高铁专业去实习真的是去电子厂吗?而且是强制性要求_百度问一问 OA无法上传附件及提交流程,怎么办?