PHP获取对象属性的三种方法实例分析


Posted in PHP onJanuary 03, 2019

本文实例讲述了PHP获取对象属性的三种方法。分享给大家供大家参考,具体如下:

今天查看yii源码,发现yii\base\Model中的attribute()方法是通过反射获取对象的public non-static属性。记得以前看到的代码都是用get_object_vars()这个函数获取的,昨天查看php文档,发现还可以用foreach遍历对象属性。于是写个例子练习下。

class TestClass {
  private $a;
  protected $b;
  public $c;
  public $d;
  public static $e;
  private function funcA() {
  }
  protected function funcB() {
  }
  public function funcC() {
  }
  public function getPropertyMethodOne() {
    echo "[get_object_vars]", PHP_EOL;
    $vars = get_object_vars($this);
    foreach ($vars as $k => $v) {
      echo $k, ' => ', $v, PHP_EOL;
    }
  }
  public function getPropertyMethodTwo() {
    echo "[foreach object]", PHP_EOL;
    foreach ($this as $k => $v) {
      echo $k, ' => ', $v, PHP_EOL;
    }
  }
  public function getPropertyMethodThree() {
    echo "[reflection]", PHP_EOL;
    $class = new ReflectionClass($this);
    foreach ($class->getProperties(ReflectionProperty::IS_PUBLIC) as $property) {
      if (!$property->isStatic()) {
        echo $property->getName(), ' => ', $property->getValue($this), PHP_EOL;
      }
    }
  }
}

测试代码一

$obj = new TestClass();
echo "[get_object_vars]", PHP_EOL;
$vars = get_object_vars($obj);
foreach ($vars as $k => $v) {
  echo $k, ' => ', $v, PHP_EOL;
}
echo "[foreach object]", PHP_EOL;
foreach ($obj as $k => $v) {
  echo $k, ' => ', $v, PHP_EOL;
}
echo "[reflection]", PHP_EOL;
$class = new ReflectionClass($obj);
foreach ($class->getProperties(ReflectionProperty::IS_PUBLIC) as $property) {
  if (!$property->isStatic()) {
    echo $property->getName(), ' => ', $property->getValue($obj), PHP_EOL;
  }
}

输出:

[get_object_vars]
c =>
d =>
[foreach object]
c =>
d =>
[reflection]
c =>
d =>

可见,当着三种方法用在类的外部时,结果是一样的。get_object_vars()和foreach是获取到的是对象的public non-static属性,而通过反射的话则需要手动筛选出public non-static属性。

测试代码二

$obj = new TestClass();
$obj->getPropertyMethodOne();
$obj->getPropertyMethodTwo();
$obj->getPropertyMethodThree();

输出

[get_object_vars]
a =>
b =>
c =>
d =>
[foreach object]
a =>
b =>
c =>
d =>
[reflection]
c =>
d =>

可见,get_object_vars()和foreach用在类内部时,private、protected、public的实例属性都能获取到。反射就不用说了,通过手动筛选,各种类型的属性都能获取到。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
使用PHP维护文件系统
Oct 09 PHP
PHP4(windows版本)中的COM函数
Oct 09 PHP
一个用php实现的获取URL信息的类
Jan 02 PHP
mysql From_unixtime及UNIX_TIMESTAMP及DATE_FORMAT日期函数
Mar 21 PHP
深入解析fsockopen与pfsockopen的区别
Jul 05 PHP
PHP通过插入mysql数据来实现多机互锁实例
Nov 05 PHP
PHP实现扎金花游戏之大小比赛的方法
Mar 10 PHP
php商品对比功能代码分享
Sep 24 PHP
PHP基于单例模式实现的mysql类
Jan 09 PHP
详解PHP编码转换函数应用技巧
Oct 22 PHP
PHP中list方法用法示例
Dec 01 PHP
PHP使用文件锁解决高并发问题示例
Mar 29 PHP
PHP获取HTTP body内容的方法
Dec 31 #PHP
php两点地理坐标距离的计算方法
Dec 29 #PHP
php如何计算两坐标点之间的距离
Dec 29 #PHP
PHP命名空间简单用法示例
Dec 28 #PHP
PHP实现函数内修改外部变量值的方法示例
Dec 28 #PHP
PHP面向对象程序设计继承用法简单示例
Dec 28 #PHP
PHP抽象类基本用法示例
Dec 28 #PHP
You might like
PHP+jQuery 注册模块的改进(三):更新到Smarty3.1
2014/10/14 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
javascript中直接写php代码的方法
2013/07/31 Javascript
Jquery动态更改一张位图的src与Attr的使用
2013/07/31 Javascript
js字符串转换成数字与数字转换成字符串的实现方法
2014/01/08 Javascript
javascript实现锁定网页、密码解锁效果(类似系统屏幕保护效果)
2014/08/15 Javascript
JavaScript 学习笔记之语句
2015/01/14 Javascript
javascript Slip.js实现整屏滑动的手机网页
2015/11/25 Javascript
谈谈JS中常遇到的浏览器兼容问题和解决方法
2016/12/17 Javascript
Bootstrap和Java分页实例第一篇
2016/12/23 Javascript
Bootstrap 表单验证formValidation 实现远程验证功能
2017/05/17 Javascript
JavaScript数据类型的存储方法详解
2017/08/25 Javascript
基于angular-utils-ui-breadcrumbs使用心得(分享)
2017/11/03 Javascript
Angular实现的敏感文字自动过滤与提示功能示例
2017/12/29 Javascript
vue router+vuex实现首页登录验证判断逻辑
2018/05/17 Javascript
vue 使用vue-i18n做全局中英文切换的方法
2018/10/29 Javascript
js中的reduce()函数讲解
2019/01/18 Javascript
Vue项目中使用jquery的简单方法
2019/05/16 jQuery
jQuery擦除插件eraser使用方法详解
2020/01/11 jQuery
纯js实现无缝滚动功能代码实例
2020/02/21 Javascript
微信小程序wx.getUserInfo授权获取用户信息(头像、昵称)的实现
2020/08/19 Javascript
Python实现爬取百度贴吧帖子所有楼层图片的爬虫示例
2018/04/26 Python
python的继承知识点总结
2018/12/10 Python
对pyqt5之menu和action的使用详解
2019/06/20 Python
详解pandas中MultiIndex和对象实际索引不一致问题
2019/07/23 Python
python读写csv文件的方法
2019/08/13 Python
学习Python列表的基础知识汇总
2020/03/10 Python
python函数中将变量名转换成字符串实例
2020/05/11 Python
基于Python爬取京东双十一商品价格曲线
2020/10/23 Python
虚拟环境及venv和virtualenv的区别说明
2021/02/05 Python
html table呈现个人简历以及单元格宽度失效的问题解决
2021/01/22 HTML / CSS
Myprotein葡萄牙官方网站:英国优质运动营养品牌
2016/09/12 全球购物
医院工作检讨书范文
2014/02/10 职场文书
晋江市人民政府党组群众路线教育实践活动整改方案
2014/10/25 职场文书
结婚通知短信怎么写
2015/04/17 职场文书
2016党员党章学习心得体会
2016/01/14 职场文书