foreachLoopObjects.002.phpt 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587
  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. ===DONE===
  153. --EXPECTF--
  154. Iterate over various generations from within overridden methods:
  155. --> Using instance of C:
  156. in C::doForEachOnThis
  157. string(10) "Original a"
  158. string(10) "Original b"
  159. string(10) "Original c"
  160. string(10) "Original d"
  161. string(10) "Original e"
  162. object(C)#%d (5) {
  163. ["a"]=>
  164. string(9) "changed.a"
  165. ["b"]=>
  166. string(9) "changed.b"
  167. ["c"]=>
  168. string(9) "changed.c"
  169. ["d":protected]=>
  170. string(9) "changed.d"
  171. ["e":"C":private]=>
  172. string(9) "changed.e"
  173. }
  174. --> Using instance of D:
  175. in D::doForEachOnThis
  176. string(10) "Original f"
  177. string(10) "Original g"
  178. string(10) "Original a"
  179. string(10) "Original b"
  180. string(10) "Original c"
  181. string(10) "Original d"
  182. object(D)#%d (7) {
  183. ["f":"D":private]=>
  184. string(9) "changed.f"
  185. ["g":protected]=>
  186. string(9) "changed.g"
  187. ["a"]=>
  188. string(9) "changed.a"
  189. ["b"]=>
  190. string(9) "changed.b"
  191. ["c"]=>
  192. string(9) "changed.c"
  193. ["d":protected]=>
  194. string(9) "changed.d"
  195. ["e":"C":private]=>
  196. string(10) "Original e"
  197. }
  198. --> Using instance of E:
  199. in E::doForEachOnThis
  200. string(12) "Overridden a"
  201. string(12) "Overridden b"
  202. string(12) "Overridden c"
  203. string(12) "Overridden d"
  204. string(12) "Overridden e"
  205. string(10) "Original g"
  206. object(E)#%d (8) {
  207. ["a"]=>
  208. string(9) "changed.a"
  209. ["b"]=>
  210. string(9) "changed.b"
  211. ["c"]=>
  212. string(9) "changed.c"
  213. ["d":protected]=>
  214. string(9) "changed.d"
  215. ["e":"E":private]=>
  216. string(9) "changed.e"
  217. ["f":"D":private]=>
  218. string(10) "Original f"
  219. ["g":protected]=>
  220. string(9) "changed.g"
  221. ["e":"C":private]=>
  222. string(10) "Original e"
  223. }
  224. Iterate over various generations from within an inherited method:
  225. --> Using instance of C:
  226. in C::doForEachC
  227. string(10) "Original a"
  228. string(10) "Original b"
  229. string(10) "Original c"
  230. string(10) "Original d"
  231. string(10) "Original e"
  232. object(C)#%d (5) {
  233. ["a"]=>
  234. string(9) "changed.a"
  235. ["b"]=>
  236. string(9) "changed.b"
  237. ["c"]=>
  238. string(9) "changed.c"
  239. ["d":protected]=>
  240. string(9) "changed.d"
  241. ["e":"C":private]=>
  242. string(9) "changed.e"
  243. }
  244. --> Using instance of D:
  245. in C::doForEachC
  246. string(10) "Original g"
  247. string(10) "Original a"
  248. string(10) "Original b"
  249. string(10) "Original c"
  250. string(10) "Original d"
  251. string(10) "Original e"
  252. object(D)#%d (7) {
  253. ["f":"D":private]=>
  254. string(10) "Original f"
  255. ["g":protected]=>
  256. string(9) "changed.g"
  257. ["a"]=>
  258. string(9) "changed.a"
  259. ["b"]=>
  260. string(9) "changed.b"
  261. ["c"]=>
  262. string(9) "changed.c"
  263. ["d":protected]=>
  264. string(9) "changed.d"
  265. ["e":"C":private]=>
  266. string(9) "changed.e"
  267. }
  268. --> Using instance of E:
  269. in C::doForEachC
  270. string(12) "Overridden a"
  271. string(12) "Overridden b"
  272. string(12) "Overridden c"
  273. string(12) "Overridden d"
  274. string(10) "Original g"
  275. string(10) "Original e"
  276. object(E)#%d (8) {
  277. ["a"]=>
  278. string(9) "changed.a"
  279. ["b"]=>
  280. string(9) "changed.b"
  281. ["c"]=>
  282. string(9) "changed.c"
  283. ["d":protected]=>
  284. string(9) "changed.d"
  285. ["e":"E":private]=>
  286. string(12) "Overridden e"
  287. ["f":"D":private]=>
  288. string(10) "Original f"
  289. ["g":protected]=>
  290. string(9) "changed.g"
  291. ["e":"C":private]=>
  292. string(9) "changed.e"
  293. }
  294. Iterate over various generations from within an overridden static method:
  295. --> Using instance of C:
  296. in C::doForEach
  297. string(10) "Original a"
  298. string(10) "Original b"
  299. string(10) "Original c"
  300. string(10) "Original d"
  301. string(10) "Original e"
  302. object(C)#%d (5) {
  303. ["a"]=>
  304. string(9) "changed.a"
  305. ["b"]=>
  306. string(9) "changed.b"
  307. ["c"]=>
  308. string(9) "changed.c"
  309. ["d":protected]=>
  310. string(9) "changed.d"
  311. ["e":"C":private]=>
  312. string(9) "changed.e"
  313. }
  314. in D::doForEach
  315. string(10) "Original a"
  316. string(10) "Original b"
  317. string(10) "Original c"
  318. string(10) "Original d"
  319. object(C)#%d (5) {
  320. ["a"]=>
  321. string(9) "changed.a"
  322. ["b"]=>
  323. string(9) "changed.b"
  324. ["c"]=>
  325. string(9) "changed.c"
  326. ["d":protected]=>
  327. string(9) "changed.d"
  328. ["e":"C":private]=>
  329. string(10) "Original e"
  330. }
  331. in E::doForEach
  332. string(10) "Original a"
  333. string(10) "Original b"
  334. string(10) "Original c"
  335. string(10) "Original d"
  336. object(C)#%d (5) {
  337. ["a"]=>
  338. string(9) "changed.a"
  339. ["b"]=>
  340. string(9) "changed.b"
  341. ["c"]=>
  342. string(9) "changed.c"
  343. ["d":protected]=>
  344. string(9) "changed.d"
  345. ["e":"C":private]=>
  346. string(10) "Original e"
  347. }
  348. --> Using instance of D:
  349. in C::doForEach
  350. string(10) "Original g"
  351. string(10) "Original a"
  352. string(10) "Original b"
  353. string(10) "Original c"
  354. string(10) "Original d"
  355. string(10) "Original e"
  356. object(D)#%d (7) {
  357. ["f":"D":private]=>
  358. string(10) "Original f"
  359. ["g":protected]=>
  360. string(9) "changed.g"
  361. ["a"]=>
  362. string(9) "changed.a"
  363. ["b"]=>
  364. string(9) "changed.b"
  365. ["c"]=>
  366. string(9) "changed.c"
  367. ["d":protected]=>
  368. string(9) "changed.d"
  369. ["e":"C":private]=>
  370. string(9) "changed.e"
  371. }
  372. in D::doForEach
  373. string(10) "Original f"
  374. string(10) "Original g"
  375. string(10) "Original a"
  376. string(10) "Original b"
  377. string(10) "Original c"
  378. string(10) "Original d"
  379. object(D)#%d (7) {
  380. ["f":"D":private]=>
  381. string(9) "changed.f"
  382. ["g":protected]=>
  383. string(9) "changed.g"
  384. ["a"]=>
  385. string(9) "changed.a"
  386. ["b"]=>
  387. string(9) "changed.b"
  388. ["c"]=>
  389. string(9) "changed.c"
  390. ["d":protected]=>
  391. string(9) "changed.d"
  392. ["e":"C":private]=>
  393. string(10) "Original e"
  394. }
  395. in E::doForEach
  396. string(10) "Original g"
  397. string(10) "Original a"
  398. string(10) "Original b"
  399. string(10) "Original c"
  400. string(10) "Original d"
  401. object(D)#%d (7) {
  402. ["f":"D":private]=>
  403. string(10) "Original f"
  404. ["g":protected]=>
  405. string(9) "changed.g"
  406. ["a"]=>
  407. string(9) "changed.a"
  408. ["b"]=>
  409. string(9) "changed.b"
  410. ["c"]=>
  411. string(9) "changed.c"
  412. ["d":protected]=>
  413. string(9) "changed.d"
  414. ["e":"C":private]=>
  415. string(10) "Original e"
  416. }
  417. --> Using instance of E:
  418. in C::doForEach
  419. string(12) "Overridden a"
  420. string(12) "Overridden b"
  421. string(12) "Overridden c"
  422. string(12) "Overridden d"
  423. string(10) "Original g"
  424. string(10) "Original e"
  425. object(E)#%d (8) {
  426. ["a"]=>
  427. string(9) "changed.a"
  428. ["b"]=>
  429. string(9) "changed.b"
  430. ["c"]=>
  431. string(9) "changed.c"
  432. ["d":protected]=>
  433. string(9) "changed.d"
  434. ["e":"E":private]=>
  435. string(12) "Overridden e"
  436. ["f":"D":private]=>
  437. string(10) "Original f"
  438. ["g":protected]=>
  439. string(9) "changed.g"
  440. ["e":"C":private]=>
  441. string(9) "changed.e"
  442. }
  443. in D::doForEach
  444. string(12) "Overridden a"
  445. string(12) "Overridden b"
  446. string(12) "Overridden c"
  447. string(12) "Overridden d"
  448. string(10) "Original f"
  449. string(10) "Original g"
  450. object(E)#%d (8) {
  451. ["a"]=>
  452. string(9) "changed.a"
  453. ["b"]=>
  454. string(9) "changed.b"
  455. ["c"]=>
  456. string(9) "changed.c"
  457. ["d":protected]=>
  458. string(9) "changed.d"
  459. ["e":"E":private]=>
  460. string(12) "Overridden e"
  461. ["f":"D":private]=>
  462. string(9) "changed.f"
  463. ["g":protected]=>
  464. string(9) "changed.g"
  465. ["e":"C":private]=>
  466. string(10) "Original e"
  467. }
  468. in E::doForEach
  469. string(12) "Overridden a"
  470. string(12) "Overridden b"
  471. string(12) "Overridden c"
  472. string(12) "Overridden d"
  473. string(12) "Overridden e"
  474. string(10) "Original g"
  475. object(E)#%d (8) {
  476. ["a"]=>
  477. string(9) "changed.a"
  478. ["b"]=>
  479. string(9) "changed.b"
  480. ["c"]=>
  481. string(9) "changed.c"
  482. ["d":protected]=>
  483. string(9) "changed.d"
  484. ["e":"E":private]=>
  485. string(9) "changed.e"
  486. ["f":"D":private]=>
  487. string(10) "Original f"
  488. ["g":protected]=>
  489. string(9) "changed.g"
  490. ["e":"C":private]=>
  491. string(10) "Original e"
  492. }
  493. Iterate over various generations from outside the object:
  494. --> Using instance of C:
  495. string(10) "Original a"
  496. string(10) "Original b"
  497. string(10) "Original c"
  498. object(C)#%d (5) {
  499. ["a"]=>
  500. string(9) "changed.a"
  501. ["b"]=>
  502. string(9) "changed.b"
  503. ["c"]=>
  504. &string(9) "changed.c"
  505. ["d":protected]=>
  506. string(10) "Original d"
  507. ["e":"C":private]=>
  508. string(10) "Original e"
  509. }
  510. --> Using instance of D:
  511. string(10) "Original a"
  512. string(10) "Original b"
  513. string(10) "Original c"
  514. object(D)#%d (7) {
  515. ["f":"D":private]=>
  516. string(10) "Original f"
  517. ["g":protected]=>
  518. string(10) "Original g"
  519. ["a"]=>
  520. string(9) "changed.a"
  521. ["b"]=>
  522. string(9) "changed.b"
  523. ["c"]=>
  524. &string(9) "changed.c"
  525. ["d":protected]=>
  526. string(10) "Original d"
  527. ["e":"C":private]=>
  528. string(10) "Original e"
  529. }
  530. --> Using instance of E:
  531. string(12) "Overridden a"
  532. string(12) "Overridden b"
  533. string(12) "Overridden c"
  534. object(E)#%d (8) {
  535. ["a"]=>
  536. string(9) "changed.a"
  537. ["b"]=>
  538. string(9) "changed.b"
  539. ["c"]=>
  540. &string(9) "changed.c"
  541. ["d":protected]=>
  542. string(12) "Overridden d"
  543. ["e":"E":private]=>
  544. string(12) "Overridden e"
  545. ["f":"D":private]=>
  546. string(10) "Original f"
  547. ["g":protected]=>
  548. string(10) "Original g"
  549. ["e":"C":private]=>
  550. string(10) "Original e"
  551. }
  552. ===DONE===