mirror of
https://github.com/php/php-src.git
synced 2024-09-28 21:36:12 +00:00
New foreach tests. Tested on Windows, Linux and Linux 64 bit.
This commit is contained in:
parent
fada257def
commit
525416a241
69
tests/lang/foreachLoopObjects.001.phpt
Normal file
69
tests/lang/foreachLoopObjects.001.phpt
Normal file
@ -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.
|
||||
unicode(10) "Original a"
|
||||
unicode(10) "Original b"
|
||||
unicode(10) "Original c"
|
||||
unicode(1) "a"
|
||||
unicode(10) "Original a"
|
||||
unicode(1) "b"
|
||||
unicode(10) "Original b"
|
||||
unicode(1) "c"
|
||||
unicode(10) "Original c"
|
||||
|
||||
Check key and value after the loop.
|
||||
unicode(1) "c"
|
||||
unicode(10) "Original c"
|
||||
|
||||
|
||||
Object instantiated inside loop.
|
||||
unicode(10) "Original a"
|
||||
unicode(10) "Original b"
|
||||
unicode(10) "Original c"
|
||||
unicode(1) "a"
|
||||
unicode(10) "Original a"
|
||||
unicode(1) "b"
|
||||
unicode(10) "Original b"
|
||||
unicode(1) "c"
|
||||
unicode(10) "Original c"
|
||||
|
||||
Check key and value after the loop.
|
||||
unicode(1) "c"
|
||||
unicode(10) "Original c"
|
587
tests/lang/foreachLoopObjects.002.phpt
Normal file
587
tests/lang/foreachLoopObjects.002.phpt
Normal file
@ -0,0 +1,587 @@
|
||||
--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);
|
||||
?>
|
||||
===DONE===
|
||||
--EXPECTF--
|
||||
Iterate over various generations from within overridden methods:
|
||||
|
||||
--> Using instance of C:
|
||||
in C::doForEachOnThis
|
||||
unicode(10) "Original a"
|
||||
unicode(10) "Original b"
|
||||
unicode(10) "Original c"
|
||||
unicode(10) "Original d"
|
||||
unicode(10) "Original e"
|
||||
object(C)#%d (5) {
|
||||
[u"a"]=>
|
||||
unicode(9) "changed.a"
|
||||
[u"b"]=>
|
||||
unicode(9) "changed.b"
|
||||
[u"c"]=>
|
||||
unicode(9) "changed.c"
|
||||
[u"d":protected]=>
|
||||
unicode(9) "changed.d"
|
||||
[u"e":u"C":private]=>
|
||||
unicode(9) "changed.e"
|
||||
}
|
||||
|
||||
--> Using instance of D:
|
||||
in D::doForEachOnThis
|
||||
unicode(10) "Original f"
|
||||
unicode(10) "Original g"
|
||||
unicode(10) "Original a"
|
||||
unicode(10) "Original b"
|
||||
unicode(10) "Original c"
|
||||
unicode(10) "Original d"
|
||||
object(D)#%d (7) {
|
||||
[u"f":u"D":private]=>
|
||||
unicode(9) "changed.f"
|
||||
[u"g":protected]=>
|
||||
unicode(9) "changed.g"
|
||||
[u"a"]=>
|
||||
unicode(9) "changed.a"
|
||||
[u"b"]=>
|
||||
unicode(9) "changed.b"
|
||||
[u"c"]=>
|
||||
unicode(9) "changed.c"
|
||||
[u"d":protected]=>
|
||||
unicode(9) "changed.d"
|
||||
[u"e":u"C":private]=>
|
||||
unicode(10) "Original e"
|
||||
}
|
||||
|
||||
--> Using instance of E:
|
||||
in E::doForEachOnThis
|
||||
unicode(12) "Overridden a"
|
||||
unicode(12) "Overridden b"
|
||||
unicode(12) "Overridden c"
|
||||
unicode(12) "Overridden d"
|
||||
unicode(12) "Overridden e"
|
||||
unicode(10) "Original g"
|
||||
object(E)#%d (8) {
|
||||
[u"a"]=>
|
||||
unicode(9) "changed.a"
|
||||
[u"b"]=>
|
||||
unicode(9) "changed.b"
|
||||
[u"c"]=>
|
||||
unicode(9) "changed.c"
|
||||
[u"d":protected]=>
|
||||
unicode(9) "changed.d"
|
||||
[u"e":u"E":private]=>
|
||||
unicode(9) "changed.e"
|
||||
[u"f":u"D":private]=>
|
||||
unicode(10) "Original f"
|
||||
[u"g":protected]=>
|
||||
unicode(9) "changed.g"
|
||||
[u"e":u"C":private]=>
|
||||
unicode(10) "Original e"
|
||||
}
|
||||
|
||||
|
||||
Iterate over various generations from within an inherited method:
|
||||
|
||||
--> Using instance of C:
|
||||
in C::doForEachC
|
||||
unicode(10) "Original a"
|
||||
unicode(10) "Original b"
|
||||
unicode(10) "Original c"
|
||||
unicode(10) "Original d"
|
||||
unicode(10) "Original e"
|
||||
object(C)#%d (5) {
|
||||
[u"a"]=>
|
||||
unicode(9) "changed.a"
|
||||
[u"b"]=>
|
||||
unicode(9) "changed.b"
|
||||
[u"c"]=>
|
||||
unicode(9) "changed.c"
|
||||
[u"d":protected]=>
|
||||
unicode(9) "changed.d"
|
||||
[u"e":u"C":private]=>
|
||||
unicode(9) "changed.e"
|
||||
}
|
||||
|
||||
--> Using instance of D:
|
||||
in C::doForEachC
|
||||
unicode(10) "Original g"
|
||||
unicode(10) "Original a"
|
||||
unicode(10) "Original b"
|
||||
unicode(10) "Original c"
|
||||
unicode(10) "Original d"
|
||||
unicode(10) "Original e"
|
||||
object(D)#%d (7) {
|
||||
[u"f":u"D":private]=>
|
||||
unicode(10) "Original f"
|
||||
[u"g":protected]=>
|
||||
unicode(9) "changed.g"
|
||||
[u"a"]=>
|
||||
unicode(9) "changed.a"
|
||||
[u"b"]=>
|
||||
unicode(9) "changed.b"
|
||||
[u"c"]=>
|
||||
unicode(9) "changed.c"
|
||||
[u"d":protected]=>
|
||||
unicode(9) "changed.d"
|
||||
[u"e":u"C":private]=>
|
||||
unicode(9) "changed.e"
|
||||
}
|
||||
|
||||
--> Using instance of E:
|
||||
in C::doForEachC
|
||||
unicode(12) "Overridden a"
|
||||
unicode(12) "Overridden b"
|
||||
unicode(12) "Overridden c"
|
||||
unicode(12) "Overridden d"
|
||||
unicode(10) "Original g"
|
||||
unicode(10) "Original e"
|
||||
object(E)#%d (8) {
|
||||
[u"a"]=>
|
||||
unicode(9) "changed.a"
|
||||
[u"b"]=>
|
||||
unicode(9) "changed.b"
|
||||
[u"c"]=>
|
||||
unicode(9) "changed.c"
|
||||
[u"d":protected]=>
|
||||
unicode(9) "changed.d"
|
||||
[u"e":u"E":private]=>
|
||||
unicode(12) "Overridden e"
|
||||
[u"f":u"D":private]=>
|
||||
unicode(10) "Original f"
|
||||
[u"g":protected]=>
|
||||
unicode(9) "changed.g"
|
||||
[u"e":u"C":private]=>
|
||||
unicode(9) "changed.e"
|
||||
}
|
||||
|
||||
|
||||
Iterate over various generations from within an overridden static method:
|
||||
|
||||
--> Using instance of C:
|
||||
in C::doForEach
|
||||
unicode(10) "Original a"
|
||||
unicode(10) "Original b"
|
||||
unicode(10) "Original c"
|
||||
unicode(10) "Original d"
|
||||
unicode(10) "Original e"
|
||||
object(C)#%d (5) {
|
||||
[u"a"]=>
|
||||
unicode(9) "changed.a"
|
||||
[u"b"]=>
|
||||
unicode(9) "changed.b"
|
||||
[u"c"]=>
|
||||
unicode(9) "changed.c"
|
||||
[u"d":protected]=>
|
||||
unicode(9) "changed.d"
|
||||
[u"e":u"C":private]=>
|
||||
unicode(9) "changed.e"
|
||||
}
|
||||
in D::doForEach
|
||||
unicode(10) "Original a"
|
||||
unicode(10) "Original b"
|
||||
unicode(10) "Original c"
|
||||
unicode(10) "Original d"
|
||||
object(C)#%d (5) {
|
||||
[u"a"]=>
|
||||
unicode(9) "changed.a"
|
||||
[u"b"]=>
|
||||
unicode(9) "changed.b"
|
||||
[u"c"]=>
|
||||
unicode(9) "changed.c"
|
||||
[u"d":protected]=>
|
||||
unicode(9) "changed.d"
|
||||
[u"e":u"C":private]=>
|
||||
unicode(10) "Original e"
|
||||
}
|
||||
in E::doForEach
|
||||
unicode(10) "Original a"
|
||||
unicode(10) "Original b"
|
||||
unicode(10) "Original c"
|
||||
unicode(10) "Original d"
|
||||
object(C)#%d (5) {
|
||||
[u"a"]=>
|
||||
unicode(9) "changed.a"
|
||||
[u"b"]=>
|
||||
unicode(9) "changed.b"
|
||||
[u"c"]=>
|
||||
unicode(9) "changed.c"
|
||||
[u"d":protected]=>
|
||||
unicode(9) "changed.d"
|
||||
[u"e":u"C":private]=>
|
||||
unicode(10) "Original e"
|
||||
}
|
||||
|
||||
--> Using instance of D:
|
||||
in C::doForEach
|
||||
unicode(10) "Original g"
|
||||
unicode(10) "Original a"
|
||||
unicode(10) "Original b"
|
||||
unicode(10) "Original c"
|
||||
unicode(10) "Original d"
|
||||
unicode(10) "Original e"
|
||||
object(D)#%d (7) {
|
||||
[u"f":u"D":private]=>
|
||||
unicode(10) "Original f"
|
||||
[u"g":protected]=>
|
||||
unicode(9) "changed.g"
|
||||
[u"a"]=>
|
||||
unicode(9) "changed.a"
|
||||
[u"b"]=>
|
||||
unicode(9) "changed.b"
|
||||
[u"c"]=>
|
||||
unicode(9) "changed.c"
|
||||
[u"d":protected]=>
|
||||
unicode(9) "changed.d"
|
||||
[u"e":u"C":private]=>
|
||||
unicode(9) "changed.e"
|
||||
}
|
||||
in D::doForEach
|
||||
unicode(10) "Original f"
|
||||
unicode(10) "Original g"
|
||||
unicode(10) "Original a"
|
||||
unicode(10) "Original b"
|
||||
unicode(10) "Original c"
|
||||
unicode(10) "Original d"
|
||||
object(D)#%d (7) {
|
||||
[u"f":u"D":private]=>
|
||||
unicode(9) "changed.f"
|
||||
[u"g":protected]=>
|
||||
unicode(9) "changed.g"
|
||||
[u"a"]=>
|
||||
unicode(9) "changed.a"
|
||||
[u"b"]=>
|
||||
unicode(9) "changed.b"
|
||||
[u"c"]=>
|
||||
unicode(9) "changed.c"
|
||||
[u"d":protected]=>
|
||||
unicode(9) "changed.d"
|
||||
[u"e":u"C":private]=>
|
||||
unicode(10) "Original e"
|
||||
}
|
||||
in E::doForEach
|
||||
unicode(10) "Original g"
|
||||
unicode(10) "Original a"
|
||||
unicode(10) "Original b"
|
||||
unicode(10) "Original c"
|
||||
unicode(10) "Original d"
|
||||
object(D)#%d (7) {
|
||||
[u"f":u"D":private]=>
|
||||
unicode(10) "Original f"
|
||||
[u"g":protected]=>
|
||||
unicode(9) "changed.g"
|
||||
[u"a"]=>
|
||||
unicode(9) "changed.a"
|
||||
[u"b"]=>
|
||||
unicode(9) "changed.b"
|
||||
[u"c"]=>
|
||||
unicode(9) "changed.c"
|
||||
[u"d":protected]=>
|
||||
unicode(9) "changed.d"
|
||||
[u"e":u"C":private]=>
|
||||
unicode(10) "Original e"
|
||||
}
|
||||
|
||||
--> Using instance of E:
|
||||
in C::doForEach
|
||||
unicode(12) "Overridden a"
|
||||
unicode(12) "Overridden b"
|
||||
unicode(12) "Overridden c"
|
||||
unicode(12) "Overridden d"
|
||||
unicode(10) "Original g"
|
||||
unicode(10) "Original e"
|
||||
object(E)#%d (8) {
|
||||
[u"a"]=>
|
||||
unicode(9) "changed.a"
|
||||
[u"b"]=>
|
||||
unicode(9) "changed.b"
|
||||
[u"c"]=>
|
||||
unicode(9) "changed.c"
|
||||
[u"d":protected]=>
|
||||
unicode(9) "changed.d"
|
||||
[u"e":u"E":private]=>
|
||||
unicode(12) "Overridden e"
|
||||
[u"f":u"D":private]=>
|
||||
unicode(10) "Original f"
|
||||
[u"g":protected]=>
|
||||
unicode(9) "changed.g"
|
||||
[u"e":u"C":private]=>
|
||||
unicode(9) "changed.e"
|
||||
}
|
||||
in D::doForEach
|
||||
unicode(12) "Overridden a"
|
||||
unicode(12) "Overridden b"
|
||||
unicode(12) "Overridden c"
|
||||
unicode(12) "Overridden d"
|
||||
unicode(10) "Original f"
|
||||
unicode(10) "Original g"
|
||||
object(E)#%d (8) {
|
||||
[u"a"]=>
|
||||
unicode(9) "changed.a"
|
||||
[u"b"]=>
|
||||
unicode(9) "changed.b"
|
||||
[u"c"]=>
|
||||
unicode(9) "changed.c"
|
||||
[u"d":protected]=>
|
||||
unicode(9) "changed.d"
|
||||
[u"e":u"E":private]=>
|
||||
unicode(12) "Overridden e"
|
||||
[u"f":u"D":private]=>
|
||||
unicode(9) "changed.f"
|
||||
[u"g":protected]=>
|
||||
unicode(9) "changed.g"
|
||||
[u"e":u"C":private]=>
|
||||
unicode(10) "Original e"
|
||||
}
|
||||
in E::doForEach
|
||||
unicode(12) "Overridden a"
|
||||
unicode(12) "Overridden b"
|
||||
unicode(12) "Overridden c"
|
||||
unicode(12) "Overridden d"
|
||||
unicode(12) "Overridden e"
|
||||
unicode(10) "Original g"
|
||||
object(E)#%d (8) {
|
||||
[u"a"]=>
|
||||
unicode(9) "changed.a"
|
||||
[u"b"]=>
|
||||
unicode(9) "changed.b"
|
||||
[u"c"]=>
|
||||
unicode(9) "changed.c"
|
||||
[u"d":protected]=>
|
||||
unicode(9) "changed.d"
|
||||
[u"e":u"E":private]=>
|
||||
unicode(9) "changed.e"
|
||||
[u"f":u"D":private]=>
|
||||
unicode(10) "Original f"
|
||||
[u"g":protected]=>
|
||||
unicode(9) "changed.g"
|
||||
[u"e":u"C":private]=>
|
||||
unicode(10) "Original e"
|
||||
}
|
||||
|
||||
|
||||
Iterate over various generations from outside the object:
|
||||
|
||||
--> Using instance of C:
|
||||
unicode(10) "Original a"
|
||||
unicode(10) "Original b"
|
||||
unicode(10) "Original c"
|
||||
object(C)#%d (5) {
|
||||
[u"a"]=>
|
||||
unicode(9) "changed.a"
|
||||
[u"b"]=>
|
||||
unicode(9) "changed.b"
|
||||
[u"c"]=>
|
||||
&unicode(9) "changed.c"
|
||||
[u"d":protected]=>
|
||||
unicode(10) "Original d"
|
||||
[u"e":u"C":private]=>
|
||||
unicode(10) "Original e"
|
||||
}
|
||||
|
||||
--> Using instance of D:
|
||||
unicode(10) "Original a"
|
||||
unicode(10) "Original b"
|
||||
unicode(10) "Original c"
|
||||
object(D)#%d (7) {
|
||||
[u"f":u"D":private]=>
|
||||
unicode(10) "Original f"
|
||||
[u"g":protected]=>
|
||||
unicode(10) "Original g"
|
||||
[u"a"]=>
|
||||
unicode(9) "changed.a"
|
||||
[u"b"]=>
|
||||
unicode(9) "changed.b"
|
||||
[u"c"]=>
|
||||
&unicode(9) "changed.c"
|
||||
[u"d":protected]=>
|
||||
unicode(10) "Original d"
|
||||
[u"e":u"C":private]=>
|
||||
unicode(10) "Original e"
|
||||
}
|
||||
|
||||
--> Using instance of E:
|
||||
unicode(12) "Overridden a"
|
||||
unicode(12) "Overridden b"
|
||||
unicode(12) "Overridden c"
|
||||
object(E)#%d (8) {
|
||||
[u"a"]=>
|
||||
unicode(9) "changed.a"
|
||||
[u"b"]=>
|
||||
unicode(9) "changed.b"
|
||||
[u"c"]=>
|
||||
&unicode(9) "changed.c"
|
||||
[u"d":protected]=>
|
||||
unicode(12) "Overridden d"
|
||||
[u"e":u"E":private]=>
|
||||
unicode(12) "Overridden e"
|
||||
[u"f":u"D":private]=>
|
||||
unicode(10) "Original f"
|
||||
[u"g":protected]=>
|
||||
unicode(10) "Original g"
|
||||
[u"e":u"C":private]=>
|
||||
unicode(10) "Original e"
|
||||
}
|
||||
===DONE===
|
250
tests/lang/foreachLoopObjects.003.phpt
Normal file
250
tests/lang/foreachLoopObjects.003.phpt
Normal file
@ -0,0 +1,250 @@
|
||||
--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);
|
||||
|
||||
?>
|
||||
===DONE===
|
||||
--EXPECTF--
|
||||
Directly changing object values.
|
||||
unicode(10) "Original a"
|
||||
unicode(10) "Original b"
|
||||
unicode(10) "Original c"
|
||||
object(C)#%d (5) {
|
||||
[u"a"]=>
|
||||
unicode(9) "changed.a"
|
||||
[u"b"]=>
|
||||
unicode(9) "changed.b"
|
||||
[u"c"]=>
|
||||
unicode(9) "changed.c"
|
||||
[u"d":protected]=>
|
||||
unicode(10) "Original d"
|
||||
[u"e":u"C":private]=>
|
||||
unicode(10) "Original e"
|
||||
}
|
||||
|
||||
Modifying the foreach $value.
|
||||
object(C)#%d (5) {
|
||||
[u"a"]=>
|
||||
unicode(10) "Original a"
|
||||
[u"b"]=>
|
||||
unicode(10) "Original b"
|
||||
[u"c"]=>
|
||||
unicode(10) "Original c"
|
||||
[u"d":protected]=>
|
||||
unicode(10) "Original d"
|
||||
[u"e":u"C":private]=>
|
||||
unicode(10) "Original e"
|
||||
}
|
||||
|
||||
Modifying the foreach &$value.
|
||||
object(C)#%d (5) {
|
||||
[u"a"]=>
|
||||
unicode(9) "changed.a"
|
||||
[u"b"]=>
|
||||
unicode(9) "changed.b"
|
||||
[u"c"]=>
|
||||
&unicode(9) "changed.c"
|
||||
[u"d":protected]=>
|
||||
unicode(10) "Original d"
|
||||
[u"e":u"C":private]=>
|
||||
unicode(10) "Original e"
|
||||
}
|
||||
|
||||
Adding properties to an an object.
|
||||
unicode(10) "Original a"
|
||||
unicode(10) "Original b"
|
||||
unicode(10) "Original c"
|
||||
unicode(16) "Added property 0"
|
||||
unicode(16) "Added property 1"
|
||||
unicode(16) "Added property 2"
|
||||
unicode(16) "Added property 3"
|
||||
unicode(16) "Added property 4"
|
||||
unicode(16) "Added property 5"
|
||||
unicode(16) "Added property 6"
|
||||
unicode(16) "Added property 7"
|
||||
Loop detected
|
||||
object(C)#%d (17) {
|
||||
[u"a"]=>
|
||||
unicode(10) "Original a"
|
||||
[u"b"]=>
|
||||
unicode(10) "Original b"
|
||||
[u"c"]=>
|
||||
unicode(10) "Original c"
|
||||
[u"d":protected]=>
|
||||
unicode(10) "Original d"
|
||||
[u"e":u"C":private]=>
|
||||
unicode(10) "Original e"
|
||||
[u"new0"]=>
|
||||
unicode(16) "Added property 0"
|
||||
[u"new1"]=>
|
||||
unicode(16) "Added property 1"
|
||||
[u"new2"]=>
|
||||
unicode(16) "Added property 2"
|
||||
[u"new3"]=>
|
||||
unicode(16) "Added property 3"
|
||||
[u"new4"]=>
|
||||
unicode(16) "Added property 4"
|
||||
[u"new5"]=>
|
||||
unicode(16) "Added property 5"
|
||||
[u"new6"]=>
|
||||
unicode(16) "Added property 6"
|
||||
[u"new7"]=>
|
||||
unicode(16) "Added property 7"
|
||||
[u"new8"]=>
|
||||
unicode(16) "Added property 8"
|
||||
[u"new9"]=>
|
||||
unicode(16) "Added property 9"
|
||||
[u"new10"]=>
|
||||
unicode(17) "Added property 10"
|
||||
[u"new11"]=>
|
||||
unicode(17) "Added property 11"
|
||||
}
|
||||
|
||||
Adding properties to an an object, using &$value.
|
||||
unicode(10) "Original a"
|
||||
unicode(10) "Original b"
|
||||
unicode(10) "Original c"
|
||||
unicode(16) "Added property 0"
|
||||
unicode(16) "Added property 1"
|
||||
unicode(16) "Added property 2"
|
||||
unicode(16) "Added property 3"
|
||||
unicode(16) "Added property 4"
|
||||
unicode(16) "Added property 5"
|
||||
unicode(16) "Added property 6"
|
||||
unicode(16) "Added property 7"
|
||||
Loop detected
|
||||
object(C)#%d (17) {
|
||||
[u"a"]=>
|
||||
unicode(10) "Original a"
|
||||
[u"b"]=>
|
||||
unicode(10) "Original b"
|
||||
[u"c"]=>
|
||||
unicode(10) "Original c"
|
||||
[u"d":protected]=>
|
||||
unicode(10) "Original d"
|
||||
[u"e":u"C":private]=>
|
||||
unicode(10) "Original e"
|
||||
[u"new0"]=>
|
||||
unicode(16) "Added property 0"
|
||||
[u"new1"]=>
|
||||
unicode(16) "Added property 1"
|
||||
[u"new2"]=>
|
||||
unicode(16) "Added property 2"
|
||||
[u"new3"]=>
|
||||
unicode(16) "Added property 3"
|
||||
[u"new4"]=>
|
||||
unicode(16) "Added property 4"
|
||||
[u"new5"]=>
|
||||
unicode(16) "Added property 5"
|
||||
[u"new6"]=>
|
||||
unicode(16) "Added property 6"
|
||||
[u"new7"]=>
|
||||
unicode(16) "Added property 7"
|
||||
[u"new8"]=>
|
||||
&unicode(16) "Added property 8"
|
||||
[u"new9"]=>
|
||||
unicode(16) "Added property 9"
|
||||
[u"new10"]=>
|
||||
unicode(17) "Added property 10"
|
||||
[u"new11"]=>
|
||||
unicode(17) "Added property 11"
|
||||
}
|
||||
|
||||
Removing properties from an object.
|
||||
unicode(10) "Original a"
|
||||
object(C)#%d (2) {
|
||||
[u"d":protected]=>
|
||||
unicode(10) "Original d"
|
||||
[u"e":u"C":private]=>
|
||||
unicode(10) "Original e"
|
||||
}
|
||||
|
||||
Removing properties from an object, using &$value.
|
||||
unicode(10) "Original a"
|
||||
object(C)#%d (2) {
|
||||
[u"d":protected]=>
|
||||
unicode(10) "Original d"
|
||||
[u"e":u"C":private]=>
|
||||
unicode(10) "Original e"
|
||||
}
|
||||
===DONE===
|
54
tests/lang/foreachLoopObjects.004.phpt
Normal file
54
tests/lang/foreachLoopObjects.004.phpt
Normal file
@ -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);
|
||||
|
||||
?>
|
||||
===DONE===
|
||||
--EXPECTF--
|
||||
Removing the current element from an iterated object.
|
||||
unicode(10) "Original a"
|
||||
unicode(10) "Original b"
|
||||
|
||||
Notice: Undefined property: C::$b in %s on line %d
|
||||
unicode(10) "Original c"
|
||||
|
||||
Notice: Undefined property: C::$b in %s on line %d
|
||||
unicode(10) "Original d"
|
||||
|
||||
Notice: Undefined property: C::$b in %s on line %d
|
||||
unicode(10) "Original e"
|
||||
object(C)#%d (4) {
|
||||
[u"a"]=>
|
||||
unicode(10) "Original a"
|
||||
[u"c"]=>
|
||||
unicode(10) "Original c"
|
||||
[u"d"]=>
|
||||
unicode(10) "Original d"
|
||||
[u"e"]=>
|
||||
unicode(10) "Original e"
|
||||
}
|
||||
===DONE===
|
79
tests/lang/foreachLoopObjects.005.phpt
Normal file
79
tests/lang/foreachLoopObjects.005.phpt
Normal file
@ -0,0 +1,79 @@
|
||||
--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);
|
||||
|
||||
|
||||
?>
|
||||
===DONE===
|
||||
--EXPECTF--
|
||||
Removing properties before the current element from an iterated object.
|
||||
unicode(10) "Original a"
|
||||
unicode(10) "Original b"
|
||||
unicode(10) "Original d"
|
||||
unicode(10) "Original e"
|
||||
object(C)#%d (4) {
|
||||
[u"a"]=>
|
||||
unicode(10) "Original a"
|
||||
[u"b"]=>
|
||||
unicode(10) "Original b"
|
||||
[u"d"]=>
|
||||
unicode(10) "Original d"
|
||||
[u"e"]=>
|
||||
unicode(10) "Original e"
|
||||
}
|
||||
|
||||
Removing properties before the current element from an iterated object.
|
||||
unicode(10) "Original a"
|
||||
unicode(10) "Original b"
|
||||
unicode(10) "Original c"
|
||||
unicode(10) "Original d"
|
||||
unicode(10) "Original e"
|
||||
object(C)#%d (4) {
|
||||
[u"b"]=>
|
||||
unicode(10) "Original b"
|
||||
[u"c"]=>
|
||||
unicode(10) "Original c"
|
||||
[u"d"]=>
|
||||
unicode(10) "Original d"
|
||||
[u"e"]=>
|
||||
unicode(10) "Original e"
|
||||
}
|
||||
===DONE===
|
148
tests/lang/foreachLoopObjects.006.phpt
Normal file
148
tests/lang/foreachLoopObjects.006.phpt
Normal file
@ -0,0 +1,148 @@
|
||||
--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);
|
||||
|
||||
?>
|
||||
===DONE===
|
||||
--EXPECTF--
|
||||
Substituting the iterated object for a different object.
|
||||
unicode(10) "Original a"
|
||||
unicode(10) "Original b"
|
||||
unicode(5) "new a"
|
||||
unicode(5) "new b"
|
||||
unicode(5) "new c"
|
||||
unicode(5) "new d"
|
||||
unicode(5) "new e"
|
||||
unicode(5) "new f"
|
||||
object(stdClass)#%d (6) {
|
||||
[u"a"]=>
|
||||
unicode(5) "new a"
|
||||
[u"b"]=>
|
||||
unicode(5) "new b"
|
||||
[u"c"]=>
|
||||
unicode(5) "new c"
|
||||
[u"d"]=>
|
||||
unicode(5) "new d"
|
||||
[u"e"]=>
|
||||
unicode(5) "new e"
|
||||
[u"f"]=>
|
||||
unicode(5) "new f"
|
||||
}
|
||||
|
||||
Substituting the iterated object for an array.
|
||||
unicode(10) "Original a"
|
||||
unicode(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)
|
||||
unicode(10) "Original a"
|
||||
unicode(10) "Original b"
|
||||
unicode(10) "Original c"
|
||||
unicode(10) "Original d"
|
||||
unicode(10) "Original e"
|
||||
object(C)#1 (5) {
|
||||
[u"a"]=>
|
||||
unicode(10) "Original a"
|
||||
[u"b"]=>
|
||||
unicode(10) "Original b"
|
||||
[u"c"]=>
|
||||
unicode(10) "Original c"
|
||||
[u"d"]=>
|
||||
unicode(10) "Original d"
|
||||
[u"e"]=>
|
||||
unicode(10) "Original e"
|
||||
}
|
||||
===DONE===
|
Loading…
Reference in New Issue
Block a user