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)來實現對象遍歷,感興趣的同學,可以嘗試一下。
