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判断变量类型常用方法
Apr 24 PHP
PHP代码审核的详细介绍
Jun 13 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
Dec 20 PHP
ThinkPHP3.1新特性之Action参数绑定
Jun 19 PHP
php实现表单多按钮提交action的处理方法
Oct 24 PHP
php开发工具有哪五款
Nov 09 PHP
PHP编程基本语法快速入门手册
Jan 07 PHP
php基于PDO连接MSSQL示例DEMO
Jul 13 PHP
php命名空间设计思想、用法与缺点分析
Jul 17 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
Aug 06 PHP
如何在Laravel之外使用illuminate组件详解
Sep 20 PHP
PHP7 参数处理机制修改
Mar 09 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
通过文字传递创建的图形按钮
2006/10/09 PHP
国外比较好的几个的Php开源建站平台小结
2010/04/22 PHP
JSON 入门指南 想了解json的朋友可以看下
2009/08/26 Javascript
javascript奇异的arguments分析
2010/10/20 Javascript
js过滤HTML标签以及空格的思路及代码
2013/05/24 Javascript
详解JavaScript函数绑定
2013/08/18 Javascript
Windows 系统下安装和部署Egret的开发环境
2014/07/31 Javascript
深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解
2015/03/05 Javascript
在JavaScript中call()与apply()区别
2016/01/22 Javascript
javascript实现计时器的简单方法
2016/02/21 Javascript
Bootstrap的Refresh Icon也spin起来
2016/07/13 Javascript
jquery删除table当前行的实例代码
2016/10/07 Javascript
vue实现点击图片放大效果
2017/08/15 Javascript
vue.js 微信支付前端代码分享
2018/02/10 Javascript
vue和react等项目中更简单的实现展开收起更多等效果示例
2018/02/22 Javascript
深入分析在Python模块顶层运行的代码引起的一个Bug
2014/07/04 Python
跟老齐学Python之编写类之四再论继承
2014/10/11 Python
在Python的列表中利用remove()方法删除元素的教程
2015/05/21 Python
python并发编程之线程实例解析
2017/12/27 Python
python中的不可变数据类型与可变数据类型详解
2018/09/16 Python
对Python 内建函数和保留字详解
2018/10/15 Python
python调用staf自动化框架的方法
2018/12/26 Python
Pandas统计重复的列里面的值方法
2019/01/30 Python
Python中正则表达式的用法总结
2019/02/22 Python
如何用OpenCV -python3实现视频物体追踪
2019/12/04 Python
opencv中图像叠加/图像融合/按位操作的实现
2020/04/01 Python
详解python的变量缓存机制
2021/01/24 Python
html5中如何将图片的绝对路径转换成文件对象
2018/01/11 HTML / CSS
英国曼彻斯特宠物用品品牌:Bunty Pet Products
2019/07/27 全球购物
程序员岗位职责
2013/11/11 职场文书
信息专业大学生自我评价分享
2014/01/17 职场文书
《争吵》教学反思
2014/02/15 职场文书
集中采购方案
2014/06/10 职场文书
2014年维修工作总结
2014/11/22 职场文书
实习科室评语
2015/01/04 职场文书
雨中的树观后感
2015/06/03 职场文书