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

合肥