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 FPDF类库应用实现代码
Mar 20 PHP
PHP教程 基本语法
Oct 23 PHP
解析PHP缓存函数的使用说明
May 10 PHP
利用curl抓取远程页面内容的示例代码
Jul 23 PHP
PHP解决URL中文GBK乱码问题的两种方法
Jun 03 PHP
PHP 双链表(SplDoublyLinkedList)简介和使用实例
May 12 PHP
配置eAccelerator和XCache扩展来加速PHP程序的执行
Dec 22 PHP
ThinkPHP的SAE开发相关注意事项详解
Oct 09 PHP
thinkPHP简单实现多个子查询语句的方法
Dec 05 PHP
微信接口生成带参数的二维码
Jul 31 PHP
PHP面向对象程序设计之构造方法和析构方法详解
Jun 13 PHP
php校验公钥是否可用的实例方法
Sep 17 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中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
2011/05/04 PHP
php中mysql模块部分功能的简单封装
2011/09/30 PHP
php实现的http请求封装示例
2016/11/08 PHP
Zend Framework分发器用法示例
2016/12/11 PHP
php实现生成code128条形码的方法详解
2017/07/19 PHP
javascript 一个函数对同一元素的多个事件响应
2009/07/25 Javascript
jquery ui resizable bug解决方法
2010/10/26 Javascript
jquerydom对象的事件隐藏显示和对象数组示例
2013/12/10 Javascript
JSON.stringify转换JSON时日期时间不准确的解决方法
2014/08/08 Javascript
JavaScript中的lastIndexOf()方法使用详解
2015/06/06 Javascript
使用javascript提交form表单方法汇总
2015/06/25 Javascript
详解JS面向对象编程
2016/01/24 Javascript
深入理解Ajax的get和post请求
2016/06/02 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
2016/08/10 Javascript
基于bootstrap按钮式下拉菜单组件的搜索建议插件
2017/03/25 Javascript
js获取一组日期中最近连续的天数
2017/05/25 Javascript
在Vuex使用dispatch和commit来调用mutations的区别详解
2018/09/18 Javascript
微信小程序实现两个页面传值的方法分析
2018/12/11 Javascript
ES6 迭代器与可迭代对象的实现
2019/02/11 Javascript
layui 表单标签的校验方法
2019/09/04 Javascript
Vue作用域插槽实现方法及作用详解
2020/07/08 Javascript
详解Python的迭代器、生成器以及相关的itertools包
2015/04/02 Python
详解Python中的from..import绝对导入语句
2016/06/21 Python
Mac中升级Python2.7到Python3.5步骤详解
2017/04/27 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
2019/12/25 Python
Python PyPDF2模块安装使用解析
2020/01/19 Python
python代码中怎么换行
2020/06/17 Python
基于tensorflow for循环 while循环案例
2020/06/30 Python
HTML5 video 上传预览图片视频如何设置、预览视频某秒的海报帧
2018/08/28 HTML / CSS
英国运动风奢侈品购物网站:Maison De Fashion
2020/08/28 全球购物
注塑工厂厂长岗位职责
2013/12/02 职场文书
学生会干部自我鉴定2014
2014/09/18 职场文书
买房协议书范本
2014/10/23 职场文书
先进基层党组织事迹材料
2014/12/25 职场文书
幼儿园重阳节活动总结
2015/05/05 职场文书
导游词之嵊泗列岛
2019/10/30 职场文书