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 HtmlReplace输入过滤安全函数
Jul 03 PHP
php 字符串替换的方法
Jan 10 PHP
php 函数中使用static的说明
Jun 01 PHP
解析如何修改phpmyadmin中的默认登陆超时时间
Jun 25 PHP
浅析linux下apache服务器的配置和管理
Aug 10 PHP
PHP利用MySQL保存session的实现思路及示例代码
Sep 09 PHP
CentOS安装php v8js教程
Feb 26 PHP
ThinkPHP控制器详解
Jul 27 PHP
php实现面包屑导航例子分享
Dec 19 PHP
php注册审核重点解析(数据访问)
May 23 PHP
PHP实现的链式队列结构示例
Sep 15 PHP
PHP PDOStatement::fetchObject讲解
Feb 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
ThinkPHP3.1新特性之对Ajax的支持更加完善
2014/06/19 PHP
PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
2015/03/10 PHP
javascript实现日历控件(年月日关闭按钮)
2012/12/12 Javascript
左侧是表头的JS表格控件(自写,网上没有的)
2013/06/04 Javascript
JS动态修改表格cellPadding和cellSpacing的方法
2015/03/31 Javascript
原生js实现的贪吃蛇网页版游戏完整实例
2015/05/18 Javascript
浅谈jQuery页面的滚动位置scrollTop、scrollLeft
2015/05/19 Javascript
jQuery判断一个元素是否可见的方法
2015/06/05 Javascript
JavaScript使用FileSystemObject对象写入文本文件内容的方法
2015/08/05 Javascript
详解获取jq ul第一个li定位的四种解决方案
2016/11/23 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
2017/04/24 Javascript
angular2 ng build部署后base文件路径问题详细解答
2017/07/15 Javascript
jQuery实现IE输入框完成placeholder标签功能的方法
2017/09/20 jQuery
详解nodejs 开发企业微信第三方应用入门教程
2019/03/12 NodeJs
node-red File读取好保存实例讲解
2019/09/11 Javascript
JavaScript实现无限轮播效果
2020/11/19 Javascript
vue打开新窗口并实现传参的图文实例
2021/03/04 Vue.js
[02:16]DOTA2英雄基础教程 干扰者
2014/01/15 DOTA
python统计一个文本中重复行数的方法
2014/11/19 Python
使用Python编写爬虫的基本模块及框架使用指南
2016/01/20 Python
Python中random模块生成随机数详解
2016/03/10 Python
详解Python中的正斜杠与反斜杠
2019/08/09 Python
如何关掉pycharm中的python console(图解)
2019/10/31 Python
打包PyQt5应用时的注意事项
2020/02/14 Python
Pyinstaller加密打包应用的示例代码
2020/06/11 Python
Python使用Selenium实现淘宝抢单的流程分析
2020/06/23 Python
Python实现小黑屋游戏的完整实例
2021/01/06 Python
HTML table 表格边框的实现思路
2019/10/12 HTML / CSS
美国领先的眼镜和太阳镜在线零售商:Glasses.com
2019/08/26 全球购物
int *p=NULL和*p= NULL有什么区别
2014/10/23 面试题
机械专业毕业生自荐信
2013/11/02 职场文书
医科学校毕业生自荐信
2013/11/09 职场文书
医院深入开展党的群众路线教育实践活动实施方案
2014/08/27 职场文书
协议书范文
2015/01/27 职场文书
Nginx同一个域名配置多个项目的实现方法
2021/03/31 Servers
JavaScript前端面试扁平数据转tree与tree数据扁平化
2022/06/14 Javascript