09/10/2018, 23:28

[Q] PHP Object iteration

PHP Sample
PHP Code:
<?php
class MyClass
{
   public 
$var1 'value 1';
   public 
$var2 'value 2';
   public 
$var3 'value 3';

   protected 
$protected 'protected var';
   private   
$private   'private var';

   function 
iterateVisible() {
      echo 
"MyClass::iterateVisible: ";
      foreach(
$this as $key => $value) {
          print 
"$key => $value ";
      }
   }
}

$class = new MyClass();

foreach(
$class as $key => $value) {
   print 
"$key => $value ";
}
echo 
" ";


$class->iterateVisible();

?>
Output
PHP Code:
var1 => value 1
var2 
=> value 2
var3 
=> value 3

MyClass
::iterateVisible:
var1 => value 1
var2 
=> value 2
var3 
=> value 3
protected => protected var
private => private var 
Vấn đề đặt ra là nếu muốn hàm iterateVisible() chỉ list ra các member có scope là protected hay private thì phải làm thế nào? Hiện giờ ngoài cách đặt prefix thì tôi vẫn chưa nghĩ ra cách nào khả thi. Anh em ai có cao kiến gì ko?
pcdinh viết 01:36 ngày 10/10/2018
Dùng kết hợp với ReflectionClass/ReflectionMethod
jiSh@n viết 01:31 ngày 10/10/2018
OK. Thanks bác Định nhiều. Đã làm được rồi
jiSh@n viết 01:29 ngày 10/10/2018
Có 1 vấn đề ko hiểu cho lắm: Theo như PHP Manual thì object iteration chỉ có từ php 5, nhưng tôi test trên php 4.4.4 thì vẫn có thể thực hiện được
PHP Code:
class Test {
   var 
$x 0;
   var 
$y 0;
}
$test = new Test();
foreach (
$test as $k => $v) echo "$k => $v \n"
Đoạn code trên vẫn chạy đúng Phải chăng php đã tự cast sang array?
mrsinguyenus viết 01:42 ngày 10/10/2018
ua` nhi, test thấy ok
pcdinh viết 01:36 ngày 10/10/2018
Đoạn code trên là từ Manual đúng không? Tôi thấy nó từ 2005 nhưng mà chỉ thấy hơi lạ. Từ iteration đó là từ nói nôm na, không phải là thuật ngữ.

Vì nó nôm na như thế cho nên người đọc cứ ngỡ nó là điểm đặc biệt của PHP5. Kì thực các bác viết PHP Manual làm người đọc hiểu lầm. Iteration sẽ là đặc biệt của PHP5 nếu như ví dụ trên dùng ArrayObject và ArrayIterator. Tuy nhiên kì thực thì các bác lúc viết đã dùng một đặc điểm của PHP: Object là một mảng các properties. Mà cái đó thì PHP4 và PHP5 đều như nhau.

Khi nào thực hiện iterating qua một đối tượng mà dùng đến các lớp Iterator trong SPL thì đó mới là PHP5
Bài liên quan
0