总结:

(1)__get($property_name):获取私有属性$name值时,此对象会自动调用该方法,将属性name值传给参数$property_name,通过这个方法的内部

执行,返回我们传入 的私有属性的值。

(2)__set($property_name, $value):直接给私有属性赋值时,此对象会自动调用该方法,把属性比如name传给$property_name, 把要赋的值

“zhangsan”传给$value,通过这个方法的执行,达到赋值的目的。

(3)__tostring() : 当直接输出句柄(可以理解为一个实例)时,会自动执行__tostring()方法。

1.__set()与__get().

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

“__get()”和“__set()”来获取和赋值其属性,以及检查属性的“__isset()”和删除属性的方法 “__unset()”。

我们为每个属性做了设置和获取的方法,在PHP5中给我们提供了专门为属性设置值和获 取值的方法,“__set()”和“__get()”这两个方法,这两个方法不是默认存在的,

而是我们手工添加到类里面去的,像构造方法 (__construct())一样, 类里面添加了才会存在,可以按下面的方式来添加这两个方法,当然也可以按个人的风格来添加: //__get()方法用来获取私有属性public function __get($property_name){ if(isset($this->$property_name)){ return($this->$property_name); }else{ return(NULL); }}//__set()方法用来设置私有属性public function __set($property_name, $value){$this->$property_name = $value;}

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

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

了, 如果没有__set()这个方法,是不允许的,比如:$this->name=‘zhangsan’, 这样会出错,但是如果你在类里面加上了__set($property_name, $value)这个方法,在直接给私有属性赋值的时候,就会自动调用它,把属性比如name传给$property_name, 把要赋的值“zhangsan”传给$value,通过这个方法的执行,达到赋值的目的。如果成员属性不封装成私有的,对象本身就不会去自动调用这个方 法。为了不传入非法的值,还可以在这个方法给做一下判断。代码如下: class Account{ public $user=1; private $pwd=2; // 自定义的格式化输出方法 public function toString(){ return "当前对象的用户名是{$this->user},密码是{$this->pwd}"; } } $a=new Account(); echo $a; echo PHP_EOL; print_r($a);

运行这段代码发现,使用toString方法后,输出的结果是可定制的,更易于理解。实际上,PHP的toString魔术方法的设计原型来源于 Java。Java中也有这么一个方法,而且在Java中,这个方法被大量使用,对于调试程序比较方便。实际上,toString方法也是一种序列化,我 们知道PHP自带serialize/unserialize也是进行序列化的,但是这组函数序列化时会产生一些无用信息,如属性字符串长度,造成存储空 间的无谓浪费。因此,可以实现自己的序列化和反序列化方法,或者json_encode/json_decode也是一个不错的选择。

为什么直接echo一个对象就会报语法错误,而如果这个对象实现toString方法后就可以直接输出呢?原因很简单,echo本来可以打印一个对 象,而且也实现了这个接口,但是PHP对其做了个限制,只有实现toString后才允许使用。从下面的PHP源代码里可以得到验证: ZEND_VM_HANDLER(40, ZEND_ECHO, CONST|TMP|VAR|CV, ANY) { zend_op *opline = EX(opline); zend_free_op free_op1; zval z_copy; zval *z = GET_OP1_ZVAL_PTR(BP_VAR_R); // 此处的代码预留了把对象转换为字符串的接口 if (OP1_TYPE != IS_CONST && Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get_method != NULL && zend_std_cast_object_tostring(z, &z_copy, IS_STRING TSRMLS_CC) == SUCCESS) { zend_print_variable(&z_copy); zval_dtor(&z_copy); } else { zend_print_variable(z); } FREE_OP1(); ZEND_VM_NEXT_OPCODE(); }

php的set 方法调用,PHP中 对象自动调用的方法:set()、get()、tostring()相关推荐

  1. PHP中 对象自动调用的方法:__set()、__get()、__tostring()

    总结: (1)__get($property_name):获取私有属性$name值时,此对象会自动调用该方法,将属性name值传给参数$property_name,通过这个方法的内部 执行,返回我们传 ...

  2. Python面向对象——面向对象介绍、实现面向对象编程、定义类、再调用类产生对象、总结__init__方法、查找顺序

    文章目录 面向对象介绍 实现面向对象编程 一:先定义类 二:再调用类产生对象 总结__init__方法 查找顺序 面向对象介绍 ''' 面向过程:核心是"过程"二字过程的终极奥义就 ...

  3. java对象数组_Java中对象数组的使用方法详解

    本文实例讲述了Java中对象数组的使用方法.分享给大家供大家参考,具体如下: 一 点睛 对象可以用数组来存放,通过下面两个步骤来实现. 1 声明以类为数据类型的数组变量,并用new分配内存空间给数组. ...

  4. java中的对象数组_Java中对象数组的使用方法详解

    本文实例讲述了java中对象数组的使用方法.分享给大家供大家参考,具体如下: 一 点睛 对象可以用数组来存放,通过下面两个步骤来实现. 1 声明以类为数据类型的数组变量,并用new分配内存空间给数组. ...

  5. js sort方法根据数组中对象的某一个属性值进行排序(实用方法)

    js sort方法根据数组中对象的某一个属性值进行排序 sort方法接收一个函数作为参数,这里嵌套一层函数用来接收对象属性名,其他部分代码与正常使用sort方法相同. var arr = [{name ...

  6. 微信小程序使用setData方法修改data中对象或数组的属性值

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到网站 微信小程序使用setData方法修改data中对象或数组的属性值 使用微信小程序开发时,涉及到data ...

  7. 实列化对象 自动调用构造方法

    package day18;public class WaDIu {public static void main(String[] args) {//实列化对象 自动调用构造方法Student s ...

  8. SVN在另类环境中实现自动提交的方法

    环境: SVN SERVER  172.16.1.100            (CentOS 5.5 X64) WEB SERVER  172.16.1.111            (CentOS ...

  9. 细说JavaScript中对象的属性和方法

    最近在回家的路上读了尼古拉斯的新书<JavaScript面向对象精要>,发现自己对对象的属性和方法不是很熟悉,特别是es5新增的部分,特写此文总结一下,同时也与大家共勉. 本文分为两部分, ...

最新文章

  1. tcp协议缓冲区溢出_关于TCP 粘包拆包,你了解吗?
  2. buu RSAroll
  3. Java基础知识:代理
  4. C语言标准字符char和字符串string
  5. Linux的僵尸进程产生原因及解决方法
  6. POJ2243 Knight Moves —— A*算法
  7. 我的邮局系统,欢迎大家注册!hotxf.com
  8. Codeforces Round #624 (Div. 3) E. Construct the Binary Tree 思维 + 构造
  9. jax-rs jax-ws_JAX-WS入门
  10. 用一张图片告诉你芯片设计
  11. 活动目录设计中需要遵循的七个原则
  12. OpenCL快速入门教程
  13. 数字逻辑速成复习备考期末
  14. 2017年精选文章集合
  15. whisper ASR体验
  16. 微信公众号群发功能的页面元素加载不全的解决办法
  17. 诛仙服务器技能修改,诛仙玩家浅析诛仙3技能修改所带来的轰动
  18. VB 从零开始编外挂
  19. python 椭圆曲线_Python、Sympy和椭圆曲线
  20. 【运维篇】运维知识点

热门文章

  1. Android获取酷狗音乐歌曲详细信息
  2. 开发者将 Sailfish 系统导入Nexus 5 运行流畅
  3. [原创方法!] 如何实现全自动登录各大网站? Cookie格式 、油猴脚本基础 解决Github邮箱验证,持久登录,免验证码
  4. 昨日关注:唐骏说盛大、微软、比尔盖茨及营销
  5. Pygame小游戏:植物大战僵尸游戏真的有“毒”?戒不掉啊~
  6. java循环屏障,Java并发编程系列23|循环屏障CyclicBarrier
  7. python访问陌生人qq空间_使用Python+Selenium模拟登录QQ空间
  8. 读Redis对比数据库数据进行稽核
  9. unicode 生僻字_生僻字打不出来怎么办?教你一招轻松应对!
  10. htcm8 android8,HTC全面屏手机 U11 Plus曝光:6寸+骁龙835,安卓8.0系统