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 相关文章推荐
一个用于MySQL的PHP XML类
Oct 09 PHP
关于PHP的相似度计算函数:levenshtein的使用介绍
Apr 15 PHP
WampServer搭建php环境时遇到的问题汇总
Jul 23 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
Sep 14 PHP
php+ajax实现无刷新分页
Nov 18 PHP
thinkphp3.x中cookie方法的用法分析
May 19 PHP
php实现的简单中文验证码功能示例
Jan 03 PHP
php观察者模式应用场景实例详解
Feb 03 PHP
CodeIgniter框架验证码类库文件与用法示例
Mar 18 PHP
php实现的表单验证类完整示例
Aug 13 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
Oct 15 PHP
PHP超全局变量实现原理及代码解析
Sep 01 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
destoon实现不同会员组公司名称显示不同的颜色的方法
2014/08/22 PHP
JavaScript实现删除电脑的关机键
2016/07/26 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
2016/12/12 PHP
PHP的HTTP客户端Guzzle简单使用方法分析
2019/10/30 PHP
jquery 双色表格实现代码
2009/12/08 Javascript
jquery点击页面任何区域实现鼠标焦点十字效果
2013/06/21 Javascript
Angularjs 基础入门
2014/12/26 Javascript
jQuery实现鼠标划过添加和删除class的方法
2015/06/26 Javascript
jquery 获取select数组与name数组长度的实现代码
2016/06/20 Javascript
用Webpack构建Vue项目的实践
2017/11/07 Javascript
Vuejs中使用markdown服务器端渲染的示例
2017/11/22 Javascript
JavaScript寄生组合式继承实例详解
2018/01/06 Javascript
详解javascript appendChild()的完整功能
2018/08/18 Javascript
webpack 开发和生产并行设置的方法
2018/11/08 Javascript
Vue实现将数据库中带html标签的内容输出(原始HTML(Raw HTML))
2019/10/28 Javascript
python实现带声音的摩斯码翻译实现方法
2015/05/20 Python
Python实现身份证号码解析
2015/09/01 Python
Python基于回溯法子集树模板实现8皇后问题
2017/09/01 Python
python pandas中对Series数据进行轴向连接的实例
2018/06/08 Python
为什么你还不懂得怎么使用Python协程
2019/05/13 Python
Pycharm新手教程(只需要看这篇就够了)
2019/06/18 Python
使用pycharm在本地开发并实时同步到服务器
2019/08/02 Python
python中的&&及||的实现示例
2019/08/07 Python
YUV转为jpg图像的实现
2019/12/09 Python
Python openpyxl模块原理及用法解析
2020/01/19 Python
使用wxpy实现自动发送微信消息功能
2020/02/28 Python
python-xpath获取html文档的部分内容
2020/03/06 Python
Python PyQt5运行程序把输出信息展示到GUI图形界面上
2020/04/27 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
2020/06/24 Python
详解python logging日志传输
2020/07/01 Python
CSS3的常见transformation图形变化用法小结
2016/05/13 HTML / CSS
《有趣的发现》教学反思
2014/04/15 职场文书
数据保密承诺书
2014/06/03 职场文书
关爱老人标语
2014/06/21 职场文书
期末复习计划
2015/01/19 职场文书
经典人生语录分享:不畏将来,不念过去,笑对当下
2019/12/12 职场文书