1--TEST--
2Test array_map() function : usage variations - object functionality
3--FILE--
4<?php
5/*
6 * Testing array_map() for object functionalities:
7 *   1) simple class with variable and method
8 *   2) class without members
9 *   3) class with only one method and no variable
10 *   4) abstract and child class
11 *   5) class with static and final members
12 *   6) interface and implemented class
13 */
14echo "*** Testing array_map() : object functionality ***\n";
15
16echo "-- simple class with public variable and method --\n";
17class SimpleClass
18{
19  public $var1 = 1;
20  public static function square($n) {
21    return $n * $n;
22  }
23}
24function test($cb, $args) {
25  echo join('::', $cb) . "\n";
26  try {
27    var_dump(array_map($cb, $args));
28  } catch (TypeError $e) {
29    echo $e->getMessage(), "\n";
30  }
31}
32test(array('SimpleClass', 'square'), array(1, 2));
33
34echo "\n-- simple class with private variable and method --\n";
35class SimpleClassPri
36{
37  private $var1 = 10;
38  private static function add($n) {
39    return $var + $n;
40  }
41}
42test(array('SimpleClassPri', 'add'), array(1));
43
44echo "\n-- simple class with protected variable and method --\n";
45class SimpleClassPro
46{
47  protected $var1 = 5;
48  protected static function mul($n) {
49    return $var1 * $n;
50  }
51}
52test(array('SimpleClassPro', 'mul'), array(2));
53
54echo "\n-- class without members --\n";
55class EmptyClass
56{
57}
58test(array('EmptyClass'), array(1, 2));
59
60echo "\n-- abstract class --\n";
61abstract class AbstractClass
62{
63  protected $var2 = 5;
64  abstract static function emptyFunction();
65}
66
67// class deriving the above abstract class
68class ChildClass extends AbstractClass
69{
70  private $var3;
71  public static function emptyFunction() {
72    echo "defined in child\n";
73  }
74}
75test(array('ChildClass', 'emptyFunction'), array(1, 2));
76
77echo "\n-- class with final method --\n";
78class FinalClass
79{
80  private $var4;
81  final static function finalMethod() {
82    echo "This function can't be overloaded\n";
83  }
84}
85test(array('FinalClass', 'finalMethod'), array(1, 2));
86
87echo "\n-- class with static members --\n";
88class StaticClass
89{
90  static $var5 = 2;
91  public static function square($n) {
92    return ($n * $n);
93  }
94  private static function cube($n) {
95    return ($n * $n * $n);
96  }
97  protected static function retVal($n)  {
98    return array($n);
99  }
100}
101test(array('StaticClass', 'square'), array(1, 2));
102test(array('StaticClass', 'cube'), array(2));
103test(array('StaticClass', 'retVal'), array(3, 4));
104
105echo "-- class implementing an interface --\n";
106interface myInterface
107{
108  public function toImplement();
109}
110class InterClass implements myInterface
111{
112  public static function square($n) {
113    return ($n * $n);
114  }
115  public function toImplement() {
116    return 1;
117  }
118}
119test(array('InterClass', 'square'), array(1, 2));
120
121?>
122--EXPECT--
123*** Testing array_map() : object functionality ***
124-- simple class with public variable and method --
125SimpleClass::square
126array(2) {
127  [0]=>
128  int(1)
129  [1]=>
130  int(4)
131}
132
133-- simple class with private variable and method --
134SimpleClassPri::add
135array_map(): Argument #1 ($callback) must be a valid callback or null, cannot access private method SimpleClassPri::add()
136
137-- simple class with protected variable and method --
138SimpleClassPro::mul
139array_map(): Argument #1 ($callback) must be a valid callback or null, cannot access protected method SimpleClassPro::mul()
140
141-- class without members --
142EmptyClass
143array_map(): Argument #1 ($callback) must be a valid callback or null, array must have exactly two members
144
145-- abstract class --
146ChildClass::emptyFunction
147defined in child
148defined in child
149array(2) {
150  [0]=>
151  NULL
152  [1]=>
153  NULL
154}
155
156-- class with final method --
157FinalClass::finalMethod
158This function can't be overloaded
159This function can't be overloaded
160array(2) {
161  [0]=>
162  NULL
163  [1]=>
164  NULL
165}
166
167-- class with static members --
168StaticClass::square
169array(2) {
170  [0]=>
171  int(1)
172  [1]=>
173  int(4)
174}
175StaticClass::cube
176array_map(): Argument #1 ($callback) must be a valid callback or null, cannot access private method StaticClass::cube()
177StaticClass::retVal
178array_map(): Argument #1 ($callback) must be a valid callback or null, cannot access protected method StaticClass::retVal()
179-- class implementing an interface --
180InterClass::square
181array(2) {
182  [0]=>
183  int(1)
184  [1]=>
185  int(4)
186}
187