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 相关文章推荐
支持oicq头像的留言簿(一)
Oct 09 PHP
php xml实例 留言本
Mar 20 PHP
php下将图片以二进制存入mysql数据库中并显示的实现代码
May 27 PHP
注册页面之前先验证用户名是否存在的php代码
Jul 14 PHP
PHP判断指定时间段的2个方法
Mar 14 PHP
PHP遍历数组的三种方法及效率对比分析
Feb 12 PHP
php清除和销毁session的方法分析
Mar 19 PHP
CodeIgniter辅助之第三方类库third_party用法分析
Jan 20 PHP
PHP将URL转换成短网址的算法分享
Sep 13 PHP
php批量删除操作(数据访问)
May 23 PHP
postman的安装与使用方法(模拟Get和Post请求)
Aug 06 PHP
laravel请求参数校验方法
Oct 10 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
is_uploaded_file函数引发的不能上传文件问题
2013/10/29 PHP
php查找任何页面上的所有链接的方法
2013/12/03 PHP
记录一次排查PHP脚本执行卡住的问题
2016/12/27 PHP
Jsonp 跨域的原理以及Jquery的解决方案
2010/05/18 Javascript
从QQ网站中提取的纯JS省市区三级联动菜单
2013/12/25 Javascript
超级简单的jquery操作表格方法
2014/12/15 Javascript
AngularJS 指令详细介绍
2016/07/27 Javascript
js判断所有表单项不为空则提交表单的实现方法
2016/09/09 Javascript
js窗口震动小程序分享
2016/11/28 Javascript
EditPlus 正则表达式 实战(3)
2016/12/15 Javascript
jQuery使用EasyUi实现三级联动下拉框效果
2017/03/08 Javascript
Vue2.0使用过程常见的一些问题总结学习
2017/04/10 Javascript
CentOS 安装NodeJS V8.0.0的方法
2017/06/15 NodeJs
原生js二级联动效果
2017/06/20 Javascript
vue实现组件之间传值功能示例
2018/07/13 Javascript
vue 权限认证token的实现方法
2018/07/17 Javascript
layui 解决form表单点击无反应的问题
2019/10/25 Javascript
小程序实现上下切换位置
2020/11/16 Javascript
Python抓取京东图书评论数据
2014/08/31 Python
Python实现抓取页面上链接的简单爬虫分享
2015/01/21 Python
Python正则表达式匹配HTML页面编码
2015/04/08 Python
修改Python的pyxmpp2中的主循环使其提高性能
2015/04/24 Python
简单了解Python中的几种函数
2017/11/03 Python
浅析python参数的知识点
2018/12/10 Python
Pytorch之contiguous的用法
2019/12/31 Python
Python中qutip用法示例详解
2020/10/02 Python
Python利用matplotlib绘制散点图的新手教程
2020/11/05 Python
彪马美国官网:PUMA美国
2017/03/09 全球购物
城市观光通行证:The Sightseeing Pass
2018/04/28 全球购物
The Outnet亚太地区:折扣设计师时装店
2019/12/05 全球购物
英语专业毕业生自我鉴定
2013/11/09 职场文书
董事长助理岗位职责
2014/02/18 职场文书
幼儿园园长安全责任书
2015/05/08 职场文书
小平您好观后感
2015/06/09 职场文书
2016公司中秋节寄语
2015/12/07 职场文书