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 Undefined index的问题
Jun 01 PHP
PhpMyAdmin中无法导入sql文件的解决办法
Jan 08 PHP
php表单提交问题的解决方法
Apr 12 PHP
php列出一个目录下的所有文件的代码
Oct 09 PHP
简单了解PHP编程中数组的指针的使用
Nov 30 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
Oct 08 PHP
php简单截取字符串代码示例
Oct 19 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
May 26 PHP
PHP使用ActiveMQ实例
Feb 05 PHP
PHP两个n位的二进制整数相加问题的解决
Aug 26 PHP
php封装的pdo数据库操作工具类与用法示例
May 08 PHP
laravel 实现划分admin和home 模块分组
Oct 15 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_Flame(Version:Progress)的原代码
2006/10/09 PHP
php的hash算法介绍
2014/02/13 PHP
Thinkphp 在api开发中异常返回依然是html的解决方式
2019/10/16 PHP
jQuery each()方法的使用方法
2010/03/18 Javascript
当json键为数字时的取值方法解析
2013/11/15 Javascript
随鼠标移动的时钟非常漂亮遗憾的是只支持IE
2014/08/12 Javascript
深入学习jQuery Validate表单验证
2016/01/18 Javascript
jQuery插件HighCharts实现的2D对数饼图效果示例【附demo源码下载】
2017/03/09 Javascript
Vue.js实现一个SPA登录页面的过程【推荐】
2017/04/29 Javascript
微信小程序图片自适应支持多图实例详解
2017/06/21 Javascript
vue2.0 根据状态值进行样式的改变展示方法
2018/03/13 Javascript
微信小程序实现单个或多个倒计时功能
2020/11/01 Javascript
[11:27]《一刀刀一天》之DOTA全时刻20:TI4总奖金突破920W TS赛事分析
2014/06/18 DOTA
[04:52]第二届DOTA2亚洲邀请赛主赛事第一天比赛集锦:OG娜迦海妖放大配合谜团大中3人
2017/04/02 DOTA
[06:59]DOTA2-DPC中国联赛3月7日Recap集锦
2021/03/11 DOTA
Python中使用urllib2防止302跳转的代码例子
2014/07/07 Python
Python fileinput模块使用介绍
2014/11/30 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
2020/03/16 Python
在Keras中利用np.random.shuffle()打乱数据集实例
2020/06/15 Python
使用pyplot.matshow()函数添加绘图标题
2020/06/16 Python
用python进行视频剪辑
2020/11/02 Python
CSS3 开发工具收集
2010/04/17 HTML / CSS
HTML5实践-图片设置成灰度图
2012/11/12 HTML / CSS
HTML5 Canvas鼠标与键盘事件demo示例
2013/07/04 HTML / CSS
浅谈利用缓存来优化HTML5 Canvas程序的性能
2015/05/12 HTML / CSS
中国双语服务优势的在线购票及活动平台:247tickets
2018/10/26 全球购物
美国牙科折扣计划:DentalPlans.com
2019/08/26 全球购物
周生生珠宝香港官网:Chow Sang Sang(香港及海外配送)
2019/09/05 全球购物
探矿工程师自荐信
2014/01/24 职场文书
幼儿教育感言
2014/02/05 职场文书
大学生会计职业生涯规划范文
2014/02/28 职场文书
销售人员工作自我评价
2014/09/21 职场文书
赞助商致辞
2015/07/30 职场文书
jquery插件实现搜索历史
2021/04/24 jQuery
python 如何用terminal输入参数
2021/05/25 Python
《最终幻想14》6.01版本4月5日推出 追加新任务新道具
2022/04/03 其他游戏