1--TEST--
2ReflectionClass::implementsInterface()
3--CREDITS--
4Robin Fernandes <robinf@php.net>
5Steve Seear <stevseea@php.net>
6--FILE--
7<?php
8interface I1 {}
9class A implements I1 {}
10class B extends A {}
11
12interface I2 extends I1 {}
13class C implements I2 {}
14
15$classNames = array('A', 'B', 'C', 'I1', 'I2');
16
17foreach ($classNames as $className) {
18    $rcs[$className] = new ReflectionClass($className);
19}
20
21foreach ($rcs as $childName => $child) {
22    foreach ($rcs as $parentName => $parent) {
23        echo "Does " . $childName . " implement " . $parentName . "?\n";
24        echo "   - Using object argument: ";
25        try {
26            var_dump($child->implementsInterface($parent));
27        } catch (Exception|TypeError $e) {
28            echo $e->getMessage() . "\n";
29        }
30        echo "   - Using string argument: ";
31        try {
32            var_dump($child->implementsInterface($parentName));
33        } catch (Exception|TypeError $e) {
34            echo $e->getMessage() . "\n";
35        }
36    }
37}
38
39
40
41echo "\n\nTest bad arguments:\n";
42try {
43    $rcs['A']->implementsInterface();
44} catch (ArgumentCountError $e) {
45    echo $e->getMessage() . "\n";
46}
47try {
48    $rcs['A']->implementsInterface('C', 'C');
49} catch (ArgumentCountError $e) {
50    echo $e->getMessage() . "\n";
51}
52try {
53    $rcs['A']->implementsInterface(null);
54} catch (ReflectionException $e) {
55    echo $e->getMessage() . "\n";
56}
57try {
58    $rcs['A']->implementsInterface('ThisClassDoesNotExist');
59} catch (ReflectionException $e) {
60    echo $e->getMessage() . "\n";
61}
62try {
63    $rcs['A']->implementsInterface(2);
64} catch (ReflectionException $e) {
65    echo $e->getMessage() . "\n";
66}
67?>
68--EXPECTF--
69Does A implement A?
70   - Using object argument: A is not an interface
71   - Using string argument: A is not an interface
72Does A implement B?
73   - Using object argument: B is not an interface
74   - Using string argument: B is not an interface
75Does A implement C?
76   - Using object argument: C is not an interface
77   - Using string argument: C is not an interface
78Does A implement I1?
79   - Using object argument: bool(true)
80   - Using string argument: bool(true)
81Does A implement I2?
82   - Using object argument: bool(false)
83   - Using string argument: bool(false)
84Does B implement A?
85   - Using object argument: A is not an interface
86   - Using string argument: A is not an interface
87Does B implement B?
88   - Using object argument: B is not an interface
89   - Using string argument: B is not an interface
90Does B implement C?
91   - Using object argument: C is not an interface
92   - Using string argument: C is not an interface
93Does B implement I1?
94   - Using object argument: bool(true)
95   - Using string argument: bool(true)
96Does B implement I2?
97   - Using object argument: bool(false)
98   - Using string argument: bool(false)
99Does C implement A?
100   - Using object argument: A is not an interface
101   - Using string argument: A is not an interface
102Does C implement B?
103   - Using object argument: B is not an interface
104   - Using string argument: B is not an interface
105Does C implement C?
106   - Using object argument: C is not an interface
107   - Using string argument: C is not an interface
108Does C implement I1?
109   - Using object argument: bool(true)
110   - Using string argument: bool(true)
111Does C implement I2?
112   - Using object argument: bool(true)
113   - Using string argument: bool(true)
114Does I1 implement A?
115   - Using object argument: A is not an interface
116   - Using string argument: A is not an interface
117Does I1 implement B?
118   - Using object argument: B is not an interface
119   - Using string argument: B is not an interface
120Does I1 implement C?
121   - Using object argument: C is not an interface
122   - Using string argument: C is not an interface
123Does I1 implement I1?
124   - Using object argument: bool(true)
125   - Using string argument: bool(true)
126Does I1 implement I2?
127   - Using object argument: bool(false)
128   - Using string argument: bool(false)
129Does I2 implement A?
130   - Using object argument: A is not an interface
131   - Using string argument: A is not an interface
132Does I2 implement B?
133   - Using object argument: B is not an interface
134   - Using string argument: B is not an interface
135Does I2 implement C?
136   - Using object argument: C is not an interface
137   - Using string argument: C is not an interface
138Does I2 implement I1?
139   - Using object argument: bool(true)
140   - Using string argument: bool(true)
141Does I2 implement I2?
142   - Using object argument: bool(true)
143   - Using string argument: bool(true)
144
145
146Test bad arguments:
147ReflectionClass::implementsInterface() expects exactly 1 argument, 0 given
148ReflectionClass::implementsInterface() expects exactly 1 argument, 2 given
149
150Deprecated: ReflectionClass::implementsInterface(): Passing null to parameter #1 ($interface) of type ReflectionClass|string is deprecated in %s on line %d
151Interface "" does not exist
152Interface "ThisClassDoesNotExist" does not exist
153Interface "2" does not exist
154