您好,登錄后才能下訂單哦!
怎么在php中使用foreach遍歷類對象?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
1、執行速度快。2、具有很好的開放性和可擴展性。3、PHP支持多種主流與非主流的數據庫。4、面向對象編程:PHP提供了類和對象。5、版本更新速度快。6、具有豐富的功能。7、可伸縮性。8、功能全面,包括圖形處理、編碼與解碼、壓縮文件處理、xml解析等。
class my { public $a = 'a'; protected $b = 'b'; private $c = 'c'; private $data = array('fantasy','windows','linux'); // 內部foreach遍歷class function traversable() { foreach($this as $key=>$val) { echo $key.'=>'; print_r($val); echo '<br>'; } } } $m = new my(); // 外部foreach遍歷class foreach($m as $key=>$val) { echo $key.'=>'; print_r($val); echo '<br>'; } echo '--------------------------<br>'; // 內部foreach遍歷class $m->traversable();
輸出結果如下:
a=>a
--------------------------
a=>a
b=>b
c=>c
由此可知,對于外部的foreach遍歷是沒有權限訪問 protected private 這兩個修飾的屬性的,而在class內部是有權限訪問,foreach可以遍歷所有的屬性。
今天在寫PDO的時候發現可以這樣寫:
foreach($db->query('SELECT * FROM tab') as $row) { print_r($row); }
這樣快速的獲取了全部查詢結果,可奇怪的是$this->query() 返回的是 object類型 PDOStatement ,var_dump()打印出來的結果是這樣的:
object(PDOStatement)#2 (1) { ["queryString"]=> string(18) "SELECT * FROM user" }
PDOStatement里面就一個public屬性 queryString 并且foreach也沒有出現這個值,這樣的情況就不是簡單的對屬性進行遍歷了,而是class繼承了iterator迭代器,在foreach的時候會執行class里面的迭代方式,遍歷迭代器指定的數據
關于迭代器看下面的例子:
class test implements Iterator { public $a = 'a'; private $data = array('apple','banlance','current'); private $point = 0; public function __construct() { $this->point = 0; } public function current() { return $this->data[$this->point]; } public function key() { return $this->point; } public function next() { ++$this->point; } public function rewind() { $this->point=0; } public function valid() { return isset($this->data[$this->point]); } } $t = new test(); foreach($t as $val) { print_r($val); echo '<br>'; }
輸出結果如下:
apple
banlance
test class 實現iterator的接口,foreach調用的時候會使用這個接口方法,調用過程大致如下面偽代碼:
// 迭代過程偽代碼 while(valid) { <span > </span>current/key <span > </span>next } rewind
so,之前的foreach對class的處理過程是一種默認方法,如果是繼承iterator的class被foreach遍歷的時候是上面這種方式
由此情況去套用 PDO的寫法還是行不通,因為如果我們var_dump上面的哪個test類結果是這樣的:
test Object ( [a] => a [data:test:private] => Array ( [0] => apple [1] => banlance [2] => current ) [point:test:private] => 0 )
但是當我們var_dump $db->query返回的對象時并沒有見到point這個iterator接口中定義的屬性以及遍歷的數據 $data;
由此我們可以猜測PDOStatement繼承了一種迭代的接口但是并不是iterator
查看手冊可以發現:
PDOStatement implements Traversable
查看Traversable的介紹如下圖:
關于怎么在php中使用foreach遍歷類對象問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。