foreachLoopObjects.002.phpt 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585
  1. --TEST--
  2. Foreach loop tests - visibility.
  3. --FILE--
  4. <?php
  5. class C {
  6. public $a = "Original a";
  7. public $b = "Original b";
  8. public $c = "Original c";
  9. protected $d = "Original d";
  10. private $e = "Original e";
  11. function doForEachC() {
  12. echo "in C::doForEachC\n";
  13. foreach ($this as $k=>&$v) {
  14. var_dump($v);
  15. $v="changed.$k";
  16. }
  17. }
  18. static function doForEach($obj) {
  19. echo "in C::doForEach\n";
  20. foreach ($obj as $k=>&$v) {
  21. var_dump($v);
  22. $v="changed.$k";
  23. }
  24. }
  25. function doForEachOnThis() {
  26. echo "in C::doForEachOnThis\n";
  27. foreach ($this as $k=>&$v) {
  28. var_dump($v);
  29. $v="changed.$k";
  30. }
  31. }
  32. }
  33. class D extends C {
  34. private $f = "Original f";
  35. protected $g = "Original g";
  36. static function doForEach($obj) {
  37. echo "in D::doForEach\n";
  38. foreach ($obj as $k=>&$v) {
  39. var_dump($v);
  40. $v="changed.$k";
  41. }
  42. }
  43. function doForEachOnThis() {
  44. echo "in D::doForEachOnThis\n";
  45. foreach ($this as $k=>&$v) {
  46. var_dump($v);
  47. $v="changed.$k";
  48. }
  49. }
  50. }
  51. class E extends D {
  52. public $a = "Overridden a";
  53. public $b = "Overridden b";
  54. public $c = "Overridden c";
  55. protected $d = "Overridden d";
  56. private $e = "Overridden e";
  57. static function doForEach($obj) {
  58. echo "in E::doForEach\n";
  59. foreach ($obj as $k=>&$v) {
  60. var_dump($v);
  61. $v="changed.$k";
  62. }
  63. }
  64. function doForEachOnThis() {
  65. echo "in E::doForEachOnThis\n";
  66. foreach ($this as $k=>&$v) {
  67. var_dump($v);
  68. $v="changed.$k";
  69. }
  70. }
  71. }
  72. echo "\n\nIterate over various generations from within overridden methods:\n";
  73. echo "\n--> Using instance of C:\n";
  74. $myC = new C;
  75. $myC->doForEachOnThis();
  76. var_dump($myC);
  77. echo "\n--> Using instance of D:\n";
  78. $myD = new D;
  79. $myD->doForEachOnThis();
  80. var_dump($myD);
  81. echo "\n--> Using instance of E:\n";
  82. $myE = new E;
  83. $myE->doForEachOnThis();
  84. var_dump($myE);
  85. echo "\n\nIterate over various generations from within an inherited method:\n";
  86. echo "\n--> Using instance of C:\n";
  87. $myC = new C;
  88. $myC->doForEachC();
  89. var_dump($myC);
  90. echo "\n--> Using instance of D:\n";
  91. $myD = new D;
  92. $myD->doForEachC();
  93. var_dump($myD);
  94. echo "\n--> Using instance of E:\n";
  95. $myE = new E;
  96. $myE->doForEachC();
  97. var_dump($myE);
  98. echo "\n\nIterate over various generations from within an overridden static method:\n";
  99. echo "\n--> Using instance of C:\n";
  100. $myC = new C;
  101. C::doForEach($myC);
  102. var_dump($myC);
  103. $myC = new C;
  104. D::doForEach($myC);
  105. var_dump($myC);
  106. $myC = new C;
  107. E::doForEach($myC);
  108. var_dump($myC);
  109. echo "\n--> Using instance of D:\n";
  110. $myD = new D;
  111. C::doForEach($myD);
  112. var_dump($myD);
  113. $myD = new D;
  114. D::doForEach($myD);
  115. var_dump($myD);
  116. $myD = new D;
  117. E::doForEach($myD);
  118. var_dump($myD);
  119. echo "\n--> Using instance of E:\n";
  120. $myE = new E;
  121. C::doForEach($myE);
  122. var_dump($myE);
  123. $myE = new E;
  124. D::doForEach($myE);
  125. var_dump($myE);
  126. $myE = new E;
  127. E::doForEach($myE);
  128. var_dump($myE);
  129. echo "\n\nIterate over various generations from outside the object:\n";
  130. echo "\n--> Using instance of C:\n";
  131. $myC = new C;
  132. foreach ($myC as $k=>&$v) {
  133. var_dump($v);
  134. $v="changed.$k";
  135. }
  136. var_dump($myC);
  137. echo "\n--> Using instance of D:\n";
  138. $myD = new D;
  139. foreach ($myD as $k=>&$v) {
  140. var_dump($v);
  141. $v="changed.$k";
  142. }
  143. var_dump($myD);
  144. echo "\n--> Using instance of E:\n";
  145. $myE = new E;
  146. foreach ($myE as $k=>&$v) {
  147. var_dump($v);
  148. $v="changed.$k";
  149. }
  150. var_dump($myE);
  151. ?>
  152. --EXPECTF--
  153. Iterate over various generations from within overridden methods:
  154. --> Using instance of C:
  155. in C::doForEachOnThis
  156. string(10) "Original a"
  157. string(10) "Original b"
  158. string(10) "Original c"
  159. string(10) "Original d"
  160. string(10) "Original e"
  161. object(C)#%d (5) {
  162. ["a"]=>
  163. string(9) "changed.a"
  164. ["b"]=>
  165. string(9) "changed.b"
  166. ["c"]=>
  167. string(9) "changed.c"
  168. ["d":protected]=>
  169. string(9) "changed.d"
  170. ["e":"C":private]=>
  171. string(9) "changed.e"
  172. }
  173. --> Using instance of D:
  174. in D::doForEachOnThis
  175. string(10) "Original a"
  176. string(10) "Original b"
  177. string(10) "Original c"
  178. string(10) "Original d"
  179. string(10) "Original f"
  180. string(10) "Original g"
  181. object(D)#%d (7) {
  182. ["a"]=>
  183. string(9) "changed.a"
  184. ["b"]=>
  185. string(9) "changed.b"
  186. ["c"]=>
  187. string(9) "changed.c"
  188. ["d":protected]=>
  189. string(9) "changed.d"
  190. ["e":"C":private]=>
  191. string(10) "Original e"
  192. ["f":"D":private]=>
  193. string(9) "changed.f"
  194. ["g":protected]=>
  195. string(9) "changed.g"
  196. }
  197. --> Using instance of E:
  198. in E::doForEachOnThis
  199. string(12) "Overridden a"
  200. string(12) "Overridden b"
  201. string(12) "Overridden c"
  202. string(12) "Overridden d"
  203. string(10) "Original g"
  204. string(12) "Overridden e"
  205. object(E)#%d (8) {
  206. ["a"]=>
  207. string(9) "changed.a"
  208. ["b"]=>
  209. string(9) "changed.b"
  210. ["c"]=>
  211. string(9) "changed.c"
  212. ["d":protected]=>
  213. string(9) "changed.d"
  214. ["e":"C":private]=>
  215. string(10) "Original e"
  216. ["f":"D":private]=>
  217. string(10) "Original f"
  218. ["g":protected]=>
  219. string(9) "changed.g"
  220. ["e":"E":private]=>
  221. string(9) "changed.e"
  222. }
  223. Iterate over various generations from within an inherited method:
  224. --> Using instance of C:
  225. in C::doForEachC
  226. string(10) "Original a"
  227. string(10) "Original b"
  228. string(10) "Original c"
  229. string(10) "Original d"
  230. string(10) "Original e"
  231. object(C)#%d (5) {
  232. ["a"]=>
  233. string(9) "changed.a"
  234. ["b"]=>
  235. string(9) "changed.b"
  236. ["c"]=>
  237. string(9) "changed.c"
  238. ["d":protected]=>
  239. string(9) "changed.d"
  240. ["e":"C":private]=>
  241. string(9) "changed.e"
  242. }
  243. --> Using instance of D:
  244. in C::doForEachC
  245. string(10) "Original a"
  246. string(10) "Original b"
  247. string(10) "Original c"
  248. string(10) "Original d"
  249. string(10) "Original e"
  250. string(10) "Original g"
  251. object(D)#%d (7) {
  252. ["a"]=>
  253. string(9) "changed.a"
  254. ["b"]=>
  255. string(9) "changed.b"
  256. ["c"]=>
  257. string(9) "changed.c"
  258. ["d":protected]=>
  259. string(9) "changed.d"
  260. ["e":"C":private]=>
  261. string(9) "changed.e"
  262. ["f":"D":private]=>
  263. string(10) "Original f"
  264. ["g":protected]=>
  265. string(9) "changed.g"
  266. }
  267. --> Using instance of E:
  268. in C::doForEachC
  269. string(12) "Overridden a"
  270. string(12) "Overridden b"
  271. string(12) "Overridden c"
  272. string(12) "Overridden d"
  273. string(10) "Original e"
  274. string(10) "Original g"
  275. object(E)#%d (8) {
  276. ["a"]=>
  277. string(9) "changed.a"
  278. ["b"]=>
  279. string(9) "changed.b"
  280. ["c"]=>
  281. string(9) "changed.c"
  282. ["d":protected]=>
  283. string(9) "changed.d"
  284. ["e":"C":private]=>
  285. string(9) "changed.e"
  286. ["f":"D":private]=>
  287. string(10) "Original f"
  288. ["g":protected]=>
  289. string(9) "changed.g"
  290. ["e":"E":private]=>
  291. string(12) "Overridden e"
  292. }
  293. Iterate over various generations from within an overridden static method:
  294. --> Using instance of C:
  295. in C::doForEach
  296. string(10) "Original a"
  297. string(10) "Original b"
  298. string(10) "Original c"
  299. string(10) "Original d"
  300. string(10) "Original e"
  301. object(C)#%d (5) {
  302. ["a"]=>
  303. string(9) "changed.a"
  304. ["b"]=>
  305. string(9) "changed.b"
  306. ["c"]=>
  307. string(9) "changed.c"
  308. ["d":protected]=>
  309. string(9) "changed.d"
  310. ["e":"C":private]=>
  311. string(9) "changed.e"
  312. }
  313. in D::doForEach
  314. string(10) "Original a"
  315. string(10) "Original b"
  316. string(10) "Original c"
  317. string(10) "Original d"
  318. object(C)#%d (5) {
  319. ["a"]=>
  320. string(9) "changed.a"
  321. ["b"]=>
  322. string(9) "changed.b"
  323. ["c"]=>
  324. string(9) "changed.c"
  325. ["d":protected]=>
  326. string(9) "changed.d"
  327. ["e":"C":private]=>
  328. string(10) "Original e"
  329. }
  330. in E::doForEach
  331. string(10) "Original a"
  332. string(10) "Original b"
  333. string(10) "Original c"
  334. string(10) "Original d"
  335. object(C)#%d (5) {
  336. ["a"]=>
  337. string(9) "changed.a"
  338. ["b"]=>
  339. string(9) "changed.b"
  340. ["c"]=>
  341. string(9) "changed.c"
  342. ["d":protected]=>
  343. string(9) "changed.d"
  344. ["e":"C":private]=>
  345. string(10) "Original e"
  346. }
  347. --> Using instance of D:
  348. in C::doForEach
  349. string(10) "Original a"
  350. string(10) "Original b"
  351. string(10) "Original c"
  352. string(10) "Original d"
  353. string(10) "Original e"
  354. string(10) "Original g"
  355. object(D)#%d (7) {
  356. ["a"]=>
  357. string(9) "changed.a"
  358. ["b"]=>
  359. string(9) "changed.b"
  360. ["c"]=>
  361. string(9) "changed.c"
  362. ["d":protected]=>
  363. string(9) "changed.d"
  364. ["e":"C":private]=>
  365. string(9) "changed.e"
  366. ["f":"D":private]=>
  367. string(10) "Original f"
  368. ["g":protected]=>
  369. string(9) "changed.g"
  370. }
  371. in D::doForEach
  372. string(10) "Original a"
  373. string(10) "Original b"
  374. string(10) "Original c"
  375. string(10) "Original d"
  376. string(10) "Original f"
  377. string(10) "Original g"
  378. object(D)#%d (7) {
  379. ["a"]=>
  380. string(9) "changed.a"
  381. ["b"]=>
  382. string(9) "changed.b"
  383. ["c"]=>
  384. string(9) "changed.c"
  385. ["d":protected]=>
  386. string(9) "changed.d"
  387. ["e":"C":private]=>
  388. string(10) "Original e"
  389. ["f":"D":private]=>
  390. string(9) "changed.f"
  391. ["g":protected]=>
  392. string(9) "changed.g"
  393. }
  394. in E::doForEach
  395. string(10) "Original a"
  396. string(10) "Original b"
  397. string(10) "Original c"
  398. string(10) "Original d"
  399. string(10) "Original g"
  400. object(D)#%d (7) {
  401. ["a"]=>
  402. string(9) "changed.a"
  403. ["b"]=>
  404. string(9) "changed.b"
  405. ["c"]=>
  406. string(9) "changed.c"
  407. ["d":protected]=>
  408. string(9) "changed.d"
  409. ["e":"C":private]=>
  410. string(10) "Original e"
  411. ["f":"D":private]=>
  412. string(10) "Original f"
  413. ["g":protected]=>
  414. string(9) "changed.g"
  415. }
  416. --> Using instance of E:
  417. in C::doForEach
  418. string(12) "Overridden a"
  419. string(12) "Overridden b"
  420. string(12) "Overridden c"
  421. string(12) "Overridden d"
  422. string(10) "Original e"
  423. string(10) "Original g"
  424. object(E)#%d (8) {
  425. ["a"]=>
  426. string(9) "changed.a"
  427. ["b"]=>
  428. string(9) "changed.b"
  429. ["c"]=>
  430. string(9) "changed.c"
  431. ["d":protected]=>
  432. string(9) "changed.d"
  433. ["e":"C":private]=>
  434. string(9) "changed.e"
  435. ["f":"D":private]=>
  436. string(10) "Original f"
  437. ["g":protected]=>
  438. string(9) "changed.g"
  439. ["e":"E":private]=>
  440. string(12) "Overridden e"
  441. }
  442. in D::doForEach
  443. string(12) "Overridden a"
  444. string(12) "Overridden b"
  445. string(12) "Overridden c"
  446. string(12) "Overridden d"
  447. string(10) "Original f"
  448. string(10) "Original g"
  449. object(E)#%d (8) {
  450. ["a"]=>
  451. string(9) "changed.a"
  452. ["b"]=>
  453. string(9) "changed.b"
  454. ["c"]=>
  455. string(9) "changed.c"
  456. ["d":protected]=>
  457. string(9) "changed.d"
  458. ["e":"C":private]=>
  459. string(10) "Original e"
  460. ["f":"D":private]=>
  461. string(9) "changed.f"
  462. ["g":protected]=>
  463. string(9) "changed.g"
  464. ["e":"E":private]=>
  465. string(12) "Overridden e"
  466. }
  467. in E::doForEach
  468. string(12) "Overridden a"
  469. string(12) "Overridden b"
  470. string(12) "Overridden c"
  471. string(12) "Overridden d"
  472. string(10) "Original g"
  473. string(12) "Overridden e"
  474. object(E)#%d (8) {
  475. ["a"]=>
  476. string(9) "changed.a"
  477. ["b"]=>
  478. string(9) "changed.b"
  479. ["c"]=>
  480. string(9) "changed.c"
  481. ["d":protected]=>
  482. string(9) "changed.d"
  483. ["e":"C":private]=>
  484. string(10) "Original e"
  485. ["f":"D":private]=>
  486. string(10) "Original f"
  487. ["g":protected]=>
  488. string(9) "changed.g"
  489. ["e":"E":private]=>
  490. string(9) "changed.e"
  491. }
  492. Iterate over various generations from outside the object:
  493. --> Using instance of C:
  494. string(10) "Original a"
  495. string(10) "Original b"
  496. string(10) "Original c"
  497. object(C)#%d (5) {
  498. ["a"]=>
  499. string(9) "changed.a"
  500. ["b"]=>
  501. string(9) "changed.b"
  502. ["c"]=>
  503. &string(9) "changed.c"
  504. ["d":protected]=>
  505. string(10) "Original d"
  506. ["e":"C":private]=>
  507. string(10) "Original e"
  508. }
  509. --> Using instance of D:
  510. string(10) "Original a"
  511. string(10) "Original b"
  512. string(10) "Original c"
  513. object(D)#%d (7) {
  514. ["a"]=>
  515. string(9) "changed.a"
  516. ["b"]=>
  517. string(9) "changed.b"
  518. ["c"]=>
  519. &string(9) "changed.c"
  520. ["d":protected]=>
  521. string(10) "Original d"
  522. ["e":"C":private]=>
  523. string(10) "Original e"
  524. ["f":"D":private]=>
  525. string(10) "Original f"
  526. ["g":protected]=>
  527. string(10) "Original g"
  528. }
  529. --> Using instance of E:
  530. string(12) "Overridden a"
  531. string(12) "Overridden b"
  532. string(12) "Overridden c"
  533. object(E)#%d (8) {
  534. ["a"]=>
  535. string(9) "changed.a"
  536. ["b"]=>
  537. string(9) "changed.b"
  538. ["c"]=>
  539. &string(9) "changed.c"
  540. ["d":protected]=>
  541. string(12) "Overridden d"
  542. ["e":"C":private]=>
  543. string(10) "Original e"
  544. ["f":"D":private]=>
  545. string(10) "Original f"
  546. ["g":protected]=>
  547. string(10) "Original g"
  548. ["e":"E":private]=>
  549. string(12) "Overridden e"
  550. }