這篇文章給大家分享的是有關(guān)PHP遍歷對(duì)象的示例的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。
成都創(chuàng)新互聯(lián)公司十載專注成都高端網(wǎng)站建設(shè)定制網(wǎng)站服務(wù),為客戶提供專業(yè)的成都網(wǎng)站制作,成都網(wǎng)頁設(shè)計(jì),成都網(wǎng)站設(shè)計(jì)服務(wù);成都創(chuàng)新互聯(lián)公司服務(wù)內(nèi)容包含成都網(wǎng)站建設(shè),重慶小程序開發(fā),軟件開發(fā),網(wǎng)絡(luò)營銷推廣,網(wǎng)絡(luò)運(yùn)營服務(wù)及企業(yè)形象設(shè)計(jì);成都創(chuàng)新互聯(lián)公司擁有眾多專業(yè)的高端網(wǎng)站制作開發(fā)團(tuán)隊(duì),資深的高端網(wǎng)頁設(shè)計(jì)團(tuán)隊(duì)及經(jīng)驗(yàn)豐富的架構(gòu)師高端網(wǎng)站策劃團(tuán)隊(duì);我們始終堅(jiān)持從客戶的角度出發(fā),為客戶量身訂造網(wǎng)絡(luò)營銷方案,解決網(wǎng)絡(luò)營銷疑問。
對(duì)于php來說,foreach是非常方便好用的一個(gè)語法,幾乎對(duì)于每一個(gè)PHPer它都是日常接觸最多的請(qǐng)求之一。那么對(duì)象是否能通過foreach來遍歷呢?
答案是肯定的,但是有個(gè)條件,那就是對(duì)象的遍歷只能獲得它的公共屬性。
// 普通遍歷 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
不管是方法還是受保護(hù)或者私有的變量,都無法遍歷出來。只有公共的屬性才能被遍歷出來。其實(shí),我們之前在講設(shè)計(jì)模式時(shí)講過的迭代器模式就是專門用來進(jìn)行對(duì)象遍歷的,而且PHP已經(jīng)為我們準(zhǔn)備好了相關(guān)的接口,我們只需要去實(shí)現(xiàn)這個(gè)接口就可以完成迭代器模式的創(chuàng)建了。具體的內(nèi)容可以參考之前的設(shè)計(jì)模式系列文章:PHP設(shè)計(jì)模式之迭代器模式()
// 實(shí)現(xiàn)迭代器接口 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:
假如今天的文章只是講之前講過的迭代器模式,那就太沒意思了,所以,咱們還要來學(xué)習(xí)一個(gè)更有意思的應(yīng)用。那就是讓對(duì)象可以像數(shù)組一樣進(jìn)行操作。這個(gè)其實(shí)也是使用PHP早已為我們準(zhǔn)備好的一個(gè)接口:ArrayAccess。
// 讓類可以像數(shù)組一樣操作 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:
這個(gè)接口需要我們實(shí)現(xiàn)四個(gè)方法:
offsetSet($offset, $value),根據(jù)偏移量設(shè)置值
offsetExists($offset),根據(jù)偏移量確定是否存在內(nèi)容
offsetUnset($offset),根據(jù)偏移量刪除內(nèi)容
offsetGet($offset),根據(jù)依稀量獲取內(nèi)容
這里的偏移量就是我們常說的下標(biāo)。通過實(shí)現(xiàn)這四個(gè)方法,我們就可以像操作數(shù)組一樣的操作對(duì)象。當(dāng)然,日常開發(fā)中我們可能并不會(huì)很經(jīng)常的使用包括迭代器在內(nèi)的這些對(duì)象遍歷的能力。通常我們會(huì)直接去將對(duì)象轉(zhuǎn)換成數(shù)組 (array) obj 來進(jìn)行下一步的操作。不過,在java中,特別是JavaBean中會(huì)經(jīng)常在類的內(nèi)部有一個(gè) List<T> 為自己的對(duì)象來表示自身的集合狀態(tài)。通過對(duì)比,我們發(fā)現(xiàn)PHP也完全可以實(shí)現(xiàn)這樣的能力,而且使用迭代器和 ArrayAccess 接口還能夠更方便的實(shí)現(xiàn)類似的能力。這是非常有用的一種知識(shí)擴(kuò)展,或許下一個(gè)項(xiàng)目中你就能運(yùn)用上這些能力哦!
測試代碼: https://github.com/zhangyue0503/dev-blog/blob/master/php/201912/source/PHP%E6%80%8E%E4%B9%88%E9%81%8D%E5%8E%86%E5%AF%B9%E8%B1%A1%EF%BC%9F.ph
感謝各位的閱讀!關(guān)于“PHP遍歷對(duì)象的示例”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
網(wǎng)站名稱:PHP遍歷對(duì)象的示例
網(wǎng)站鏈接:http://jinyejixie.com/article44/igophe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、用戶體驗(yàn)、全網(wǎng)營銷推廣、建站公司、搜索引擎優(yōu)化、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)