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安装全攻略:APACHE
Oct 09 PHP
截获网站title标签之家内容的例子
Oct 09 PHP
SMARTY学习手记
Jan 04 PHP
Dedecms常用函数解析
Feb 01 PHP
php简单静态页生成过程
Mar 27 PHP
php统计时间和内存使用情况示例分享
Mar 13 PHP
php中get_cfg_var()和ini_get()的用法及区别
Mar 04 PHP
PHP上传文件参考配置大文件上传
Dec 16 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
Jan 07 PHP
PHP判断是否是微信打开,浏览器打开的方法
Mar 14 PHP
php抽象类和接口知识点整理总结
Aug 02 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
Sep 18 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
?生?D片??C字串
2006/12/06 PHP
PHP中$_SERVER的详细参数与说明
2008/07/29 PHP
php好代码风格的阶段性总结
2016/06/25 PHP
php把时间戳转换成多少时间之前函数的实例
2016/11/16 PHP
Yii框架的布局文件实例分析
2019/09/04 PHP
一段利用WSH获取登录时间的jscript代码
2008/05/11 Javascript
jQuery 1.3 和 Validation 验证插件1.5.1
2009/07/09 Javascript
jQuery 获取对象 基本选择与层级
2010/05/31 Javascript
JavaScript具有类似Lambda表达式编程能力的代码(改进版)
2010/09/14 Javascript
jquery maxlength使用说明
2011/09/09 Javascript
javascript克隆对象深度介绍
2012/11/20 Javascript
浅谈checkbox的一些操作(实战经验)
2013/11/20 Javascript
JS获取URL中参数值(QueryString)的4种方法分享
2014/04/12 Javascript
jQuery实现异步获取json数据的2种方式
2014/08/29 Javascript
移动手机APP手指滑动切换图片特效附源码下载
2015/11/30 Javascript
JS及PHP代码编写八大排序算法
2016/07/12 Javascript
Nodejs 发送Post请求功能(发短信验证码例子)
2017/02/09 NodeJs
JS验证输入的是否是数字及保留几位小数问题
2018/05/09 Javascript
JavaScript基础教程之如何实现一个简单的promise
2018/09/11 Javascript
layui表格数据重载
2019/07/27 Javascript
javascript之分片上传,断点续传的实际项目实现详解
2019/09/05 Javascript
JS实现纸牌发牌动画
2021/01/19 Javascript
python常规方法实现数组的全排列
2015/03/17 Python
利用Python中unittest实现简单的单元测试实例详解
2017/01/09 Python
python执行使用shell命令方法分享
2017/11/08 Python
Python简单实现查找一个字符串中最长不重复子串的方法
2018/03/26 Python
python实现在图片上画特定大小角度矩形框
2018/10/24 Python
Pandas删除数据的几种情况(小结)
2019/06/21 Python
外贸采购员求职的自我评价
2013/11/26 职场文书
全国道德模范事迹
2014/02/01 职场文书
职业生涯规划书结束语
2014/04/15 职场文书
学习方法演讲稿
2014/05/10 职场文书
2015年街道办事处工作总结
2015/05/22 职场文书
六五普法先进个人主要事迹材料
2015/11/03 职场文书
关于战胜挫折的名言警句大全!
2019/07/05 职场文书
SQL SERVER中的流程控制语句
2022/05/25 SQL Server