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 的 __FILE__ 常量
Jan 15 PHP
php 分页原理详解
Aug 21 PHP
PHP中创建图像并绘制文字的例子
Nov 19 PHP
thinkPHP使用post方式查询时分页失效的解决方法
Dec 09 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
Dec 24 PHP
PHP GD库相关图像生成和处理函数小结
Sep 30 PHP
在php7中MongoDB实现模糊查询的方法详解
May 03 PHP
PHP设计模式之工厂模式(Factory Pattern)的讲解
Mar 21 PHP
Laravel如何同时连接多个数据库详解
Aug 13 PHP
解决laravel groupBy 对查询结果进行分组出现的问题
Oct 09 PHP
Laravel5.1 框架路由基础详解
Jan 04 PHP
让whoops帮我们告别ThinkPHP6的异常页面
Mar 02 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
虹吸壶是谁发明的?煮出来的咖啡好喝吗
2021/03/04 冲泡冲煮
PHP通用检测函数集合
2006/11/25 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
深入分析PHP优化及注意事项
2016/07/04 PHP
PHP验证终端类型是否为手机的简单实例
2017/02/07 PHP
PHP7下协程的实现方法详解
2017/12/17 PHP
PHP rsa加密解密算法原理解析
2020/12/09 PHP
extjs grid取到数据而不显示的解决
2008/12/29 Javascript
javascript 写类方式之八
2009/07/05 Javascript
js DOM模型操作
2009/12/28 Javascript
JS获取IMG图片高宽的简单实例
2016/05/17 Javascript
Bootstrap学习笔记之css样式设计(2)
2016/06/07 Javascript
JavaScript 函数模式详解及示例
2016/09/07 Javascript
JSON 对象未定义错误的解决方法
2016/09/29 Javascript
js利用appendChild对标签进行排序的实现方法
2016/10/16 Javascript
javascript 操作cookies详解及实例
2017/02/22 Javascript
整理关于Bootstrap列表组的慕课笔记
2017/03/29 Javascript
laydate日历控件使用方法详解
2017/11/20 Javascript
Angular2进阶之如何避免Dom误区
2018/04/02 Javascript
vue弹窗消息组件的使用方法
2020/09/24 Javascript
python中os操作文件及文件路径实例汇总
2015/01/15 Python
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
web.py在SAE中的Session问题解决方法(使用mysql存储)
2015/06/24 Python
Python使用pickle模块储存对象操作示例
2018/08/15 Python
关于Python作用域自学总结
2019/06/10 Python
DataFrame.to_excel多次写入不同Sheet的实例
2019/12/02 Python
利用PyCharm操作Github(仓库新建、更新,代码回滚)
2019/12/18 Python
python 成功引入包但无法正常调用的解决
2020/03/09 Python
pyqt5中动画的使用详解
2020/04/01 Python
Lulu & Georgia官方网站:购买地毯、家具、抱枕、壁纸、床上用品等
2018/03/19 全球购物
美国艺术和工艺品商店:Hobby Lobby
2020/12/09 全球购物
4s店总经理岗位职责
2013/12/31 职场文书
人大代表选举标语
2014/10/07 职场文书
给老婆的道歉信
2015/01/20 职场文书
保险公司2016开门红口号集锦
2015/12/24 职场文书
导游词之清晏园
2019/11/22 职场文书