fork download
  1. <?php
  2.  
  3. namespace Potherca\Example\TypeHints;
  4.  
  5. class Example
  6. {
  7. public static function typeHintMissing($subject)
  8. {
  9. return $subject;
  10. }
  11.  
  12. public static function typeHintCallable(callable $subject)
  13. {
  14. return $subject;
  15. }
  16.  
  17. public static function typeHintClosure(\Closure $subject)
  18. {
  19. return $subject;
  20. }
  21.  
  22. public function __invoke($subject)
  23. {
  24. return $subject;
  25. }
  26. }
  27.  
  28. $output = <<<'TXT'
  29.  
  30. ================================================================================
  31. (%d) %s : %s
  32.  
  33.   callable : %s
  34.   __invoke : %s
  35.   closure : %s
  36.  
  37. TXT;
  38.  
  39. $example = new Example();
  40.  
  41. $callables = array(
  42. 1 => 'foo',
  43. 2 => 'trim',
  44. 3 => '\Potherca\Example\TypeHints\Example::typeHintMissing',
  45. 4 => array('\Potherca\Example\TypeHints\Example', 'typeHintMissing'),
  46. 5 => array($example, 'typeHintMissing'),
  47. 6 => $example,
  48. 7 => function ($subject) {return $subject;},
  49. );
  50.  
  51. array_walk($callables, function ($callable, $key) use ($output) {
  52.  
  53. $is_callable = is_callable($callable);
  54. $is_invoke = method_exists($callable, '__invoke');
  55. $is_closure = $callable instanceof \Closure;
  56.  
  57. if ($is_callable === true) {
  58. /** @noinspection VariableFunctionsUsageInspection */
  59. call_user_func($callable, 'foo');
  60. Example::typeHintCallable($callable);
  61. }
  62.  
  63. if ($is_closure === true) {
  64. Example::typeHintClosure($callable);
  65. }
  66.  
  67. if ($is_invoke === true) {
  68. $callable('foo');
  69. }
  70.  
  71. vprintf($output, array(
  72. 'key' => $key,
  73. 'type' => gettype($callable),
  74. 'value' => str_replace(array("\n", ' '), '', var_export($callable, true)),
  75. 'is_callable' => var_export($is_callable, true),
  76. 'is_invoke' => var_export($is_invoke, true),
  77. 'is_closure' => var_export($is_closure, true),
  78. ));
  79. });
  80.  
Success #stdin #stdout 0s 82880KB
stdin
Standard input is empty
stdout
================================================================================
(1) string :  'foo'

    callable : false
    __invoke : false
    closure  : false 

================================================================================
(2) string :  'trim'

    callable : true
    __invoke : false
    closure  : false 

================================================================================
(3) string :  '\\Potherca\\Example\\TypeHints\\Example::typeHintMissing'

    callable : true
    __invoke : false
    closure  : false 

================================================================================
(4) array :  array (0 => '\\Potherca\\Example\\TypeHints\\Example',1 => 'typeHintMissing',)

    callable : true
    __invoke : false
    closure  : false 

================================================================================
(5) array :  array (0 => Potherca\Example\TypeHints\Example::__set_state(array()),1 => 'typeHintMissing',)

    callable : true
    __invoke : false
    closure  : false 

================================================================================
(6) object :  Potherca\Example\TypeHints\Example::__set_state(array())

    callable : true
    __invoke : true
    closure  : false 

================================================================================
(7) object :  Closure::__set_state(array())

    callable : true
    __invoke : true
    closure  : true