property_exists.phpt 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. --TEST--
  2. Reflection and property_exists()
  3. --FILE--
  4. <?php
  5. class A
  6. {
  7. public $a = 1;
  8. protected $b = 2;
  9. private $c = 3;
  10. public $empty;
  11. public $init = 1;
  12. function __toString()
  13. {
  14. return 'obj(' . get_class($this) . ')';
  15. }
  16. static function test($oc, $props)
  17. {
  18. echo '===' . __CLASS__ . "===\n";
  19. foreach($props as $p2) {
  20. echo $oc, '::$' , $p2, "\n";
  21. var_dump(property_exists($oc, $p2));
  22. }
  23. }
  24. }
  25. class B extends A
  26. {
  27. private $c = 4;
  28. static function test($oc, $props)
  29. {
  30. echo '===' . __CLASS__ . "===\n";
  31. foreach($props as $p2) {
  32. echo $oc, '::$' , $p2, "\n";
  33. var_dump(property_exists($oc, $p2));
  34. }
  35. }
  36. }
  37. class C extends B
  38. {
  39. private $d = 5;
  40. static function test($oc, $props)
  41. {
  42. echo '===' . __CLASS__ . "===\n";
  43. foreach($props as $p2) {
  44. echo $oc, '::$' , $p2, "\n";
  45. var_dump(property_exists($oc, $p2));
  46. }
  47. }
  48. }
  49. $oA = new A;
  50. $oA->e = 6;
  51. $oC = new C;
  52. $pc = array($oA, 'A', 'B', 'C', $oC);
  53. $pr = array('a', 'b', 'c', 'd', 'e');
  54. foreach($pc as $p1) {
  55. if (is_object($p1)) {
  56. $p1->test($p1, $pr);
  57. } else {
  58. $r = new ReflectionMethod($p1, 'test');
  59. $r->invoke(NULL, $p1, $pr);
  60. }
  61. echo "===GLOBAL===\n";
  62. foreach($pr as $p2) {
  63. echo $p1, '::$' , $p2, "\n";
  64. var_dump(property_exists($p1, $p2));
  65. }
  66. }
  67. echo "===PROBLEMS===\n";
  68. try {
  69. var_dump(property_exists(NULL, 'empty'));
  70. } catch (\TypeError $e) {
  71. echo $e->getMessage() . \PHP_EOL;
  72. }
  73. try {
  74. var_dump(property_exists(25,'empty'));
  75. } catch (\TypeError $e) {
  76. echo $e->getMessage() . \PHP_EOL;
  77. }
  78. var_dump(property_exists('',''));
  79. var_dump(property_exists('A',''));
  80. var_dump(property_exists('A','123'));
  81. var_dump(property_exists('A','init'));
  82. var_dump(property_exists('A','empty'));
  83. var_dump(property_exists(new A, ''));
  84. var_dump(property_exists(new A, '123'));
  85. var_dump(property_exists(new A, 'init'));
  86. var_dump(property_exists(new A, 'empty'));
  87. ?>
  88. --EXPECT--
  89. ===A===
  90. obj(A)::$a
  91. bool(true)
  92. obj(A)::$b
  93. bool(true)
  94. obj(A)::$c
  95. bool(true)
  96. obj(A)::$d
  97. bool(false)
  98. obj(A)::$e
  99. bool(true)
  100. ===GLOBAL===
  101. obj(A)::$a
  102. bool(true)
  103. obj(A)::$b
  104. bool(true)
  105. obj(A)::$c
  106. bool(true)
  107. obj(A)::$d
  108. bool(false)
  109. obj(A)::$e
  110. bool(true)
  111. ===A===
  112. A::$a
  113. bool(true)
  114. A::$b
  115. bool(true)
  116. A::$c
  117. bool(true)
  118. A::$d
  119. bool(false)
  120. A::$e
  121. bool(false)
  122. ===GLOBAL===
  123. A::$a
  124. bool(true)
  125. A::$b
  126. bool(true)
  127. A::$c
  128. bool(true)
  129. A::$d
  130. bool(false)
  131. A::$e
  132. bool(false)
  133. ===B===
  134. B::$a
  135. bool(true)
  136. B::$b
  137. bool(true)
  138. B::$c
  139. bool(true)
  140. B::$d
  141. bool(false)
  142. B::$e
  143. bool(false)
  144. ===GLOBAL===
  145. B::$a
  146. bool(true)
  147. B::$b
  148. bool(true)
  149. B::$c
  150. bool(true)
  151. B::$d
  152. bool(false)
  153. B::$e
  154. bool(false)
  155. ===C===
  156. C::$a
  157. bool(true)
  158. C::$b
  159. bool(true)
  160. C::$c
  161. bool(false)
  162. C::$d
  163. bool(true)
  164. C::$e
  165. bool(false)
  166. ===GLOBAL===
  167. C::$a
  168. bool(true)
  169. C::$b
  170. bool(true)
  171. C::$c
  172. bool(false)
  173. C::$d
  174. bool(true)
  175. C::$e
  176. bool(false)
  177. ===C===
  178. obj(C)::$a
  179. bool(true)
  180. obj(C)::$b
  181. bool(true)
  182. obj(C)::$c
  183. bool(false)
  184. obj(C)::$d
  185. bool(true)
  186. obj(C)::$e
  187. bool(false)
  188. ===GLOBAL===
  189. obj(C)::$a
  190. bool(true)
  191. obj(C)::$b
  192. bool(true)
  193. obj(C)::$c
  194. bool(false)
  195. obj(C)::$d
  196. bool(true)
  197. obj(C)::$e
  198. bool(false)
  199. ===PROBLEMS===
  200. property_exists(): Argument #1 ($object_or_class) must be of type object|string, null given
  201. property_exists(): Argument #1 ($object_or_class) must be of type object|string, int given
  202. bool(false)
  203. bool(false)
  204. bool(false)
  205. bool(true)
  206. bool(true)
  207. bool(false)
  208. bool(false)
  209. bool(true)
  210. bool(true)