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
合肥