PHP中的对象遍历

对象的遍历,主要是指遍历对象中的,对外部可见属性。实际上就是用访问限制符public声明的属性,这点大家肯定很熟悉了。并且,在php中,遍历对象居然与遍历数组一样,都可以用使用foreach语句。

好,下面用实例来说明:

<?php

class Demo

{

  public $name;

  public $age;

  public $salary;

  public function __construct($name,$age,$salary)

  {

    $this->name = $name;

    $this->age = $age;

    $this->salary = $salary;

   }

}

//访问

$obj = new Demo('peter', 28, 3800);

foreach ($obj as $key=>$value)

{

  echo $key.'=>'.$value.'<br>';

}

访问结果是:

name=>peter

age=>28

salary=>3800

但是一个对象中,很多时候,还有私有属性和受保护的属性,这些属性外部是不可访问,那么应该如何遍历呢?很简单,尽管这些属性外部不可见,但是在类的内部都是可见的。我们只要在类的内部,声明一个公共方法,用来遍历类中所有属性,然后在类的外部,访问这个方法,就可以获取到对象的全部属性了,包括私有的和受保护的属性。

我们将代码修改一下:

<?php

class Demo

{

  public $name;

  public $age;

  public $salary;

  private $sex;  //私有属性$sex

  protected $isMarried;  //受保护属性$isMarried

  public static $home;

  public function __construct($name,$age,$salary,$sex,$isMarried)

  {

    $this->name = $name;

    $this->age = $age;

    $this->salary = $salary;

    $this->sex = $sex;

    $this->isMarried = $isMarried;

  }

  public function query()

  {

    //遍历类中非静态属性,$this与当前对象绑定

    foreach ($this as $key=>$value){

      print $key.'=>'.$value.'<br>';

    }

  }

}

//访问

$obj = new Demo('peter', 28, 3800,'male',true);

foreach ($obj as $key=>$value)

{

  echo $key.'=>'.$value.'<br>';

}

echo '<hr>';

$obj->query();

访问结果如下:

name=>peter

age=>28

salary=>3800

——————————————

name=>peter

age=>28

salary=>3800

sex=>male

isMarried=>1

其实以上的属性都是属于对象的,是非静态属性,还有一种属性叫:静态属性,比较特殊,它不属性对象,只属性类,所以不可以遍历静态属性。只能逐个输出。

例如,我们在类的内部,再声明一个静态属性

public static $home; //声明静态属性$home

然后修改一个构造方法,增加一个参数:$home,并在方法体中增加一条赋值语句:

self::$home = $home;

最后在类的外部,实例化这个类时,传入$home的实参:合肥

$obj = new Demo('peter', 28, 3800,'male',true,'合肥');

在类的外部,我们用类名访问静态属性:

 echo Demo::$home;

在类的内部,我们在query()方法中,最后添加一条输出语句:

 print self::$home;

完整代码如下:

public function query()

  {

    //遍历类中非静态属性,$this与当前对象绑定

    foreach ($this as $key=>$value){

      print $key.'=>'.$value.'<br>';

    }

    print self::$home;  //访问静态属性,self与当前类绑定

   }

再次访问,输出如下:

name=>peter

age=>28

salary=>3800

合肥

name=>peter

age=>28

salary=>3800

sex=>male

isMarried=>1

合肥

根据官方手册,除了可以上面常规的方法,来遍历数组外,还可以使用迭代器接口(IteratorAggregate)和数组访问接口(ArrayAccess)来实现对象遍历,感兴趣的同学,可以尝试一下。

PHP中的对象遍历技巧的更多相关文章

  1. winform练习-通过遍历Control容器中的对象统一委托事件-楼盘选择器

    1.窗体布局如下,一个label标签内容如下,一个btnSave按钮,用于保存,其他九个按钮用于选择楼盘. 2. 按钮存于Control容器中,编写方法遍历容器中的button,通过条件过滤掉不是bu ...

  2. iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式

    iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式 说明: 1)该文简短介绍在iOS开发中遍历字典.数组和集合的几种常见方式. 2)该文对应的代码可以在下面的地址获得:https:// ...

  3. jquery获取json对象中的key小技巧

    jquery获取json对象中的key小技巧 比如有一个json var json = {"name" : "Tom", "age" : 1 ...

  4. C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?

    C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...

  5. Java循环遍历中直接修改遍历对象

    Java 循环遍历中直接修改遍历对象如下,会报异常: for (ShopBaseInfo sp: sourceList) { if(sp.getId()==5){ sourceList.remove( ...

  6. YII框架中可以使用foreach遍历对象以及可以使用数组形式直接访问对象的原因

    YII框架中可以使用foreach遍历对象以及可以使用数组形式直接访问对象的原因在YII框架的使用过程中,我们可以使用foreach直接遍历findAll等方法返回的对象的属性为什么呢?其实这与CMo ...

  7. ES6中常用的小技巧,用了事半功倍哦

    ES6中常用的小技巧,如果能在实际项目中能使用到,必定事半功倍: 1. 强制要求参数 ES6提供了默认参数值机制,允许你为参数设置默认值,防止在函数被调用时没有传入这些参数. 在下面的例子中,我们写了 ...

  8. 避免Java中NullPointerException的Java技巧和最佳实践

    Java中的NullPointerException是我们最经常遇到的异常了,那我们到底应该如何在编写代码是防患于未然呢.下面我们就从几个方面来入手,解决这个棘手的​问题吧.​ 值得庆幸的是,通过应用 ...

  9. Unreal Engine 4 中的 UI 优化技巧

    转自:https://mp.weixin.qq.com/s/bybEHM9tF-jBPxxqXfrPOQ## Unreal Open Day 2017 活动上 Epic Games 开发者支持工程师郭 ...

随机推荐

  1. Java:从面试题“i++和++i哪个效率高?"开始学习java字节码

    今天看到一道面试题,i++和++i的效率谁高谁低. 面试题的答案是++i要高一点. 我在网上搜了一圈儿,发现很多回答也都是同一个结论. 如果早个几年,我也会认同这个看法,但现在我负责任的说,这个结论是 ...

  2. python编码问题之\"encode\"&\"decode\"

    python encode decode 编码 decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换 ...

  3. Google永远不可能回到国内,只能是回忆

    今天早上在微博上无意看 [谷歌翻译App在大陆地区恢复无障碍使用]这篇文章,不知不觉就点进去看一下,内心还是比较兴奋,为什么兴奋说不清楚.或许我们是真的喜欢Google的产品. 回想2010年Goog ...

  4. 大数据时代日志分析平台ELK的搭建

    A,首先说说ELK是啥,  ELK是ElasticSearch . Logstash 和 Kiabana 三个开源工具组成.Logstash是数据源,ElasticSearch是分析数据的,Kiaba ...

  5. Swift开发

    1. 模糊效果 iconImageView.image = UIImage(named: "1.png") //效果类实例 let blurEffect = UIBlurEffec ...

  6. 老李推荐: 第3章1节《MonkeyRunner源码剖析》脚本编写示例: MonkeyRunner API使用示例

    老李推荐: 第3章1节<MonkeyRunner源码剖析>脚本编写示例: MonkeyRunner API使用示例   MonkeyRunner这个类可以说是编写monkeyrunner脚 ...

  7. BitMap 算法

    什么是 BigMap 算法 所谓 BitMap 就是用一个 bit 位来标记某个元素对应的 value,而 key 即是这个元素.由于采用bit为单位来存储数据,因此在可以大大的节省存储空间. 算法思 ...

  8. Entity Framework快速入门--ModelFirst

    Entity Framework带给我们的不仅仅是操作上的方便,而且使用上也很是考虑了用户的友好交互,EF4.0与vs2010的完美融合也是我们选择它的一个理由吧.相比Nhibernate微软这方面做 ...

  9. python的MySQLdb模块在linux环境下的安装

    开始学习python数据库编程后,在了解了基本概念,打算上手试验一下时,卡在了MYSQLdb包的安装上,折腾了半天才解决.记录一下我在linux中安装此包遇到的问题.系统是ubuntn15.04. 1 ...

  10. Linux 入门笔记

    一开始对linux总有些抵触,黑黑的命令框不知道如何下手,这次因为工作交接的缘故需要负责之前同事的Node后端部分,node,redis这些都是部署在Linux上的,看了几次运维的同学噼里啪啦的敲命令 ...