欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

php遍歷對象的方法

 更新時間:2021年04月29日 09:03:34   作者:硬核項目經理  
這篇文章主要介紹了php遍歷對象的方法,幫助大家更好的理解和學習使用php,感興趣的朋友可以了解下

對于php來說,foreach是非常方便好用的一個語法,幾乎對于每一個PHPer它都是日常接觸最多的請求之一。那么對象是否能通過foreach來遍歷呢?

答案是肯定的,但是有個條件,那就是對象的遍歷只能獲得它的公共屬性。

// 普通遍歷
class A
{
    public $a1 = '1';
    public $a2 = '2';
    public $a3 = '3';

    private $a4 = '4';
    protected $a5 = '5';

    public $a6 = '6';

    public function test()
    {
        echo 'test';
    }
}
$a = new A();
foreach ($a as $k => $v) {
    echo $k, '===', $v, PHP_EOL;
}

// a1===1
// a2===2
// a3===3
// a6===6

不管是方法還是受保護或者私有的變量,都無法遍歷出來。只有公共的屬性才能被遍歷出來。其實,我們之前在講設計模式時講過的迭代器模式就是專門用來進行對象遍歷的,而且PHP已經為我們準備好了相關的接口,我們只需要去實現這個接口就可以完成迭代器模式的創(chuàng)建了。具體的內容可以參考之前的設計模式系列文章:PHP設計模式之迭代器模式

// 實現迭代器接口
class B implements Iterator
{
    private $var = [];

    public function __construct($array)
    {
        if (is_array($array)) {
            $this->var = $array;
        }
    }

    public function rewind()
    {
        echo "rewinding\n";
        reset($this->var);
    }

    public function current()
    {
        $var = current($this->var);
        echo "current: $var\n";
        return $var;
    }

    public function key()
    {
        $var = key($this->var);
        echo "key: $var\n";
        return $var;
    }

    public function next()
    {
        $var = next($this->var);
        echo "next: $var\n";
        return $var;
    }

    public function valid()
    {
        $var = $this->current() !== false;
        echo "valid: {$var}\n";
        return $var;
    }
}

$b = new B([1, 2, 3, 4]);

foreach ($b as $k => $v) {
    echo $k, '===', $v, PHP_EOL;
}

// rewinding
// current: 1
// valid: 1
// current: 1
// key: 0
// 0===1
// next: 2
// current: 2
// valid: 1
// current: 2
// key: 1
// 1===2
// next: 3
// current: 3
// valid: 1
// current: 3
// key: 2
// 2===3
// next: 4
// current: 4
// valid: 1
// current: 4
// key: 3
// 3===4
// next:
// current:
// valid:

假如今天的文章只是講之前講過的迭代器模式,那就太沒意思了,所以,咱們還要來學習一個更有意思的應用。那就是讓對象可以像數組一樣進行操作。這個其實也是使用PHP早已為我們準備好的一個接口:ArrayAccess。

// 讓類可以像數組一樣操作
class C implements ArrayAccess, IteratorAggregate
{
    private $container = [];
    public function __construct()
    {
        $this->container = [
            "one" => 1,
            "two" => 2,
            "three" => 3,
        ];
    }
    public function offsetSet($offset, $value)
    {
        if (is_null($offset)) {
            $this->container[] = $value;
        } else {
            $this->container[$offset] = $value;
        }
    }
    public function offsetExists($offset)
    {
        return isset($this->container[$offset]);
    }
    public function offsetUnset($offset)
    {
        unset($this->container[$offset]);
    }
    public function offsetGet($offset)
    {
        return isset($this->container[$offset]) ? $this->container[$offset] : null;
    }

    public function getIterator() {
        return new B($this->container);
    }
}

$c = new C();
var_dump($c);

$c['four'] = 4;
var_dump($c);

$c[] = 5;
$c[] = 6;
var_dump($c);

foreach($c as $k=>$v){
    echo $k, '===', $v, PHP_EOL;
}

// rewinding
// current: 1
// valid: 1
// current: 1
// key: one
// one===1
// next: 2
// current: 2
// valid: 1
// current: 2
// key: two
// two===2
// next: 3
// current: 3
// valid: 1
// current: 3
// key: three
// three===3
// next: 4
// current: 4
// valid: 1
// current: 4
// key: four
// four===4
// next: 5
// current: 5
// valid: 1
// current: 5
// key: 0
// 0===5
// next: 6
// current: 6
// valid: 1
// current: 6
// key: 1
// 1===6
// next: 
// current: 
// valid: 

這個接口需要我們實現四個方法:

  • offsetSet($offset, $value),根據偏移量設置值
  • offsetExists($offset),根據偏移量確定是否存在內容
  • offsetUnset($offset),根據偏移量刪除內容
  • offsetGet($offset),根據依稀量獲取內容

這里的偏移量就是我們常說的下標。通過實現這四個方法,我們就可以像操作數組一樣的操作對象。當然,日常開發(fā)中我們可能并不會很經常的使用包括迭代器在內的這些對象遍歷的能力。通常我們會直接去將對象轉換成數組 (array) obj 來進行下一步的操作。不過,在java中,特別是JavaBean中會經常在類的內部有一個 List 為自己的對象來表示自身的集合狀態(tài)。通過對比,我們發(fā)現PHP也完全可以實現這樣的能力,而且使用迭代器和 ArrayAccess 接口還能夠更方便的實現類似的能力。這是非常有用的一種知識擴展,或許下一個項目中你就能運用上這些能力哦!

測試代碼: github.com/zhangyue050…

以上就是php遍歷對象的方法的詳細內容,更多關于php遍歷對象的資料請關注腳本之家其它相關文章!

相關文章

  • php連接oracle數據庫及查詢數據的方法

    php連接oracle數據庫及查詢數據的方法

    這篇文章主要介紹了php連接oracle數據庫及查詢數據的方法,以實例形式較為詳細的分析了php操作oracle數據庫的使用技巧,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-12-12
  • PHP向socket服務器收發(fā)數據的方法

    PHP向socket服務器收發(fā)數據的方法

    這篇文章主要介紹了PHP向socket服務器收發(fā)數據的方法,分析了socket收發(fā)數據的方法,并介紹了socket常用函數,需要的朋友可以參考下
    2015-01-01
  • Laravel實現批量更新多條數據

    Laravel實現批量更新多條數據

    這篇文章主要介紹了Laravel實現批量更新多條數據,需要的朋友可以參考下
    2020-04-04
  • PHP json_encode中文亂碼解決方法

    PHP json_encode中文亂碼解決方法

    這篇文章主要介紹了PHP json_encode中文亂碼解決方法,有遇到此類問題的同學,可以參考一下
    2021-04-04
  • php創(chuàng)建類并調用的實例方法

    php創(chuàng)建類并調用的實例方法

    在本篇文章里小編給大家分享的是關于php如何創(chuàng)建類并調用的相關知識點,有需要的朋友們可以學習下。
    2019-09-09
  • PHP之將POST數據轉化為字符串的實現代碼

    PHP之將POST數據轉化為字符串的實現代碼

    今天來分享一個方便我們做LOG日志記錄的自定義函數,需要將POST數據轉化為字符串,需要的朋友可以參考下
    2016-11-11
  • PHP排序算法系列之插入排序詳解

    PHP排序算法系列之插入排序詳解

    這篇文章主要為大家詳細介紹了PHP排序算法系列之插入排序的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Linux服務器下PHPMailer發(fā)送郵件失敗的問題解決

    Linux服務器下PHPMailer發(fā)送郵件失敗的問題解決

    這篇文章主要給大家介紹了關于如何解決Linux服務器下PHPMailer發(fā)送郵件失敗的問題,文中通過示例代碼介紹的很詳細,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-03-03
  • php自定文件保存session的方法

    php自定文件保存session的方法

    這篇文章主要介紹了php自定文件保存session的方法,詳細講述了session創(chuàng)建與使用的技巧,以及對應的作用范圍分析,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-12-12
  • 遭遇php的in_array低性能問題

    遭遇php的in_array低性能問題

    PHP的性能一直在提高。然而,若是用的不恰當,或是一個不留神,還是可能會踩到PHP內部實現方面的坑的。我在前幾天的一個性能問題上就碰到了
    2013-09-09

最新評論