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 相关文章推荐
JAVA/JSP学习系列之六
Oct 09 PHP
PHP获得用户使用的代理服务器ip即真实ip
Dec 31 PHP
用PHP连接MySQL代码的参数说明
Jun 07 PHP
php 过滤危险html代码
Jun 29 PHP
PHP写的获取各搜索蜘蛛爬行记录代码
Aug 21 PHP
PHP 自定义错误处理函数trigger_error()
Mar 26 PHP
ThinkPHP利用PHPMailer实现邮件发送实现代码
Sep 26 PHP
php中函数前加&符号的作用分解
Jul 08 PHP
PHP 正则表达式小结
Feb 12 PHP
CodeIgniter配置之config.php用法实例分析
Jan 19 PHP
postman的安装与使用方法(模拟Get和Post请求)
Aug 06 PHP
php精度计算的问题解析
Jun 21 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
别人整理的服务器变量:$_SERVER
2006/10/20 PHP
一段php加密解密的代码
2007/07/16 PHP
PHP字符串 ==比较运算符的副作用
2009/10/21 PHP
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
2012/09/23 PHP
PHP根据传入参数合并多个JS和CSS文件的简单实现
2014/06/13 PHP
smarty内部日期函数html_select_date()用法实例分析
2015/07/08 PHP
PHP单例模式模拟Java Bean实现方法示例
2018/12/07 PHP
Span元素的width属性无效果原因及解决方案
2010/01/15 Javascript
Dom与浏览器兼容性说明
2010/10/25 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
2014/03/12 Javascript
jquery列表拖动排列(由项目提取相当好用)
2014/06/17 Javascript
Javascript无参数和有参数类继承问题解决方法
2015/03/02 Javascript
js闭包所用的场合以及优缺点分析
2015/06/22 Javascript
JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
2016/06/24 Javascript
js数组去重的hash方法
2016/12/22 Javascript
微信小程序实现顶部普通选项卡效果(非swiper)
2020/06/19 Javascript
vue 引入公共css文件的简单方法(推荐)
2018/01/20 Javascript
Element输入框带历史查询记录的实现示例
2019/01/15 Javascript
CKEditor 4.4.1 添加代码高亮显示插件功能教程【使用官方推荐Code Snippet插件】
2019/06/14 Javascript
vue+webpack dev本地调试全局样式引用失效的解决方案
2019/11/12 Javascript
使用Python对MySQL数据操作
2017/04/06 Python
用Django实现一个可运行的区块链应用
2018/03/08 Python
python3库numpy数组属性的查看方法
2018/04/17 Python
Python之两种模式的生产者消费者模型详解
2018/10/26 Python
python 协程 gevent原理与用法分析
2019/11/22 Python
python实现横向拼接图片
2020/03/23 Python
C++:memset ,memcpy和strcpy的根本区别
2013/04/27 面试题
亿企通软件测试面试题
2012/04/10 面试题
五分钟演讲稿
2014/04/30 职场文书
学校安全教育月活动总结
2014/07/07 职场文书
承诺书模板
2014/08/30 职场文书
会计师事务所实习证明
2014/11/16 职场文书
JavaScript原始值与包装对象的详细介绍
2021/05/11 Javascript
Springboot/Springcloud项目集成redis进行存取的过程解析
2021/12/04 Redis
redis调用二维码时的不断刷新排查分析
2022/04/01 Redis
Java 异步任务计算FutureTask
2022/04/28 Java/Android