PageRenderTime 46ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/hphp/test/slow/lang/cuf.php

https://gitlab.com/Blueprint-Marketing/hhvm
PHP | 689 lines | 566 code | 10 blank | 113 comment | 0 complexity | a006ba668532f44e987492a02acd894e MD5 | raw file
  1. <?php
  2. error_reporting(-1);
  3. class A {
  4. public function meth() {
  5. echo __CLASS__ . ' ' . get_called_class() .
  6. (isset($this) ? ' '.get_class($this) : '') . "\n";
  7. }
  8. public static function staticMeth() {
  9. echo __CLASS__ . ' ' . get_called_class() .
  10. (isset($this) ? ' '.get_class($this) : '') . "\n";
  11. }
  12. }
  13. class B extends A {
  14. public function meth() {
  15. echo __CLASS__ . ' ' . get_called_class() .
  16. (isset($this) ? ' '.get_class($this) : '') . "\n";
  17. }
  18. public static function staticMeth() {
  19. echo __CLASS__ . ' ' . get_called_class() .
  20. (isset($this) ? ' '.get_class($this) : '') . "\n";
  21. }
  22. public function doMeth() {
  23. $this->meth(); // B B B
  24. B::meth(); // B B B
  25. C::meth(); // C C (Zend outputs: C B B) (Rule 1)
  26. D::meth(); // D D (Zend outputs: D B B) (Rule 1)
  27. F::meth(); // F F (Zend outputs: F B B) (Rule 1)
  28. G::meth(); // G G (Zend outputs: G B B) (Rule 1)
  29. H::meth(); // H H (Zend outputs: H B B) (Rule 1)
  30. parent::meth(); // A B B
  31. self::meth(); // B B B
  32. static::meth(); // B B B
  33. echo "****************\n";
  34. }
  35. public function doStaticMeth() {
  36. $this->staticMeth(); // B B
  37. B::staticMeth(); // B B
  38. C::staticMeth(); // C C
  39. D::staticMeth(); // D D
  40. F::staticMeth(); // F F
  41. G::staticMeth(); // G G
  42. H::staticMeth(); // H H
  43. parent::staticMeth(); // A B
  44. self::staticMeth(); // B B
  45. static::staticMeth(); // B B
  46. echo "****************\n";
  47. }
  48. }
  49. class C extends B {
  50. public function meth() {
  51. echo __CLASS__ . ' ' . get_called_class() .
  52. (isset($this) ? ' '.get_class($this) : '') . "\n";
  53. }
  54. public static function staticMeth() {
  55. echo __CLASS__ . ' ' . get_called_class() .
  56. (isset($this) ? ' '.get_class($this) : '') . "\n";
  57. }
  58. /**
  59. * Zend's implementation of call_user_func() and forward_static_call() has
  60. * a few corner cases where its behavior is strictly incorrect. HipHop will
  61. * match Zend's behavior except for cases that violate one of the following
  62. * invariants:
  63. * 1) If the current instance ($this) is non-null, the class of the current
  64. * instance must be the same or a descendent of the class enclosing the
  65. * current method. The PHP group is in the process of depracating this
  66. * behavior. HipHop explicitly lists this in the inconsistencies doc.
  67. * 2) If the current instance ($this) is non-null, the class of the current
  68. * instance must be the same as the current late bound class (aka the
  69. * "called class"). This invariant is stated explicitly in PHP5's
  70. * documentation: "In non-static contexts, the called class will be the
  71. * class of the object instance."
  72. * 3) Normal style calls and call_user_func style calls should produce
  73. * consistent results aside from any exceptions mentioned in PHP5's
  74. * documentation. Therefore, "B::meth()" and "call_user_func('B::meth')"
  75. * and "call_user_func(array('B', 'meth'))" should all produce consistent
  76. * results.
  77. * 4) call_user_func() and forward_static_call() must never forward the
  78. * caller's late bound class to the callee if the late bound class is
  79. * not the same or a descendent of the class enclosing the method.
  80. * Zend's implementation of forward_static_call contains a check for
  81. * this, implying intent to uphold this invariant.
  82. */
  83. public function testMeth1() {
  84. echo "############# testMeth1 ##############\n";
  85. B::meth(); // B D D
  86. C::meth(); // C D D
  87. D::meth(); // D D D
  88. F::meth(); // F F (Zend: F D D) (Rule 1)
  89. G::meth(); // G G (Zend: G D D) (Rule 1)
  90. H::meth(); // H H (Zend: H D D) (Rule 1)
  91. parent::meth(); // B D D
  92. self::meth(); // C D D
  93. static::meth(); // D D D
  94. echo "****************\n";
  95. call_user_func('B::meth'); // B D D
  96. call_user_func('C::meth'); // C D D
  97. call_user_func('D::meth'); // D D D
  98. call_user_func('F::meth'); // F F
  99. call_user_func('G::meth'); // G G
  100. call_user_func('H::meth'); // H H
  101. call_user_func('parent::meth'); // B D D
  102. call_user_func('self::meth'); // C D D
  103. call_user_func('static::meth'); // D D D
  104. echo "****************\n";
  105. call_user_func(array('B','meth')); // B D D
  106. call_user_func(array('C','meth')); // C D D
  107. call_user_func(array('D','meth')); // D D D
  108. call_user_func(array('F','meth')); // F F
  109. call_user_func(array('G','meth')); // G G
  110. call_user_func(array('H','meth')); // H H
  111. call_user_func(array('parent','meth')); // B D D
  112. call_user_func(array('self','meth')); // C D D
  113. call_user_func(array('static','meth')); // D D D
  114. echo "****************\n";
  115. call_user_func(array('B','B::meth')); // B D D
  116. call_user_func(array('B','C::meth')); // warning
  117. call_user_func(array('B','D::meth')); // warning
  118. call_user_func(array('B','F::meth')); // warning
  119. call_user_func(array('B','G::meth')); // warning
  120. call_user_func(array('B','H::meth')); // warning
  121. call_user_func(array('B','parent::meth')); // A D D
  122. call_user_func(array('B','self::meth')); // B D D
  123. call_user_func(array('B','static::meth')); // warning
  124. echo "****************\n";
  125. $call = array('B','B::meth'); $call(); // B D D
  126. // $call = array('B','C::meth'); $call(); // expected fatal
  127. // $call = array('B','D::meth'); $call(); // expected fatal
  128. // $call = array('B','F::meth'); $call(); // expected fatal
  129. // $call = array('B','G::meth'); $call(); // expected fatal
  130. // $call = array('B','H::meth'); $call(); // expected fatal
  131. $call = array('B','parent::meth'); $call(); // A D D
  132. $call = array('B','self::meth'); $call(); // B D D
  133. // $call = array('B','static::meth'); $call(); // expected fatal
  134. echo "****************\n";
  135. call_user_func(array('G','B::meth')); // warning
  136. call_user_func(array('G','C::meth')); // warning
  137. call_user_func(array('G','D::meth')); // warning
  138. call_user_func(array('G','F::meth')); // F F
  139. call_user_func(array('G','G::meth')); // G G
  140. call_user_func(array('G','H::meth')); // warning
  141. call_user_func(array('G','parent::meth')); // F F (Zend: F D D) (Rule 1)
  142. call_user_func(array('G','self::meth')); // G G (Zend: G D D) (Rule 1)
  143. call_user_func(array('G','static::meth')); // warning
  144. echo "****************\n";
  145. // $call = array('G','B::meth'); $call(); // expected fatal
  146. // $call = array('G','C::meth'); $call(); // expected fatal
  147. // $call = array('G','D::meth'); $call(); // expected fatal
  148. $call = array('G','F::meth'); $call(); // F F
  149. $call = array('G','G::meth'); $call(); // G G
  150. // $call = array('G','H::meth'); $call(); // expected fatal
  151. $call = array('G','parent::meth'); $call(); // F F (Zend: F D D) (Rule 1)
  152. $call = array('G','self::meth'); $call(); // G G (Zend: G D D) (Rule 1)
  153. // $call = array('G','static::meth'); $call(); // expected fatal
  154. echo "****************\n";
  155. $b = new B;
  156. call_user_func(array($b,'meth')); // B B B
  157. call_user_func(array($b,'B::meth')); // B B B
  158. call_user_func(array($b,'C::meth')); // warning
  159. call_user_func(array($b,'D::meth')); // warning
  160. call_user_func(array($b,'F::meth')); // warning
  161. call_user_func(array($b,'G::meth')); // warning
  162. call_user_func(array($b,'H::meth')); // warning
  163. call_user_func(array($b,'parent::meth')); // A B B
  164. call_user_func(array($b,'self::meth')); // B B B
  165. call_user_func(array($b,'static::meth')); // warning
  166. echo "****************\n";
  167. $b = new B;
  168. $call = array($b,'meth'); $call(); // B B B
  169. $call = array($b,'B::meth'); $call(); // B B B
  170. // $call = array($b,'C::meth'); $call(); // expected fatal
  171. // $call = array($b,'D::meth'); $call(); // expected fatal
  172. // $call = array($b,'F::meth'); $call(); // expected fatal
  173. // $call = array($b,'G::meth'); $call(); // expected fatal
  174. // $call = array($b,'H::meth'); $call(); // expected fatal
  175. $call = array($b,'parent::meth'); $call(); // A B B
  176. $call = array($b,'self::meth'); $call(); // B B B
  177. // $call = array($b,'static::meth'); $call(); // expected fatal
  178. echo "****************\n";
  179. $g = new G;
  180. call_user_func(array($g,'meth')); // G G G
  181. call_user_func(array($g,'B::meth')); // warning
  182. call_user_func(array($g,'C::meth')); // warning
  183. call_user_func(array($g,'D::meth')); // warning
  184. call_user_func(array($g,'F::meth')); // F G G
  185. call_user_func(array($g,'G::meth')); // G G G
  186. call_user_func(array($g,'H::meth')); // warning
  187. call_user_func(array($g,'parent::meth')); // F G G
  188. call_user_func(array($g,'self::meth')); // G G G
  189. call_user_func(array($g,'static::meth')); // warning
  190. echo "****************\n";
  191. $g = new G;
  192. $call = array($g,'meth'); $call(); // G G G
  193. // $call = array($g,'B::meth'); $call(); // expected fatal
  194. // $call = array($g,'C::meth'); $call(); // expected fatal
  195. // $call = array($g,'D::meth'); $call(); // expected fatal
  196. $call = array($g,'F::meth'); $call(); // F G G
  197. $call = array($g,'G::meth'); $call(); // G G G
  198. // $call = array($g,'H::meth'); $call(); // expected fatal
  199. $call = array($g,'parent::meth'); $call(); // F G G
  200. $call = array($g,'self::meth'); $call(); // G G G
  201. // $call = array($g,'static::meth'); $call(); // expected fatal
  202. echo "****************\n";
  203. }
  204. public static function testMeth2() {
  205. echo "############# testMeth2 ##############\n";
  206. B::meth(); // B B
  207. C::meth(); // C C
  208. D::meth(); // D D
  209. F::meth(); // F F
  210. G::meth(); // G G
  211. H::meth(); // H H
  212. parent::meth(); // B D
  213. self::meth(); // C D
  214. static::meth(); // D D
  215. echo "****************\n";
  216. call_user_func('B::meth'); // B B
  217. call_user_func('C::meth'); // C C
  218. call_user_func('D::meth'); // D D
  219. call_user_func('F::meth'); // F F
  220. call_user_func('G::meth'); // G G
  221. call_user_func('H::meth'); // H H
  222. call_user_func('parent::meth'); // B D
  223. call_user_func('self::meth'); // C D
  224. call_user_func('static::meth'); // D D
  225. echo "****************\n";
  226. call_user_func(array('B','meth')); // B B
  227. call_user_func(array('C','meth')); // C C
  228. call_user_func(array('D','meth')); // D D
  229. call_user_func(array('F','meth')); // F F
  230. call_user_func(array('G','meth')); // G G
  231. call_user_func(array('H','meth')); // H H
  232. call_user_func(array('parent','meth')); // B D
  233. call_user_func(array('self','meth')); // C D
  234. call_user_func(array('static','meth')); // D D
  235. echo "****************\n";
  236. $call = array('B','meth'); $call(); // B B
  237. $call = array('C','meth'); $call(); // C C
  238. $call = array('D','meth'); $call(); // D D
  239. $call = array('F','meth'); $call(); // F F
  240. $call = array('G','meth'); $call(); // G G
  241. $call = array('H','meth'); $call(); // H H
  242. $call = array('parent','meth'); $call(); // B D
  243. $call = array('self','meth'); $call(); // C D
  244. $call = array('static','meth'); $call(); // D D
  245. echo "****************\n";
  246. call_user_func(array('B','B::meth')); // B B
  247. call_user_func(array('B','C::meth')); // warning
  248. call_user_func(array('B','D::meth')); // warning
  249. call_user_func(array('B','F::meth')); // warning
  250. call_user_func(array('B','G::meth')); // warning
  251. call_user_func(array('B','H::meth')); // warning
  252. call_user_func(array('B','parent::meth')); // A D
  253. call_user_func(array('B','self::meth')); // B D
  254. call_user_func(array('B','static::meth')); // warning
  255. echo "****************\n";
  256. $call = array('B','B::meth'); $call(); // B B
  257. // $call = array('B','C::meth'); $call(); // expected fatal
  258. // $call = array('B','D::meth'); $call(); // expected fatal
  259. // $call = array('B','F::meth'); $call(); // expected fatal
  260. // $call = array('B','G::meth'); $call(); // expected fatal
  261. // $call = array('B','H::meth'); $call(); // expected fatal
  262. $call = array('B','parent::meth'); $call(); // A D
  263. $call = array('B','self::meth'); $call(); // B D
  264. // $call = array('B','static::meth'); $call(); // expected fatal
  265. echo "****************\n";
  266. call_user_func(array('G','B::meth')); // warning
  267. call_user_func(array('G','C::meth')); // warning
  268. call_user_func(array('G','D::meth')); // warning
  269. call_user_func(array('G','F::meth')); // F F
  270. call_user_func(array('G','G::meth')); // G G
  271. call_user_func(array('G','H::meth')); // warning
  272. call_user_func(array('G','parent::meth')); // F F (Zend: F D) (Rule 4)
  273. call_user_func(array('G','self::meth')); // G G (Zend: G D) (Rule 4)
  274. call_user_func(array('G','static::meth')); // warning
  275. echo "****************\n";
  276. // $call = array('G','B::meth'); $call(); // warning
  277. // $call = array('G','C::meth'); $call(); // warning
  278. // $call = array('G','D::meth'); $call(); // warning
  279. $call = array('G','F::meth'); $call(); // F F
  280. $call = array('G','G::meth'); $call(); // G G
  281. // $call = array('G','H::meth'); $call(); // warning
  282. $call = array('G','parent::meth'); $call(); // F F (Zend: F D) (Rule 4)
  283. $call = array('G','self::meth'); $call(); // G G (Zend: G D) (Rule 4)
  284. // $call = array('G','static::meth'); $call(); // warning
  285. echo "****************\n";
  286. $b = new B;
  287. call_user_func(array($b,'meth')); // B B B
  288. call_user_func(array($b,'B::meth')); // B B B
  289. call_user_func(array($b,'C::meth')); // warning
  290. call_user_func(array($b,'D::meth')); // warning
  291. call_user_func(array($b,'F::meth')); // warning
  292. call_user_func(array($b,'G::meth')); // warning
  293. call_user_func(array($b,'H::meth')); // warning
  294. call_user_func(array($b,'parent::meth')); // A B B
  295. call_user_func(array($b,'self::meth')); // B B B
  296. call_user_func(array($b,'static::meth')); // warning
  297. echo "****************\n";
  298. $b = new B;
  299. $call = array($b,'meth'); $call(); // B B B
  300. $call = array($b,'B::meth'); $call(); // B B B
  301. // $call = array($b,'C::meth'); $call(); // expected fatal
  302. // $call = array($b,'D::meth'); $call(); // expected fatal
  303. // $call = array($b,'F::meth'); $call(); // expected fatal
  304. // $call = array($b,'G::meth'); $call(); // expected fatal
  305. // $call = array($b,'H::meth'); $call(); // expected fatal
  306. $call = array($b,'parent::meth'); $call(); // A B B
  307. $call = array($b,'self::meth'); $call(); // B B B
  308. // $call = array($b,'static::meth'); $call(); // expected fatal
  309. echo "****************\n";
  310. $g = new G;
  311. call_user_func(array($g,'meth')); // G G G
  312. call_user_func(array($g,'B::meth')); // warning
  313. call_user_func(array($g,'C::meth')); // warning
  314. call_user_func(array($g,'D::meth')); // warning
  315. call_user_func(array($g,'F::meth')); // F G G
  316. call_user_func(array($g,'G::meth')); // G G G
  317. call_user_func(array($g,'H::meth')); // warning
  318. call_user_func(array($g,'parent::meth')); // F G G
  319. call_user_func(array($g,'self::meth')); // G G G
  320. call_user_func(array($g,'static::meth')); // warning
  321. echo "****************\n";
  322. $g = new G;
  323. $call = array($g,'meth'); $call(); // G G G
  324. // $call = array($g,'B::meth'); $call(); // expected fatal
  325. // $call = array($g,'C::meth'); $call(); // expected fatal
  326. // $call = array($g,'D::meth'); $call(); // expected fatal
  327. $call = array($g,'F::meth'); $call(); // F G G
  328. $call = array($g,'G::meth'); $call(); // G G G
  329. // $call = array($g,'H::meth'); $call(); // expected fatal
  330. $call = array($g,'parent::meth'); $call(); // F G G
  331. $call = array($g,'self::meth'); $call(); // G G G
  332. // $call = array($g,'static::meth'); $call(); // expected fatal
  333. echo "****************\n";
  334. }
  335. public function testStaticMeth1() {
  336. echo "############# testStaticMeth1 ##############\n";
  337. B::staticMeth(); // B B
  338. C::staticMeth(); // C C
  339. D::staticMeth(); // D D
  340. F::staticMeth(); // F F
  341. G::staticMeth(); // G G
  342. H::staticMeth(); // H H
  343. parent::staticMeth(); // B D
  344. self::staticMeth(); // C D
  345. static::staticMeth(); // D D
  346. echo "****************\n";
  347. call_user_func('B::staticMeth'); // B B (Zend: B D) (Rule 3)
  348. call_user_func('C::staticMeth'); // C C (Zend: C D) (Rule 3)
  349. call_user_func('D::staticMeth'); // D D
  350. call_user_func('F::staticMeth'); // F F
  351. call_user_func('G::staticMeth'); // G G
  352. call_user_func('H::staticMeth'); // H H
  353. call_user_func('parent::staticMeth'); // B D
  354. call_user_func('self::staticMeth'); // C D
  355. call_user_func('static::staticMeth'); // D D
  356. echo "****************\n";
  357. call_user_func(array('B','staticMeth')); // B B (Zend: B D) (Rule 3)
  358. call_user_func(array('C','staticMeth')); // C C (Zend: C D) (Rule 3)
  359. call_user_func(array('D','staticMeth')); // D D
  360. call_user_func(array('F','staticMeth')); // F F
  361. call_user_func(array('G','staticMeth')); // G G
  362. call_user_func(array('H','staticMeth')); // H H
  363. call_user_func(array('parent','staticMeth')); // B D
  364. call_user_func(array('self','staticMeth')); // C D
  365. call_user_func(array('static','staticMeth')); // D D
  366. echo "****************\n";
  367. $call = array('B','staticMeth'); $call(); // B B (Zend: B D) (Rule 3)
  368. $call = array('C','staticMeth'); $call(); // C C (Zend: C D) (Rule 3)
  369. $call = array('D','staticMeth'); $call(); // D D
  370. $call = array('F','staticMeth'); $call(); // F F
  371. $call = array('G','staticMeth'); $call(); // G G
  372. $call = array('H','staticMeth'); $call(); // H H
  373. $call = array('parent','staticMeth'); $call(); // B D
  374. $call = array('self','staticMeth'); $call(); // C D
  375. $call = array('static','staticMeth'); $call(); // D D
  376. echo "****************\n";
  377. call_user_func(array('B','B::staticMeth')); // B B (Zend: B D) (Rule 3)
  378. call_user_func(array('B','C::staticMeth')); // warning
  379. call_user_func(array('B','D::staticMeth')); // warning
  380. call_user_func(array('B','F::staticMeth')); // warning
  381. call_user_func(array('B','G::staticMeth')); // warning
  382. call_user_func(array('B','H::staticMeth')); // warning
  383. call_user_func(array('B','parent::staticMeth')); // A D
  384. call_user_func(array('B','self::staticMeth')); // B D
  385. call_user_func(array('B','static::staticMeth')); // warning
  386. echo "****************\n";
  387. $call = array('B','B::staticMeth'); $call(); // B B (Zend: B D) (Rule 3)
  388. // $call = array('B','C::staticMeth'); $call(); // expected fatal
  389. // $call = array('B','D::staticMeth'); $call(); // expected fatal
  390. // $call = array('B','F::staticMeth'); $call(); // expected fatal
  391. // $call = array('B','G::staticMeth'); $call(); // expected fatal
  392. // $call = array('B','H::staticMeth'); $call(); // expected fatal
  393. $call = array('B','parent::staticMeth'); $call(); // A D
  394. $call = array('B','self::staticMeth'); $call(); // B D
  395. // $call = array('B','static::staticMeth'); $call(); // expected fatal
  396. echo "****************\n";
  397. call_user_func(array('G','B::staticMeth')); // warning
  398. call_user_func(array('G','C::staticMeth')); // warning
  399. call_user_func(array('G','D::staticMeth')); // warning
  400. call_user_func(array('G','F::staticMeth')); // F F
  401. call_user_func(array('G','G::staticMeth')); // G G
  402. call_user_func(array('G','H::staticMeth')); // warning
  403. call_user_func(array('G','parent::staticMeth')); // F F (Zend: F D) (Rule 4)
  404. call_user_func(array('G','self::staticMeth')); // G G (Zend: G D) (Rule 4)
  405. call_user_func(array('G','static::staticMeth')); // warning
  406. echo "****************\n";
  407. // $call = array('G','B::staticMeth'); $call(); // expected fatal
  408. // $call = array('G','C::staticMeth'); $call(); // expected fatal
  409. // $call = array('G','D::staticMeth'); $call(); // expected fatal
  410. $call = array('G','F::staticMeth'); $call(); // F F
  411. $call = array('G','G::staticMeth'); $call(); // G G
  412. // $call = array('G','H::staticMeth'); $call(); // expected fatal
  413. $call = array('G','parent::staticMeth'); $call(); // F F (Zend: F D) (Rule 4)
  414. $call = array('G','self::staticMeth'); $call(); // G G (Zend: G D) (Rule 4)
  415. // $call = array('G','static::staticMeth'); $call(); // expected fatal
  416. echo "****************\n";
  417. $b = new B;
  418. call_user_func(array($b,'staticMeth')); // B B
  419. call_user_func(array($b,'B::staticMeth')); // B B
  420. call_user_func(array($b,'C::staticMeth')); // warning
  421. call_user_func(array($b,'D::staticMeth')); // warning
  422. call_user_func(array($b,'F::staticMeth')); // warning
  423. call_user_func(array($b,'G::staticMeth')); // warning
  424. call_user_func(array($b,'H::staticMeth')); // warning
  425. call_user_func(array($b,'parent::staticMeth')); // A B
  426. call_user_func(array($b,'self::staticMeth')); // B B
  427. call_user_func(array($b,'static::staticMeth')); // warning
  428. echo "****************\n";
  429. $b = new B;
  430. $call = array($b,'staticMeth'); $call(); // B B
  431. $call = array($b,'B::staticMeth'); $call(); // B B
  432. // $call = array($b,'C::staticMeth'); $call(); // expected fatal
  433. // $call = array($b,'D::staticMeth'); $call(); // expected fatal
  434. // $call = array($b,'F::staticMeth'); $call(); // expected fatal
  435. // $call = array($b,'G::staticMeth'); $call(); // expected fatal
  436. // $call = array($b,'H::staticMeth'); $call(); // expected fatal
  437. $call = array($b,'parent::staticMeth'); $call(); // A B
  438. $call = array($b,'self::staticMeth'); $call(); // B B
  439. // $call = array($b,'static::staticMeth'); $call(); // expected fatal
  440. echo "****************\n";
  441. $g = new G;
  442. call_user_func(array($g,'staticMeth')); // G G
  443. call_user_func(array($g,'B::staticMeth')); // warning
  444. call_user_func(array($g,'C::staticMeth')); // warning
  445. call_user_func(array($g,'D::staticMeth')); // warning
  446. call_user_func(array($g,'F::staticMeth')); // F G
  447. call_user_func(array($g,'G::staticMeth')); // G G
  448. call_user_func(array($g,'H::staticMeth')); // warning
  449. call_user_func(array($g,'parent::staticMeth')); // F G
  450. call_user_func(array($g,'self::staticMeth')); // G G
  451. call_user_func(array($g,'static::staticMeth')); // warning
  452. echo "****************\n";
  453. $g = new G;
  454. $call = array($g,'staticMeth'); $call(); // G G
  455. // $call = array($g,'B::staticMeth'); $call(); // expected fatal
  456. // $call = array($g,'C::staticMeth'); $call(); // expected fatal
  457. // $call = array($g,'D::staticMeth'); $call(); // expected fatal
  458. $call = array($g,'F::staticMeth'); $call(); // F G
  459. $call = array($g,'G::staticMeth'); $call(); // G G
  460. // $call = array($g,'H::staticMeth'); $call(); // expected fatal
  461. $call = array($g,'parent::staticMeth'); $call(); // F G
  462. $call = array($g,'self::staticMeth'); $call(); // G G
  463. // $call = array($g,'static::staticMeth'); $call(); // expected fatal
  464. echo "****************\n";
  465. }
  466. public static function testStaticMeth2() {
  467. echo "############# testStaticMeth2 ##############\n";
  468. B::staticMeth(); // B B
  469. C::staticMeth(); // C C
  470. D::staticMeth(); // D D
  471. F::staticMeth(); // F F
  472. G::staticMeth(); // G G
  473. H::staticMeth(); // H H
  474. parent::staticMeth(); // B D
  475. self::staticMeth(); // C D
  476. static::staticMeth(); // D D
  477. echo "****************\n";
  478. call_user_func('B::staticMeth'); // B B
  479. call_user_func('C::staticMeth'); // C C
  480. call_user_func('D::staticMeth'); // D D
  481. call_user_func('F::staticMeth'); // F F
  482. call_user_func('G::staticMeth'); // G G
  483. call_user_func('H::staticMeth'); // H H
  484. call_user_func('parent::staticMeth'); // B D
  485. call_user_func('self::staticMeth'); // C D
  486. call_user_func('static::staticMeth'); // D D
  487. echo "****************\n";
  488. call_user_func(array('B','staticMeth')); // B B
  489. call_user_func(array('C','staticMeth')); // C C
  490. call_user_func(array('D','staticMeth')); // D D
  491. call_user_func(array('F','staticMeth')); // F F
  492. call_user_func(array('G','staticMeth')); // G G
  493. call_user_func(array('H','staticMeth')); // H H
  494. call_user_func(array('parent','staticMeth')); // B D
  495. call_user_func(array('self','staticMeth')); // C D
  496. call_user_func(array('static','staticMeth')); // D D
  497. echo "****************\n";
  498. $call = array('B','staticMeth'); $call(); // B B
  499. $call = array('C','staticMeth'); $call(); // C C
  500. $call = array('D','staticMeth'); $call(); // D D
  501. $call = array('F','staticMeth'); $call(); // F F
  502. $call = array('G','staticMeth'); $call(); // G G
  503. $call = array('H','staticMeth'); $call(); // H H
  504. $call = array('parent','staticMeth'); $call(); // B D
  505. $call = array('self','staticMeth'); $call(); // C D
  506. $call = array('static','staticMeth'); $call(); // D D
  507. echo "****************\n";
  508. call_user_func(array('B','B::staticMeth')); // B B
  509. call_user_func(array('B','C::staticMeth')); // warning
  510. call_user_func(array('B','D::staticMeth')); // warning
  511. call_user_func(array('B','F::staticMeth')); // warning
  512. call_user_func(array('B','G::staticMeth')); // warning
  513. call_user_func(array('B','H::staticMeth')); // warning
  514. call_user_func(array('B','parent::staticMeth')); // A D
  515. call_user_func(array('B','self::staticMeth')); // B D
  516. call_user_func(array('B','static::staticMeth')); // warning
  517. echo "****************\n";
  518. $call = array('B','B::staticMeth'); $call(); // B B
  519. // $call = array('B','C::staticMeth'); $call(); // expected fatal
  520. // $call = array('B','D::staticMeth'); $call(); // expected fatal
  521. // $call = array('B','F::staticMeth'); $call(); // expected fatal
  522. // $call = array('B','G::staticMeth'); $call(); // expected fatal
  523. // $call = array('B','H::staticMeth'); $call(); // expected fatal
  524. $call = array('B','parent::staticMeth'); $call(); // A D
  525. $call = array('B','self::staticMeth'); $call(); // B D
  526. // $call = array('B','static::staticMeth'); $call(); // expected fatal
  527. echo "****************\n";
  528. call_user_func(array('G','B::staticMeth')); // warning
  529. call_user_func(array('G','C::staticMeth')); // warning
  530. call_user_func(array('G','D::staticMeth')); // warning
  531. call_user_func(array('G','F::staticMeth')); // F F
  532. call_user_func(array('G','G::staticMeth')); // G G
  533. call_user_func(array('G','H::staticMeth')); // warning
  534. call_user_func(array('G','parent::staticMeth')); // F F (Zend: F D) (Rule 4)
  535. call_user_func(array('G','self::staticMeth')); // G G (Zend: G D) (Rule 4)
  536. call_user_func(array('G','static::staticMeth')); // warning
  537. echo "****************\n";
  538. // $call = array('G','B::staticMeth'); $call(); // expected fatal
  539. // $call = array('G','C::staticMeth'); $call(); // expected fatal
  540. // $call = array('G','D::staticMeth'); $call(); // expected fatal
  541. $call = array('G','F::staticMeth'); $call(); // F F
  542. $call = array('G','G::staticMeth'); $call(); // G G
  543. // $call = array('G','H::staticMeth'); $call(); // expected fatal
  544. $call = array('G','parent::staticMeth'); $call(); // F F (Zend: F D) (Rule 4)
  545. $call = array('G','self::staticMeth'); $call(); // G G (Zend: G D) (Rule 4)
  546. // $call = array('G','static::staticMeth'); $call(); // expected fatal
  547. echo "****************\n";
  548. $b = new B;
  549. call_user_func(array($b,'staticMeth')); // B B
  550. call_user_func(array($b,'B::staticMeth')); // B B
  551. call_user_func(array($b,'C::staticMeth')); // warning
  552. call_user_func(array($b,'D::staticMeth')); // warning
  553. call_user_func(array($b,'F::staticMeth')); // warning
  554. call_user_func(array($b,'G::staticMeth')); // warning
  555. call_user_func(array($b,'H::staticMeth')); // warning
  556. call_user_func(array($b,'parent::staticMeth')); // A B
  557. call_user_func(array($b,'self::staticMeth')); // B B
  558. call_user_func(array($b,'static::staticMeth')); // warning
  559. echo "****************\n";
  560. $b = new B;
  561. $call = array($b,'staticMeth'); $call(); // B B
  562. $call = array($b,'B::staticMeth'); $call(); // B B
  563. // $call = array($b,'C::staticMeth'); $call(); // expected fatal
  564. // $call = array($b,'D::staticMeth'); $call(); // expected fatal
  565. // $call = array($b,'F::staticMeth'); $call(); // expected fatal
  566. // $call = array($b,'G::staticMeth'); $call(); // expected fatal
  567. // $call = array($b,'H::staticMeth'); $call(); // expected fatal
  568. $call = array($b,'parent::staticMeth'); $call(); // A B
  569. $call = array($b,'self::staticMeth'); $call(); // B B
  570. // $call = array($b,'static::staticMeth'); $call(); // expected fatal
  571. echo "****************\n";
  572. $g = new G;
  573. call_user_func(array($g,'staticMeth')); // G G
  574. call_user_func(array($g,'B::staticMeth')); // warning
  575. call_user_func(array($g,'C::staticMeth')); // warning
  576. call_user_func(array($g,'D::staticMeth')); // warning
  577. call_user_func(array($g,'F::staticMeth')); // F G
  578. call_user_func(array($g,'G::staticMeth')); // G G
  579. call_user_func(array($g,'H::staticMeth')); // warning
  580. call_user_func(array($g,'parent::staticMeth')); // F G
  581. call_user_func(array($g,'self::staticMeth')); // G G
  582. call_user_func(array($g,'static::staticMeth')); // warning
  583. echo "****************\n";
  584. $g = new G;
  585. $call = array($g,'staticMeth'); $call(); // G G
  586. // $call = array($g,'B::staticMeth'); $call(); // warning
  587. // $call = array($g,'C::staticMeth'); $call(); // warning
  588. // $call = array($g,'D::staticMeth'); $call(); // warning
  589. $call = array($g,'F::staticMeth'); $call(); // F G
  590. $call = array($g,'G::staticMeth'); $call(); // G G
  591. // $call = array($g,'H::staticMeth'); $call(); // warning
  592. $call = array($g,'parent::staticMeth'); $call(); // F G
  593. $call = array($g,'self::staticMeth'); $call(); // G G
  594. // $call = array($g,'static::staticMeth'); $call(); // warning
  595. echo "****************\n";
  596. }
  597. }
  598. class D extends C {
  599. public function meth() {
  600. echo __CLASS__ . ' ' . get_called_class() .
  601. (isset($this) ? ' '.get_class($this) : '') . "\n";
  602. }
  603. public static function staticMeth() {
  604. echo __CLASS__ . ' ' . get_called_class() .
  605. (isset($this) ? ' '.get_class($this) : '') . "\n";
  606. }
  607. }
  608. class F {
  609. public function meth() {
  610. echo __CLASS__ . ' ' . get_called_class() .
  611. (isset($this) ? ' '.get_class($this) : '') . "\n";
  612. }
  613. public static function staticMeth() {
  614. echo __CLASS__ . ' ' . get_called_class() .
  615. (isset($this) ? ' '.get_class($this) : '') . "\n";
  616. }
  617. }
  618. class G extends F {
  619. public function meth() {
  620. echo __CLASS__ . ' ' . get_called_class() .
  621. (isset($this) ? ' '.get_class($this) : '') . "\n";
  622. }
  623. public static function staticMeth() {
  624. echo __CLASS__ . ' ' . get_called_class() .
  625. (isset($this) ? ' '.get_class($this) : '') . "\n";
  626. }
  627. public function doMeth() {
  628. $this->meth(); // G G G
  629. B::meth(); // B B (Zend: B G G) (Rule 1)
  630. C::meth(); // C C (Zend: C G G) (Rule 1)
  631. D::meth(); // D D (Zend: D G G) (Rule 1)
  632. F::meth(); // F G G
  633. G::meth(); // G G G
  634. H::meth(); // H H (Zend: H G G) (Rule 1)
  635. parent::meth(); // F G G
  636. self::meth(); // G G G
  637. static::meth(); // G G G
  638. echo "****************\n";
  639. }
  640. public function doStaticMeth() {
  641. $this->staticMeth(); // G G
  642. B::staticMeth(); // B B
  643. C::staticMeth(); // C C
  644. D::staticMeth(); // D D
  645. F::staticMeth(); // F F
  646. G::staticMeth(); // G G
  647. H::staticMeth(); // H H
  648. parent::staticMeth(); // F G
  649. self::staticMeth(); // G G
  650. static::staticMeth(); // G G
  651. echo "****************\n";
  652. }
  653. }
  654. class H extends G {
  655. public function meth() {
  656. echo __CLASS__ . ' ' . get_called_class() .
  657. (isset($this) ? ' '.get_class($this) : '') . "\n";
  658. }
  659. public static function staticMeth() {
  660. echo __CLASS__ . ' ' . get_called_class() .
  661. (isset($this) ? ' '.get_class($this) : '') . "\n";
  662. }
  663. }
  664. function main() {
  665. $d = new D;
  666. $d->testMeth1();
  667. D::testMeth2();
  668. $d->testStaticMeth1();
  669. D::testStaticMeth2();
  670. $b = new B;
  671. $g = new G;
  672. echo "############# doMeth ##############\n";
  673. $b->doMeth();
  674. $g->doMeth();
  675. echo "############# doStaticMeth ##############\n";
  676. $b->doStaticMeth();
  677. $g->doStaticMeth();
  678. }
  679. main();