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 裁剪图片成固定大小代码方法
Sep 09 PHP
PHP教程之PHP中shell脚本的使用方法分享
Feb 23 PHP
dhtmlxTree目录树增加右键菜单以及拖拽排序的实现方法
Apr 26 PHP
PHP批量检测并去除文件BOM头代码实例
May 08 PHP
CodeIgniter中使用cookie的三种方式详解
Jul 18 PHP
php检查日期函数checkdate用法实例
Mar 19 PHP
关于PHP开发的9条建议
Jul 27 PHP
yii gridview实现时间段筛选功能
Aug 15 PHP
php7函数,声明,返回值等新特性介绍
May 25 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
Oct 12 PHP
PHP Trait代码复用类与多继承实现方法详解
Jun 17 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
Sep 02 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
当海贼王变成JOJO风
2020/03/02 日漫
一个程序下载的管理程序(四)
2006/10/09 PHP
PHP解决URL中文GBK乱码问题的两种方法
2014/06/03 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
2017/02/06 PHP
PHP多种序列化/反序列化的方法详解
2017/06/23 PHP
PHP 代码简洁之道(小结)
2019/10/16 PHP
jQuery实现原理的模拟代码 -6 代码下载
2010/08/16 Javascript
Kibo 用于处理键盘事件的Javascript工具库
2011/10/28 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
jQuery中的$.ajax()方法应用
2014/05/06 Javascript
基于jquery实现智能表单验证操作
2016/05/09 Javascript
jQuery实现的可编辑表格完整实例
2016/06/20 Javascript
Bootstrap被封装的弹层
2016/07/20 Javascript
BootStrap 附加导航组件
2016/07/22 Javascript
javascript使用闭包模拟对象的私有属性和方法
2016/10/05 Javascript
jQuery Password Validation密码验证
2016/12/30 Javascript
100多个基础常用JS函数和语法集合大全
2017/02/16 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
微信小程序之页面拦截器的示例代码
2017/09/07 Javascript
vue 2.1.3 实时显示当前时间,每秒更新的方法
2018/09/16 Javascript
解决vue+router路由跳转不起作用的一项原因
2020/07/19 Javascript
[01:03:27]NAVI vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python实现TCP协议下的端口映射功能的脚本程序示例
2016/06/14 Python
Python自动化测试Eclipse+Pydev 搭建开发环境
2016/08/15 Python
python smtplib模块自动收发邮件功能(一)
2018/05/22 Python
python贪吃蛇游戏代码
2020/04/18 Python
使用python实现哈希表、字典、集合操作
2019/12/22 Python
Python 将json序列化后的字符串转换成字典(推荐)
2020/01/06 Python
Python模块future用法原理详解
2020/01/20 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
2020/04/13 Python
Pytorch学习之torch用法----比较操作(Comparison Ops)
2020/06/28 Python
最新Python idle下载、安装与使用教程图文详解
2020/11/28 Python
涂鸦板简单实现 Html5编写属于自己的画画板
2016/07/05 HTML / CSS
Html5元素及基本语法详解
2016/08/02 HTML / CSS
2014县政府领导班子对照检查材料思想汇报
2014/09/25 职场文书
oracle删除超过N天数据脚本的方法
2022/02/28 Oracle