今天在推上看到一条获取php类私有属性的推文,感觉很有意思:

顺着推文联想,还有其他方式吗?经过自己的测试及网上答案,总结出三种方法:

1. 反射

反射可以获取类的详细信息,要获取私有属性的值,只需将对应属性的reflectionproperty实例设置为可访问再取值即可。示例代码如下:

本人之前写过“php回顾之反射”一文,比较详细的介绍了反射及用法,有兴趣的阅读参考。

2. 转换成数组

这种方法用将对象强制转换成数组,再通过键获取其值。示例代码如下:

上述代码中key的拼接方式比较诡异,key规则如下:

public属性, key是 属性名;

protected属性,key是 \0*\0属性名;

private属性, key是 \0类名\0属性名。

注意 \0 是一个字符(不是两个),对应的ascii码是数字0。编程时要用双引号将其引起来。不能使用单引号,否则转义失效,那就是两个字符。如果你有c语言基础,应该知道 \0 就是字符串的结束符。这个符号直接输出不会显示,但可以通过strlen或者ord让其现形:

还需要注意拼接private属性时类名应该是 “完全限定类名” ,建议通过foo::class的方式获取。

与强制转换成数组类似的另一种方法是serialize,但是serialize比较慢,并且序列化后的字符串更难辨认结构和处理,不建议使用。

3. 闭包

文章开头的推特截图已经展示了闭包的用法,其中call方法在php7中引入,另一个是php5.4引入的bindto。call和bindto的用法示例如下:

bindto方法的第二个参数注意传入对象的 “完全限定类名”,指示函数应该放置在该类的作用域下,从而可以访问私有属性。

总结

性能: 数组 > 反射 > 闭包

易用性: 闭包 > 数组 > 反射

推荐: 闭包 > 反射 > 数组

以上就是php获取类私有属性的3种方法的详细内容,更多关于php获取类私有属性的资料请关注萬仟网其它相关文章!

希望与广大网友互动??

点此进行留言吧!

php类3个属性是哪3种,PHP获取类私有属性的3种方法相关推荐

  1. Python面向对象,类,继承,多态及鸭子类型,获取类的类型,方法和属性(类似java的反射)

    1.创建类的代码: #在Java中,所有的最终父类都是Object #在python中也是,一个类没有直接的父类就写入objectclass Animal(object):#在python中init方 ...

  2. Python OOP:继承、单继承、多继承、__mro__、子类重写父类同名属性和方法、子类调用父类同名属性和方法、多层继承、super()、私有(实例)属性和方法、获取修改私有属性值、私有类属性

    一.继承 Python⾯向对象的继承指的是多个类之间的所属关系,即⼦类默认继承⽗类的所有属性和⽅法. 继承作用:继承可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展. 在P ...

  3. php protected 属性,PHP实现在对象之外访问其私有属性private及保护属性protected的方法...

    本文实例讲述了PHP实现在对象之外访问其私有属性private及保护属性protected的方法.,具体如下: public 表示全局的访问权限,类内部外部子类都可以访问: private表示私有的访 ...

  4. PHP中的__get()和__set()方法获取设置私有属性

    在类的封装中,获取属性可以自定义getXXX()和setXXX()方法,当一个类中有多个属性时,使用这种方式就会很麻烦.为此PHP5中预定义了__get()和__set()方法,其中__get()方法 ...

  5. java entity公共属性_java – 如何从Entity Manager获取jpa数据源属性

    大家好 我想知道是否可以通过实体管理器获取数据库连接属性. 我的persistence.xml看起来像这样 DatasourceForTestSystem some.package.and.some. ...

  6. 获取java 私有属性或 方法

    FileInputStream in = (FileInputStream) file.getInputStream();String csvPath = "";Class< ...

  7. 属性被分为八大类不包括_Python语言---私有属性

    属性分为实例属性与类属性 方法分为普通方法,类方法,静态方法 一:属性: 尽量把需要用户传入的属性作为实例属性,而把同类都一样的属性作为类属性.实例属性在每创造一个实例时都会初始化一遍,不同的实例的实 ...

  8. 封装详解,private,修改私有属性get/set方法,类和对象总结

    方法,属性,有参与无参构造函数,对私有属性private的访问get/set方法都在类中:在我们的项目中只有一个实现类main,在main中将类实例化为对象,通过对象来调用类中的方法,属性,有参与无参 ...

  9. java 获取父类的方法_java 获取类和父类的属性和方法

    问题 在日常开发中,经常需要获取当前类和父类的所有属性,没办法只能查API了. getDeclaredFields VS getFields 查阅API得知,class.getDeclaredFiel ...

最新文章

  1. 业内公认的AI发展最大挑战,有哪些技术突破机会?
  2. linux 段大小,linux - 在套接字上的Linux中减少TCP最大段大小(MSS) - 堆栈内存溢出...
  3. 同学你好,听说你想学习做硬件?
  4. Lync Server 2013无法共享PPT故障排错处理
  5. 【AI视野·今日CV 计算机视觉论文速览 第213期】Fri, 4 Jun 2021
  6. 程序员遇到什么样的工作状态应该果断跳槽走人?
  7. FlyMcu - 用于STM32芯片ISP串口程序一键下载的免费软件
  8. 捷速编辑pdf文件插入图片的方法
  9. 微信浏览器-公众号,实现地图定位
  10. 使用selenium获取网页源码
  11. 使用Hooks实现防抖节流 TS版本
  12. oracle数据库exec用法,Sql中exec的用法
  13. C++学习路线图(新)
  14. Python Re 正则表达式 数据匹配提取 基本使用
  15. MySQL主从复制和读写分离
  16. python进阶day6
  17. CHAP MS-CHAPv2 EAP
  18. kotlin一点摸索
  19. linux菜鸟基础学习(一)
  20. 话说 synchronized

热门文章

  1. 电子围栏原理解析---原理
  2. JavaScript 源型链
  3. UIButton @selector 想要传递多个参数
  4. pyglet -- 视频播放器 (简单实现,效果不是太好,切换资源会卡死)(三)
  5. Facebook Connect Magento Extension
  6. linq 学习日记-select
  7. pip 更新版本失败问题解决
  8. jmeter报“msg“:“Content type ‘application/x-www-form-urlencoded;charset=UTF-8‘ not supported“的解决方法
  9. 【报告分享】2020-2021虎嗅洞察报告:聚焦私域流量,洞察增长变局.pdf(附下载链接)...
  10. 【报告分享】2021年BrandGrow中国新锐品牌增长潜力报告.pdf(附下载链接)