closure_from_callable.inc 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. <?php
  2. function bar($param1)
  3. {
  4. return $param1;
  5. }
  6. $closure = function($param1) {
  7. return $param1;
  8. };
  9. function test($fn)
  10. {
  11. static $count = 0;
  12. $input = "foo".$count;
  13. $count++;
  14. $output = $fn($input);
  15. return $input === $output;
  16. }
  17. class Foo
  18. {
  19. public static function publicStaticFunction($param1)
  20. {
  21. return $param1;
  22. }
  23. private static function privateStaticFunction($param1)
  24. {
  25. return $param1;
  26. }
  27. protected static function protectedStaticFunction($param1)
  28. {
  29. return $param1;
  30. }
  31. private function privateInstanceFunc($param1)
  32. {
  33. return $param1;
  34. }
  35. protected function protectedInstanceFunc($param1)
  36. {
  37. return $param1;
  38. }
  39. public function publicInstanceFunc($param1)
  40. {
  41. return $param1;
  42. }
  43. public function closePrivateValid()
  44. {
  45. return Closure::fromCallable([$this, 'privateInstanceFunc']);
  46. }
  47. public function closePrivateStatic()
  48. {
  49. return Closure::fromCallable([__CLASS__, 'privateStaticFunction']);
  50. }
  51. public function bar($param1)
  52. {
  53. echo "this is bar\n";
  54. }
  55. public function getCallable()
  56. {
  57. return Closure::fromCallable([$this, 'publicInstanceFunc']);
  58. }
  59. public function getSelfPublicInstance()
  60. {
  61. return Closure::fromCallable([$this, 'publicInstanceFunc']);
  62. }
  63. public function getSelfColonPublicInstanceMethod()
  64. {
  65. return Closure::fromCallable('self::publicInstanceFunc');
  66. }
  67. }
  68. class SubFoo extends Foo {
  69. public function closePrivateStaticInvalid()
  70. {
  71. return Closure::fromCallable([__CLASS__, 'privateStaticFunction']);
  72. }
  73. public function closePrivateInvalid()
  74. {
  75. return Closure::fromCallable([$this, 'privateInstanceFunc']);
  76. }
  77. public function closeProtectedStaticMethod()
  78. {
  79. return Closure::fromCallable([__CLASS__, 'protectedStaticFunction']);
  80. }
  81. public function closeProtectedValid()
  82. {
  83. return Closure::fromCallable([$this, 'protectedInstanceFunc']);
  84. }
  85. public function getParentPublicInstanceMethod()
  86. {
  87. return Closure::fromCallable('parent::publicInstanceFunc');
  88. }
  89. public function getSelfColonParentPublicInstanceMethod()
  90. {
  91. return Closure::fromCallable('self::publicInstanceFunc');
  92. }
  93. public function getSelfColonParentProtectedInstanceMethod()
  94. {
  95. return Closure::fromCallable('self::protectedInstanceFunc');
  96. }
  97. public function getSelfColonParentPrivateInstanceMethod()
  98. {
  99. return Closure::fromCallable('self::privateInstanceFunc');
  100. }
  101. }
  102. class MagicCall
  103. {
  104. public function __call($name, $arguments)
  105. {
  106. $info = ['__call'];
  107. $info[] = $name;
  108. $info = array_merge($info, $arguments);
  109. return implode(',', $info);
  110. }
  111. public static function __callStatic($name, $arguments)
  112. {
  113. $info = ['__callStatic'];
  114. $info[] = $name;
  115. $info = array_merge($info, $arguments);
  116. return implode(',', $info);
  117. }
  118. }
  119. class PublicInvocable
  120. {
  121. public function __invoke($param1)
  122. {
  123. return $param1;
  124. }
  125. }
  126. function functionAccessProtected()
  127. {
  128. $foo = new Foo;
  129. return Closure::fromCallable([$foo, 'protectedStaticFunction']);
  130. }
  131. function functionAccessPrivate()
  132. {
  133. $foo = new Foo;
  134. return Closure::fromCallable([$foo, 'privateStaticFunction']);
  135. }
  136. function functionAccessMethodDoesntExist()
  137. {
  138. $foo = new Foo;
  139. return Closure::fromCallable([$foo, 'thisDoesNotExist']);
  140. }
  141. ?>