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+MYSQL的文章管理系统(二)
Oct 09 PHP
APMServ使用说明
Oct 23 PHP
php 信息采集程序代码
Mar 17 PHP
phpmailer中文乱码问题的解决方法
Apr 22 PHP
php中隐形字符65279(utf-8的BOM头)问题
Aug 16 PHP
Symfony2开发之控制器用法实例分析
Feb 05 PHP
浅谈PHP中的数据传输CURL
Sep 06 PHP
Yii 2.0中场景的使用教程
Jun 02 PHP
thinkPHP中U方法加密传递参数功能示例
May 29 PHP
PHP检查URL包含特定字符串实例方法
Feb 11 PHP
PHP正则之正向预查与反向预查讲解与实例
Apr 06 PHP
PHP中SESSION过期设置
Mar 09 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
PHP网页游戏学习之Xnova(ogame)源码解读(十六)
2014/06/30 PHP
PHP实现将浏览历史页面网址保存到cookie的方法
2015/01/26 PHP
php统计数组元素个数的方法
2015/07/02 PHP
PHP实现动态web服务器方法
2015/07/29 PHP
php解决DOM乱码的方法示例代码
2016/11/20 PHP
PHP耦合设计模式实例分析
2018/08/08 PHP
extjs ColumnChart设置不同的颜色实现代码
2013/05/17 Javascript
多种方法实现JS动态添加事件
2013/11/01 Javascript
浅析Javascript使用include/require
2013/11/13 Javascript
微信小程序之MaterialDesign--input组件详解
2017/02/15 Javascript
JQuery判断正整数整理小结
2017/08/21 jQuery
jquery在vue脚手架中的使用方式示例
2017/08/29 jQuery
webpack 模块热替换原理
2018/04/09 Javascript
解决vue项目nginx部署到非根目录下刷新空白的问题
2018/09/27 Javascript
如何去除富文本中的html标签及vue、react、微信小程序中的过滤器
2018/11/21 Javascript
基于vue.js实现分页查询功能
2018/12/29 Javascript
JS根据json数组多个字段排序及json数组常用操作
2019/06/06 Javascript
mock.js模拟前后台交互
2019/07/25 Javascript
python实现基于SVM手写数字识别功能
2020/05/27 Python
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
python实现感知机线性分类模型示例代码
2019/06/02 Python
python 判断linux进程,并杀死进程的实现方法
2019/07/01 Python
django 控制页面跳转的例子
2019/08/06 Python
Python气泡提示与标签的实现
2020/04/01 Python
HTML5文档结构标签
2017/04/21 HTML / CSS
美国尼曼百货官网:Neiman Marcus
2019/09/05 全球购物
工程管理专业个人求职信范文
2013/12/07 职场文书
小学体育教学反思
2014/01/31 职场文书
人事助理自荐信
2014/02/02 职场文书
会计电算化毕业生自荐信
2014/03/03 职场文书
立案决定书范文
2015/06/24 职场文书
婚庆开业庆典主持词
2015/06/30 职场文书
安全教育主题班会教案
2015/08/12 职场文书
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python