6 changed files with 1182 additions and 0 deletions
-
69tests/lang/foreachLoopObjects.001.phpt
-
585tests/lang/foreachLoopObjects.002.phpt
-
249tests/lang/foreachLoopObjects.003.phpt
-
54tests/lang/foreachLoopObjects.004.phpt
-
78tests/lang/foreachLoopObjects.005.phpt
-
147tests/lang/foreachLoopObjects.006.phpt
@ -0,0 +1,69 @@ |
|||
--TEST-- |
|||
Foreach loop on objects - basic loop with just value and key => value. |
|||
--FILE-- |
|||
<?php |
|||
|
|||
class C { |
|||
public $a = "Original a"; |
|||
public $b = "Original b"; |
|||
public $c = "Original c"; |
|||
protected $d = "Original d"; |
|||
private $e = "Original e"; |
|||
|
|||
} |
|||
|
|||
echo "\n\nSimple loop.\n"; |
|||
$obj = new C; |
|||
foreach ($obj as $v) { |
|||
var_dump($v); |
|||
} |
|||
foreach ($obj as $k => $v) { |
|||
var_dump($k, $v); |
|||
} |
|||
echo "\nCheck key and value after the loop.\n"; |
|||
var_dump($k, $v); |
|||
|
|||
|
|||
echo "\n\nObject instantiated inside loop.\n"; |
|||
foreach (new C as $v) { |
|||
var_dump($v); |
|||
} |
|||
foreach (new C as $k => $v) { |
|||
var_dump($k, $v); |
|||
} |
|||
echo "\nCheck key and value after the loop.\n"; |
|||
var_dump($k, $v); |
|||
?> |
|||
--EXPECTF-- |
|||
|
|||
|
|||
Simple loop. |
|||
string(10) "Original a" |
|||
string(10) "Original b" |
|||
string(10) "Original c" |
|||
string(1) "a" |
|||
string(10) "Original a" |
|||
string(1) "b" |
|||
string(10) "Original b" |
|||
string(1) "c" |
|||
string(10) "Original c" |
|||
|
|||
Check key and value after the loop. |
|||
string(1) "c" |
|||
string(10) "Original c" |
|||
|
|||
|
|||
Object instantiated inside loop. |
|||
string(10) "Original a" |
|||
string(10) "Original b" |
|||
string(10) "Original c" |
|||
string(1) "a" |
|||
string(10) "Original a" |
|||
string(1) "b" |
|||
string(10) "Original b" |
|||
string(1) "c" |
|||
string(10) "Original c" |
|||
|
|||
Check key and value after the loop. |
|||
string(1) "c" |
|||
string(10) "Original c" |
|||
@ -0,0 +1,585 @@ |
|||
--TEST-- |
|||
Foreach loop tests - visibility. |
|||
--FILE-- |
|||
<?php |
|||
|
|||
class C { |
|||
public $a = "Original a"; |
|||
public $b = "Original b"; |
|||
public $c = "Original c"; |
|||
protected $d = "Original d"; |
|||
private $e = "Original e"; |
|||
|
|||
function doForEachC() { |
|||
echo "in C::doForEachC\n"; |
|||
foreach ($this as $k=>&$v) { |
|||
var_dump($v); |
|||
$v="changed.$k"; |
|||
} |
|||
} |
|||
|
|||
static function doForEach($obj) { |
|||
echo "in C::doForEach\n"; |
|||
foreach ($obj as $k=>&$v) { |
|||
var_dump($v); |
|||
$v="changed.$k"; |
|||
} |
|||
} |
|||
|
|||
function doForEachOnThis() { |
|||
echo "in C::doForEachOnThis\n"; |
|||
foreach ($this as $k=>&$v) { |
|||
var_dump($v); |
|||
$v="changed.$k"; |
|||
} |
|||
} |
|||
|
|||
} |
|||
|
|||
class D extends C { |
|||
|
|||
private $f = "Original f"; |
|||
protected $g = "Original g"; |
|||
|
|||
static function doForEach($obj) { |
|||
echo "in D::doForEach\n"; |
|||
foreach ($obj as $k=>&$v) { |
|||
var_dump($v); |
|||
$v="changed.$k"; |
|||
} |
|||
} |
|||
|
|||
function doForEachOnThis() { |
|||
echo "in D::doForEachOnThis\n"; |
|||
foreach ($this as $k=>&$v) { |
|||
var_dump($v); |
|||
$v="changed.$k"; |
|||
} |
|||
} |
|||
} |
|||
|
|||
class E extends D { |
|||
public $a = "Overridden a"; |
|||
public $b = "Overridden b"; |
|||
public $c = "Overridden c"; |
|||
protected $d = "Overridden d"; |
|||
private $e = "Overridden e"; |
|||
|
|||
static function doForEach($obj) { |
|||
echo "in E::doForEach\n"; |
|||
foreach ($obj as $k=>&$v) { |
|||
var_dump($v); |
|||
$v="changed.$k"; |
|||
} |
|||
} |
|||
|
|||
function doForEachOnThis() { |
|||
echo "in E::doForEachOnThis\n"; |
|||
foreach ($this as $k=>&$v) { |
|||
var_dump($v); |
|||
$v="changed.$k"; |
|||
} |
|||
} |
|||
} |
|||
|
|||
echo "\n\nIterate over various generations from within overridden methods:\n"; |
|||
echo "\n--> Using instance of C:\n"; |
|||
$myC = new C; |
|||
$myC->doForEachOnThis(); |
|||
var_dump($myC); |
|||
echo "\n--> Using instance of D:\n"; |
|||
$myD = new D; |
|||
$myD->doForEachOnThis(); |
|||
var_dump($myD); |
|||
echo "\n--> Using instance of E:\n"; |
|||
$myE = new E; |
|||
$myE->doForEachOnThis(); |
|||
var_dump($myE); |
|||
|
|||
echo "\n\nIterate over various generations from within an inherited method:\n"; |
|||
echo "\n--> Using instance of C:\n"; |
|||
$myC = new C; |
|||
$myC->doForEachC(); |
|||
var_dump($myC); |
|||
echo "\n--> Using instance of D:\n"; |
|||
$myD = new D; |
|||
$myD->doForEachC(); |
|||
var_dump($myD); |
|||
echo "\n--> Using instance of E:\n"; |
|||
$myE = new E; |
|||
$myE->doForEachC(); |
|||
var_dump($myE); |
|||
|
|||
echo "\n\nIterate over various generations from within an overridden static method:\n"; |
|||
echo "\n--> Using instance of C:\n"; |
|||
$myC = new C; |
|||
C::doForEach($myC); |
|||
var_dump($myC); |
|||
$myC = new C; |
|||
D::doForEach($myC); |
|||
var_dump($myC); |
|||
$myC = new C; |
|||
E::doForEach($myC); |
|||
var_dump($myC); |
|||
echo "\n--> Using instance of D:\n"; |
|||
$myD = new D; |
|||
C::doForEach($myD); |
|||
var_dump($myD); |
|||
$myD = new D; |
|||
D::doForEach($myD); |
|||
var_dump($myD); |
|||
$myD = new D; |
|||
E::doForEach($myD); |
|||
var_dump($myD); |
|||
echo "\n--> Using instance of E:\n"; |
|||
$myE = new E; |
|||
C::doForEach($myE); |
|||
var_dump($myE); |
|||
$myE = new E; |
|||
D::doForEach($myE); |
|||
var_dump($myE); |
|||
$myE = new E; |
|||
E::doForEach($myE); |
|||
var_dump($myE); |
|||
|
|||
|
|||
echo "\n\nIterate over various generations from outside the object:\n"; |
|||
echo "\n--> Using instance of C:\n"; |
|||
$myC = new C; |
|||
foreach ($myC as $k=>&$v) { |
|||
var_dump($v); |
|||
$v="changed.$k"; |
|||
} |
|||
var_dump($myC); |
|||
echo "\n--> Using instance of D:\n"; |
|||
$myD = new D; |
|||
foreach ($myD as $k=>&$v) { |
|||
var_dump($v); |
|||
$v="changed.$k"; |
|||
} |
|||
var_dump($myD); |
|||
echo "\n--> Using instance of E:\n"; |
|||
$myE = new E; |
|||
foreach ($myE as $k=>&$v) { |
|||
var_dump($v); |
|||
$v="changed.$k"; |
|||
} |
|||
var_dump($myE); |
|||
?> |
|||
--EXPECTF-- |
|||
Iterate over various generations from within overridden methods: |
|||
|
|||
--> Using instance of C: |
|||
in C::doForEachOnThis |
|||
string(10) "Original a" |
|||
string(10) "Original b" |
|||
string(10) "Original c" |
|||
string(10) "Original d" |
|||
string(10) "Original e" |
|||
object(C)#%d (5) { |
|||
["a"]=> |
|||
string(9) "changed.a" |
|||
["b"]=> |
|||
string(9) "changed.b" |
|||
["c"]=> |
|||
string(9) "changed.c" |
|||
["d:protected"]=> |
|||
string(9) "changed.d" |
|||
["e:private"]=> |
|||
string(9) "changed.e" |
|||
} |
|||
|
|||
--> Using instance of D: |
|||
in D::doForEachOnThis |
|||
string(10) "Original f" |
|||
string(10) "Original g" |
|||
string(10) "Original a" |
|||
string(10) "Original b" |
|||
string(10) "Original c" |
|||
string(10) "Original d" |
|||
object(D)#%d (7) { |
|||
["f:private"]=> |
|||
string(9) "changed.f" |
|||
["g:protected"]=> |
|||
string(9) "changed.g" |
|||
["a"]=> |
|||
string(9) "changed.a" |
|||
["b"]=> |
|||
string(9) "changed.b" |
|||
["c"]=> |
|||
string(9) "changed.c" |
|||
["d:protected"]=> |
|||
string(9) "changed.d" |
|||
["e:private"]=> |
|||
string(10) "Original e" |
|||
} |
|||
|
|||
--> Using instance of E: |
|||
in E::doForEachOnThis |
|||
string(12) "Overridden a" |
|||
string(12) "Overridden b" |
|||
string(12) "Overridden c" |
|||
string(12) "Overridden d" |
|||
string(12) "Overridden e" |
|||
string(10) "Original g" |
|||
object(E)#%d (8) { |
|||
["a"]=> |
|||
string(9) "changed.a" |
|||
["b"]=> |
|||
string(9) "changed.b" |
|||
["c"]=> |
|||
string(9) "changed.c" |
|||
["d:protected"]=> |
|||
string(9) "changed.d" |
|||
["e:private"]=> |
|||
string(9) "changed.e" |
|||
["f:private"]=> |
|||
string(10) "Original f" |
|||
["g:protected"]=> |
|||
string(9) "changed.g" |
|||
["e:private"]=> |
|||
string(10) "Original e" |
|||
} |
|||
|
|||
|
|||
Iterate over various generations from within an inherited method: |
|||
|
|||
--> Using instance of C: |
|||
in C::doForEachC |
|||
string(10) "Original a" |
|||
string(10) "Original b" |
|||
string(10) "Original c" |
|||
string(10) "Original d" |
|||
string(10) "Original e" |
|||
object(C)#%d (5) { |
|||
["a"]=> |
|||
string(9) "changed.a" |
|||
["b"]=> |
|||
string(9) "changed.b" |
|||
["c"]=> |
|||
string(9) "changed.c" |
|||
["d:protected"]=> |
|||
string(9) "changed.d" |
|||
["e:private"]=> |
|||
string(9) "changed.e" |
|||
} |
|||
|
|||
--> Using instance of D: |
|||
in C::doForEachC |
|||
string(10) "Original g" |
|||
string(10) "Original a" |
|||
string(10) "Original b" |
|||
string(10) "Original c" |
|||
string(10) "Original d" |
|||
string(10) "Original e" |
|||
object(D)#%d (7) { |
|||
["f:private"]=> |
|||
string(10) "Original f" |
|||
["g:protected"]=> |
|||
string(9) "changed.g" |
|||
["a"]=> |
|||
string(9) "changed.a" |
|||
["b"]=> |
|||
string(9) "changed.b" |
|||
["c"]=> |
|||
string(9) "changed.c" |
|||
["d:protected"]=> |
|||
string(9) "changed.d" |
|||
["e:private"]=> |
|||
string(9) "changed.e" |
|||
} |
|||
|
|||
--> Using instance of E: |
|||
in C::doForEachC |
|||
string(12) "Overridden a" |
|||
string(12) "Overridden b" |
|||
string(12) "Overridden c" |
|||
string(12) "Overridden d" |
|||
string(10) "Original g" |
|||
string(10) "Original e" |
|||
object(E)#%d (8) { |
|||
["a"]=> |
|||
string(9) "changed.a" |
|||
["b"]=> |
|||
string(9) "changed.b" |
|||
["c"]=> |
|||
string(9) "changed.c" |
|||
["d:protected"]=> |
|||
string(9) "changed.d" |
|||
["e:private"]=> |
|||
string(12) "Overridden e" |
|||
["f:private"]=> |
|||
string(10) "Original f" |
|||
["g:protected"]=> |
|||
string(9) "changed.g" |
|||
["e:private"]=> |
|||
string(9) "changed.e" |
|||
} |
|||
|
|||
|
|||
Iterate over various generations from within an overridden static method: |
|||
|
|||
--> Using instance of C: |
|||
in C::doForEach |
|||
string(10) "Original a" |
|||
string(10) "Original b" |
|||
string(10) "Original c" |
|||
string(10) "Original d" |
|||
string(10) "Original e" |
|||
object(C)#%d (5) { |
|||
["a"]=> |
|||
string(9) "changed.a" |
|||
["b"]=> |
|||
string(9) "changed.b" |
|||
["c"]=> |
|||
string(9) "changed.c" |
|||
["d:protected"]=> |
|||
string(9) "changed.d" |
|||
["e:private"]=> |
|||
string(9) "changed.e" |
|||
} |
|||
in D::doForEach |
|||
string(10) "Original a" |
|||
string(10) "Original b" |
|||
string(10) "Original c" |
|||
string(10) "Original d" |
|||
object(C)#%d (5) { |
|||
["a"]=> |
|||
string(9) "changed.a" |
|||
["b"]=> |
|||
string(9) "changed.b" |
|||
["c"]=> |
|||
string(9) "changed.c" |
|||
["d:protected"]=> |
|||
string(9) "changed.d" |
|||
["e:private"]=> |
|||
string(10) "Original e" |
|||
} |
|||
in E::doForEach |
|||
string(10) "Original a" |
|||
string(10) "Original b" |
|||
string(10) "Original c" |
|||
string(10) "Original d" |
|||
object(C)#%d (5) { |
|||
["a"]=> |
|||
string(9) "changed.a" |
|||
["b"]=> |
|||
string(9) "changed.b" |
|||
["c"]=> |
|||
string(9) "changed.c" |
|||
["d:protected"]=> |
|||
string(9) "changed.d" |
|||
["e:private"]=> |
|||
string(10) "Original e" |
|||
} |
|||
|
|||
--> Using instance of D: |
|||
in C::doForEach |
|||
string(10) "Original g" |
|||
string(10) "Original a" |
|||
string(10) "Original b" |
|||
string(10) "Original c" |
|||
string(10) "Original d" |
|||
string(10) "Original e" |
|||
object(D)#%d (7) { |
|||
["f:private"]=> |
|||
string(10) "Original f" |
|||
["g:protected"]=> |
|||
string(9) "changed.g" |
|||
["a"]=> |
|||
string(9) "changed.a" |
|||
["b"]=> |
|||
string(9) "changed.b" |
|||
["c"]=> |
|||
string(9) "changed.c" |
|||
["d:protected"]=> |
|||
string(9) "changed.d" |
|||
["e:private"]=> |
|||
string(9) "changed.e" |
|||
} |
|||
in D::doForEach |
|||
string(10) "Original f" |
|||
string(10) "Original g" |
|||
string(10) "Original a" |
|||
string(10) "Original b" |
|||
string(10) "Original c" |
|||
string(10) "Original d" |
|||
object(D)#%d (7) { |
|||
["f:private"]=> |
|||
string(9) "changed.f" |
|||
["g:protected"]=> |
|||
string(9) "changed.g" |
|||
["a"]=> |
|||
string(9) "changed.a" |
|||
["b"]=> |
|||
string(9) "changed.b" |
|||
["c"]=> |
|||
string(9) "changed.c" |
|||
["d:protected"]=> |
|||
string(9) "changed.d" |
|||
["e:private"]=> |
|||
string(10) "Original e" |
|||
} |
|||
in E::doForEach |
|||
string(10) "Original g" |
|||
string(10) "Original a" |
|||
string(10) "Original b" |
|||
string(10) "Original c" |
|||
string(10) "Original d" |
|||
object(D)#%d (7) { |
|||
["f:private"]=> |
|||
string(10) "Original f" |
|||
["g:protected"]=> |
|||
string(9) "changed.g" |
|||
["a"]=> |
|||
string(9) "changed.a" |
|||
["b"]=> |
|||
string(9) "changed.b" |
|||
["c"]=> |
|||
string(9) "changed.c" |
|||
["d:protected"]=> |
|||
string(9) "changed.d" |
|||
["e:private"]=> |
|||
string(10) "Original e" |
|||
} |
|||
|
|||
--> Using instance of E: |
|||
in C::doForEach |
|||
string(12) "Overridden a" |
|||
string(12) "Overridden b" |
|||
string(12) "Overridden c" |
|||
string(12) "Overridden d" |
|||
string(10) "Original g" |
|||
string(10) "Original e" |
|||
object(E)#%d (8) { |
|||
["a"]=> |
|||
string(9) "changed.a" |
|||
["b"]=> |
|||
string(9) "changed.b" |
|||
["c"]=> |
|||
string(9) "changed.c" |
|||
["d:protected"]=> |
|||
string(9) "changed.d" |
|||
["e:private"]=> |
|||
string(12) "Overridden e" |
|||
["f:private"]=> |
|||
string(10) "Original f" |
|||
["g:protected"]=> |
|||
string(9) "changed.g" |
|||
["e:private"]=> |
|||
string(9) "changed.e" |
|||
} |
|||
in D::doForEach |
|||
string(12) "Overridden a" |
|||
string(12) "Overridden b" |
|||
string(12) "Overridden c" |
|||
string(12) "Overridden d" |
|||
string(10) "Original f" |
|||
string(10) "Original g" |
|||
object(E)#%d (8) { |
|||
["a"]=> |
|||
string(9) "changed.a" |
|||
["b"]=> |
|||
string(9) "changed.b" |
|||
["c"]=> |
|||
string(9) "changed.c" |
|||
["d:protected"]=> |
|||
string(9) "changed.d" |
|||
["e:private"]=> |
|||
string(12) "Overridden e" |
|||
["f:private"]=> |
|||
string(9) "changed.f" |
|||
["g:protected"]=> |
|||
string(9) "changed.g" |
|||
["e:private"]=> |
|||
string(10) "Original e" |
|||
} |
|||
in E::doForEach |
|||
string(12) "Overridden a" |
|||
string(12) "Overridden b" |
|||
string(12) "Overridden c" |
|||
string(12) "Overridden d" |
|||
string(12) "Overridden e" |
|||
string(10) "Original g" |
|||
object(E)#%d (8) { |
|||
["a"]=> |
|||
string(9) "changed.a" |
|||
["b"]=> |
|||
string(9) "changed.b" |
|||
["c"]=> |
|||
string(9) "changed.c" |
|||
["d:protected"]=> |
|||
string(9) "changed.d" |
|||
["e:private"]=> |
|||
string(9) "changed.e" |
|||
["f:private"]=> |
|||
string(10) "Original f" |
|||
["g:protected"]=> |
|||
string(9) "changed.g" |
|||
["e:private"]=> |
|||
string(10) "Original e" |
|||
} |
|||
|
|||
|
|||
Iterate over various generations from outside the object: |
|||
|
|||
--> Using instance of C: |
|||
string(10) "Original a" |
|||
string(10) "Original b" |
|||
string(10) "Original c" |
|||
object(C)#%d (5) { |
|||
["a"]=> |
|||
string(9) "changed.a" |
|||
["b"]=> |
|||
string(9) "changed.b" |
|||
["c"]=> |
|||
&string(9) "changed.c" |
|||
["d:protected"]=> |
|||
string(10) "Original d" |
|||
["e:private"]=> |
|||
string(10) "Original e" |
|||
} |
|||
|
|||
--> Using instance of D: |
|||
string(10) "Original a" |
|||
string(10) "Original b" |
|||
string(10) "Original c" |
|||
object(D)#%d (7) { |
|||
["f:private"]=> |
|||
string(10) "Original f" |
|||
["g:protected"]=> |
|||
string(10) "Original g" |
|||
["a"]=> |
|||
string(9) "changed.a" |
|||
["b"]=> |
|||
string(9) "changed.b" |
|||
["c"]=> |
|||
&string(9) "changed.c" |
|||
["d:protected"]=> |
|||
string(10) "Original d" |
|||
["e:private"]=> |
|||
string(10) "Original e" |
|||
} |
|||
|
|||
--> Using instance of E: |
|||
string(12) "Overridden a" |
|||
string(12) "Overridden b" |
|||
string(12) "Overridden c" |
|||
object(E)#%d (8) { |
|||
["a"]=> |
|||
string(9) "changed.a" |
|||
["b"]=> |
|||
string(9) "changed.b" |
|||
["c"]=> |
|||
&string(9) "changed.c" |
|||
["d:protected"]=> |
|||
string(12) "Overridden d" |
|||
["e:private"]=> |
|||
string(12) "Overridden e" |
|||
["f:private"]=> |
|||
string(10) "Original f" |
|||
["g:protected"]=> |
|||
string(10) "Original g" |
|||
["e:private"]=> |
|||
string(10) "Original e" |
|||
} |
|||
@ -0,0 +1,249 @@ |
|||
--TEST-- |
|||
Foreach loop tests - modifying the object during the loop. |
|||
--FILE-- |
|||
<?php |
|||
|
|||
class C { |
|||
public $a = "Original a"; |
|||
public $b = "Original b"; |
|||
public $c = "Original c"; |
|||
protected $d = "Original d"; |
|||
private $e = "Original e"; |
|||
} |
|||
|
|||
echo "\nDirectly changing object values.\n"; |
|||
$obj = new C; |
|||
foreach ($obj as $k=>$v) { |
|||
$obj->$k="changed.$k"; |
|||
var_dump($v); |
|||
} |
|||
var_dump($obj); |
|||
|
|||
echo "\nModifying the foreach \$value.\n"; |
|||
$obj = new C; |
|||
foreach ($obj as $k=>$v) { |
|||
$v="changed.$k"; |
|||
} |
|||
var_dump($obj); |
|||
|
|||
|
|||
echo "\nModifying the foreach &\$value.\n"; |
|||
$obj = new C; |
|||
foreach ($obj as $k=>&$v) { |
|||
$v="changed.$k"; |
|||
} |
|||
var_dump($obj); |
|||
|
|||
echo "\nAdding properties to an an object.\n"; |
|||
$obj = new C; |
|||
$counter=0; |
|||
foreach ($obj as $v) { |
|||
$newPropName = "new$counter"; |
|||
$obj->$newPropName = "Added property $counter"; |
|||
if ($counter++>10) { |
|||
echo "Loop detected\n"; |
|||
break; |
|||
} |
|||
var_dump($v); |
|||
} |
|||
var_dump($obj); |
|||
|
|||
echo "\nAdding properties to an an object, using &\$value.\n"; |
|||
$obj = new C; |
|||
$counter=0; |
|||
foreach ($obj as &$v) { |
|||
$newPropName = "new$counter"; |
|||
$obj->$newPropName = "Added property $counter"; |
|||
if ($counter++>10) { |
|||
echo "Loop detected\n"; |
|||
break; |
|||
} |
|||
var_dump($v); |
|||
} |
|||
var_dump($obj); |
|||
|
|||
echo "\nRemoving properties from an object.\n"; |
|||
$obj = new C; |
|||
foreach ($obj as $v) { |
|||
unset($obj->a); |
|||
unset($obj->b); |
|||
unset($obj->c); |
|||
var_dump($v); |
|||
} |
|||
var_dump($obj); |
|||
|
|||
echo "\nRemoving properties from an object, using &\$value.\n"; |
|||
$obj = new C; |
|||
foreach ($obj as &$v) { |
|||
unset($obj->a); |
|||
unset($obj->b); |
|||
unset($obj->c); |
|||
var_dump($v); |
|||
} |
|||
var_dump($obj); |
|||
|
|||
?> |
|||
--EXPECTF-- |
|||
|
|||
Directly changing object values. |
|||
string(10) "Original a" |
|||
string(10) "Original b" |
|||
string(10) "Original c" |
|||
object(C)#%d (5) { |
|||
["a"]=> |
|||
string(9) "changed.a" |
|||
["b"]=> |
|||
string(9) "changed.b" |
|||
["c"]=> |
|||
string(9) "changed.c" |
|||
["d:protected"]=> |
|||
string(10) "Original d" |
|||
["e:private"]=> |
|||
string(10) "Original e" |
|||
} |
|||
|
|||
Modifying the foreach $value. |
|||
object(C)#%d (5) { |
|||
["a"]=> |
|||
string(10) "Original a" |
|||
["b"]=> |
|||
string(10) "Original b" |
|||
["c"]=> |
|||
string(10) "Original c" |
|||
["d:protected"]=> |
|||
string(10) "Original d" |
|||
["e:private"]=> |
|||
string(10) "Original e" |
|||
} |
|||
|
|||
Modifying the foreach &$value. |
|||
object(C)#%d (5) { |
|||
["a"]=> |
|||
string(9) "changed.a" |
|||
["b"]=> |
|||
string(9) "changed.b" |
|||
["c"]=> |
|||
&string(9) "changed.c" |
|||
["d:protected"]=> |
|||
string(10) "Original d" |
|||
["e:private"]=> |
|||
string(10) "Original e" |
|||
} |
|||
|
|||
Adding properties to an an object. |
|||
string(10) "Original a" |
|||
string(10) "Original b" |
|||
string(10) "Original c" |
|||
string(16) "Added property 0" |
|||
string(16) "Added property 1" |
|||
string(16) "Added property 2" |
|||
string(16) "Added property 3" |
|||
string(16) "Added property 4" |
|||
string(16) "Added property 5" |
|||
string(16) "Added property 6" |
|||
string(16) "Added property 7" |
|||
Loop detected |
|||
object(C)#%d (17) { |
|||
["a"]=> |
|||
string(10) "Original a" |
|||
["b"]=> |
|||
string(10) "Original b" |
|||
["c"]=> |
|||
string(10) "Original c" |
|||
["d:protected"]=> |
|||
string(10) "Original d" |
|||
["e:private"]=> |
|||
string(10) "Original e" |
|||
["new0"]=> |
|||
string(16) "Added property 0" |
|||
["new1"]=> |
|||
string(16) "Added property 1" |
|||
["new2"]=> |
|||
string(16) "Added property 2" |
|||
["new3"]=> |
|||
string(16) "Added property 3" |
|||
["new4"]=> |
|||
string(16) "Added property 4" |
|||
["new5"]=> |
|||
string(16) "Added property 5" |
|||
["new6"]=> |
|||
string(16) "Added property 6" |
|||
["new7"]=> |
|||
string(16) "Added property 7" |
|||
["new8"]=> |
|||
string(16) "Added property 8" |
|||
["new9"]=> |
|||
string(16) "Added property 9" |
|||
["new10"]=> |
|||
string(17) "Added property 10" |
|||
["new11"]=> |
|||
string(17) "Added property 11" |
|||
} |
|||
|
|||
Adding properties to an an object, using &$value. |
|||
string(10) "Original a" |
|||
string(10) "Original b" |
|||
string(10) "Original c" |
|||
string(16) "Added property 0" |
|||
string(16) "Added property 1" |
|||
string(16) "Added property 2" |
|||
string(16) "Added property 3" |
|||
string(16) "Added property 4" |
|||
string(16) "Added property 5" |
|||
string(16) "Added property 6" |
|||
string(16) "Added property 7" |
|||
Loop detected |
|||
object(C)#%d (17) { |
|||
["a"]=> |
|||
string(10) "Original a" |
|||
["b"]=> |
|||
string(10) "Original b" |
|||
["c"]=> |
|||
string(10) "Original c" |
|||
["d:protected"]=> |
|||
string(10) "Original d" |
|||
["e:private"]=> |
|||
string(10) "Original e" |
|||
["new0"]=> |
|||
string(16) "Added property 0" |
|||
["new1"]=> |
|||
string(16) "Added property 1" |
|||
["new2"]=> |
|||
string(16) "Added property 2" |
|||
["new3"]=> |
|||
string(16) "Added property 3" |
|||
["new4"]=> |
|||
string(16) "Added property 4" |
|||
["new5"]=> |
|||
string(16) "Added property 5" |
|||
["new6"]=> |
|||
string(16) "Added property 6" |
|||
["new7"]=> |
|||
string(16) "Added property 7" |
|||
["new8"]=> |
|||
&string(16) "Added property 8" |
|||
["new9"]=> |
|||
string(16) "Added property 9" |
|||
["new10"]=> |
|||
string(17) "Added property 10" |
|||
["new11"]=> |
|||
string(17) "Added property 11" |
|||
} |
|||
|
|||
Removing properties from an object. |
|||
string(10) "Original a" |
|||
object(C)#%d (2) { |
|||
["d:protected"]=> |
|||
string(10) "Original d" |
|||
["e:private"]=> |
|||
string(10) "Original e" |
|||
} |
|||
|
|||
Removing properties from an object, using &$value. |
|||
string(10) "Original a" |
|||
object(C)#%d (2) { |
|||
["d:protected"]=> |
|||
string(10) "Original d" |
|||
["e:private"]=> |
|||
string(10) "Original e" |
|||
} |
|||
@ -0,0 +1,54 @@ |
|||
--TEST-- |
|||
Foreach loop tests - Removing the current element from an iterated object. |
|||
--FILE-- |
|||
<?php |
|||
|
|||
class C { |
|||
public $a = "Original a"; |
|||
public $b = "Original b"; |
|||
public $c = "Original c"; |
|||
public $d = "Original d"; |
|||
public $e = "Original e"; |
|||
} |
|||
|
|||
echo "\nRemoving the current element from an iterated object.\n"; |
|||
$obj = new C; |
|||
$count=0; |
|||
foreach ($obj as $v) { |
|||
if ($v==$obj->b) { |
|||
unset($obj->b); |
|||
} |
|||
var_dump($v); |
|||
if (++$count>10) { |
|||
echo "Loop detected.\n"; |
|||
break; |
|||
} |
|||
} |
|||
var_dump($obj); |
|||
|
|||
|
|||
?> |
|||
--EXPECTF-- |
|||
|
|||
Removing the current element from an iterated object. |
|||
string(10) "Original a" |
|||
string(10) "Original b" |
|||
|
|||
Notice: Undefined property: C::$b in %s on line 15 |
|||
string(10) "Original c" |
|||
|
|||
Notice: Undefined property: C::$b in %s on line 15 |
|||
string(10) "Original d" |
|||
|
|||
Notice: Undefined property: C::$b in %s on line 15 |
|||
string(10) "Original e" |
|||
object(C)#%d (4) { |
|||
["a"]=> |
|||
string(10) "Original a" |
|||
["c"]=> |
|||
string(10) "Original c" |
|||
["d"]=> |
|||
string(10) "Original d" |
|||
["e"]=> |
|||
string(10) "Original e" |
|||
} |
|||
@ -0,0 +1,78 @@ |
|||
--TEST-- |
|||
Foreach loop tests - removing properties before and after the current property during the loop. |
|||
--FILE-- |
|||
<?php |
|||
|
|||
class C { |
|||
public $a = "Original a"; |
|||
public $b = "Original b"; |
|||
public $c = "Original c"; |
|||
public $d = "Original d"; |
|||
public $e = "Original e"; |
|||
} |
|||
|
|||
echo "\nRemoving properties before the current element from an iterated object.\n"; |
|||
$obj = new C; |
|||
$count=0; |
|||
foreach ($obj as $v) { |
|||
if ($v==$obj->a) { |
|||
unset($obj->c); |
|||
} |
|||
var_dump($v); |
|||
if (++$count>10) { |
|||
echo "Loop detected.\n"; |
|||
break; |
|||
} |
|||
} |
|||
var_dump($obj); |
|||
|
|||
echo "\nRemoving properties before the current element from an iterated object.\n"; |
|||
$obj = new C; |
|||
foreach ($obj as $v) { |
|||
if ($v==$obj->b) { |
|||
unset($obj->a); |
|||
} |
|||
var_dump($v); |
|||
if (++$count>10) { |
|||
echo "Loop detected.\n"; |
|||
break; |
|||
} |
|||
} |
|||
var_dump($obj); |
|||
|
|||
|
|||
?> |
|||
--EXPECTF-- |
|||
|
|||
Removing properties before the current element from an iterated object. |
|||
string(10) "Original a" |
|||
string(10) "Original b" |
|||
string(10) "Original d" |
|||
string(10) "Original e" |
|||
object(C)#%d (4) { |
|||
["a"]=> |
|||
string(10) "Original a" |
|||
["b"]=> |
|||
string(10) "Original b" |
|||
["d"]=> |
|||
string(10) "Original d" |
|||
["e"]=> |
|||
string(10) "Original e" |
|||
} |
|||
|
|||
Removing properties before the current element from an iterated object. |
|||
string(10) "Original a" |
|||
string(10) "Original b" |
|||
string(10) "Original c" |
|||
string(10) "Original d" |
|||
string(10) "Original e" |
|||
object(C)#%d (4) { |
|||
["b"]=> |
|||
string(10) "Original b" |
|||
["c"]=> |
|||
string(10) "Original c" |
|||
["d"]=> |
|||
string(10) "Original d" |
|||
["e"]=> |
|||
string(10) "Original e" |
|||
} |
|||
@ -0,0 +1,147 @@ |
|||
--TEST-- |
|||
Foreach loop tests - substituting the entire iterated entity during the loop. |
|||
--FILE-- |
|||
<?php |
|||
|
|||
class C { |
|||
public $a = "Original a"; |
|||
public $b = "Original b"; |
|||
public $c = "Original c"; |
|||
public $d = "Original d"; |
|||
public $e = "Original e"; |
|||
} |
|||
|
|||
echo "\nSubstituting the iterated object for a different object.\n"; |
|||
$obj = new C; |
|||
$obj2 = new stdclass; |
|||
$obj2->a = "new a"; |
|||
$obj2->b = "new b"; |
|||
$obj2->c = "new c"; |
|||
$obj2->d = "new d"; |
|||
$obj2->e = "new e"; |
|||
$obj2->f = "new f"; |
|||
$ref = &$obj; |
|||
$count=0; |
|||
foreach ($obj as $v) { |
|||
var_dump($v); |
|||
if ($v==$obj->b) { |
|||
$ref=$obj2; |
|||
} |
|||
if (++$count>10) { |
|||
echo "Loop detected.\n"; |
|||
break; |
|||
} |
|||
} |
|||
var_dump($obj); |
|||
|
|||
echo "\nSubstituting the iterated object for an array.\n"; |
|||
$obj = new C; |
|||
$a = array(1,2,3,4,5,6,7,8); |
|||
$ref = &$obj; |
|||
$count=0; |
|||
foreach ($obj as $v) { |
|||
var_dump($v); |
|||
if ($v==="Original b") { |
|||
$ref=$a; |
|||
} |
|||
if (++$count>10) { |
|||
echo "Loop detected.\n"; |
|||
break; |
|||
} |
|||
} |
|||
var_dump($obj); |
|||
|
|||
echo "\nSubstituting the iterated array for an object.\n"; |
|||
$a = array(1,2,3,4,5,6,7,8); |
|||
$obj = new C; |
|||
$ref = &$a; |
|||
$count=0; |
|||
foreach ($a as $v) { |
|||
var_dump($v); |
|||
if ($v===2) { |
|||
$ref=$obj; |
|||
} |
|||
if (++$count>10) { |
|||
echo "Loop detected.\n"; |
|||
break; |
|||
} |
|||
} |
|||
var_dump($obj); |
|||
|
|||
?> |
|||
--EXPECTF-- |
|||
|
|||
Substituting the iterated object for a different object. |
|||
string(10) "Original a" |
|||
string(10) "Original b" |
|||
string(5) "new a" |
|||
string(5) "new b" |
|||
string(5) "new c" |
|||
string(5) "new d" |
|||
string(5) "new e" |
|||
string(5) "new f" |
|||
object(stdClass)#%d (6) { |
|||
["a"]=> |
|||
string(5) "new a" |
|||
["b"]=> |
|||
string(5) "new b" |
|||
["c"]=> |
|||
string(5) "new c" |
|||
["d"]=> |
|||
string(5) "new d" |
|||
["e"]=> |
|||
string(5) "new e" |
|||
["f"]=> |
|||
string(5) "new f" |
|||
} |
|||
|
|||
Substituting the iterated object for an array. |
|||
string(10) "Original a" |
|||
string(10) "Original b" |
|||
int(1) |
|||
int(2) |
|||
int(3) |
|||
int(4) |
|||
int(5) |
|||
int(6) |
|||
int(7) |
|||
int(8) |
|||
array(8) { |
|||
[0]=> |
|||
int(1) |
|||
[1]=> |
|||
int(2) |
|||
[2]=> |
|||
int(3) |
|||
[3]=> |
|||
int(4) |
|||
[4]=> |
|||
int(5) |
|||
[5]=> |
|||
int(6) |
|||
[6]=> |
|||
int(7) |
|||
[7]=> |
|||
int(8) |
|||
} |
|||
|
|||
Substituting the iterated array for an object. |
|||
int(1) |
|||
int(2) |
|||
string(10) "Original a" |
|||
string(10) "Original b" |
|||
string(10) "Original c" |
|||
string(10) "Original d" |
|||
string(10) "Original e" |
|||
object(C)#%d (5) { |
|||
["a"]=> |
|||
string(10) "Original a" |
|||
["b"]=> |
|||
string(10) "Original b" |
|||
["c"]=> |
|||
string(10) "Original c" |
|||
["d"]=> |
|||
string(10) "Original d" |
|||
["e"]=> |
|||
string(10) "Original e" |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue