1--TEST-- 2is_a and is_subclass_of behaviour (with and without autoload) 3--FILE-- 4<?php 5 6interface if_a { 7 function f_a(); 8} 9 10interface if_b extends if_a { 11 function f_b(); 12} 13 14class base { 15 function _is_a($sub) { 16 17 echo "\n>>> With Defined class\n"; 18 echo str_pad('is_a( OBJECT:'.get_class($this).', '.$sub.') = ', 60) . (is_a($this, $sub) ? 'yes' : 'no')."\n"; 19 echo str_pad('is_a( STRING:'.get_class($this).', '.$sub.') = ', 60). (is_a(get_class($this), $sub) ? 'yes' : 'no')."\n"; 20 echo str_pad('is_a( STRING:'.get_class($this).', '.$sub.', true) = ', 60). (is_a(get_class($this), $sub, true) ? 'yes' : 'no')."\n"; 21 echo str_pad('is_subclass_of( OBJECT:'.get_class($this).', '.$sub.') = ', 60). (is_subclass_of($this, $sub) ? 'yes' : 'no')."\n"; 22 echo str_pad('is_subclass_of( STRING:'.get_class($this).', '.$sub.') = ', 60). (is_subclass_of(get_class($this), $sub) ? 'yes' : 'no')."\n"; 23 echo str_pad('is_subclass_of( STRING:'.get_class($this).', '.$sub.',false) = ', 60). (is_subclass_of(get_class($this), $sub , false) ? 'yes' : 'no')."\n"; 24 25 // with autoload options.. 26 echo ">>> With Undefined\n"; 27 echo str_pad('is_a( STRING:undefB, '.$sub.',true) = ', 60). (is_a('undefB', $sub, true) ? 'yes' : 'no')."\n"; 28 echo str_pad('is_a( STRING:undefB, '.$sub.') = ', 60). (is_a('undefB', $sub) ? 'yes' : 'no')."\n"; 29 echo str_pad('is_subclass_of( STRING:undefB, '.$sub.',false) = ', 60). (is_subclass_of('undefB', $sub, false) ? 'yes' : 'no')."\n"; 30 echo str_pad('is_subclass_of( STRING:undefB, '.$sub.') = ', 60). (is_subclass_of('undefB', $sub) ? 'yes' : 'no')."\n"; 31 } 32 function test() { 33 echo $this->_is_a('base'); 34 echo $this->_is_a('derived_a'); 35 echo $this->_is_a('if_a'); 36 echo $this->_is_a('undefA'); 37 echo "\n"; 38 } 39} 40 41class derived_a extends base implements if_a { 42 function f_a() {} 43} 44 45class derived_b extends base implements if_a, if_b { 46 function f_a() {} 47 function f_b() {} 48} 49 50class derived_c extends derived_a implements if_b { 51 function f_b() {} 52} 53 54class derived_d extends derived_c { 55} 56 57$t = new base(); 58$t->test(); 59 60$t = new derived_a(); 61$t->test(); 62 63spl_autoload_register(function ($name) { 64 echo ">>>> In autoload: "; 65 var_dump($name); 66}); 67 68echo "NOW WITH AUTOLOAD\n\n"; 69 70$t = new base(); 71$t->test(); 72 73$t = new derived_a(); 74$t->test(); 75 76$t = new derived_b(); 77$t->test(); 78 79 80 81 82 83?> 84--EXPECT-- 85>>> With Defined class 86is_a( OBJECT:base, base) = yes 87is_a( STRING:base, base) = no 88is_a( STRING:base, base, true) = yes 89is_subclass_of( OBJECT:base, base) = no 90is_subclass_of( STRING:base, base) = no 91is_subclass_of( STRING:base, base,false) = no 92>>> With Undefined 93is_a( STRING:undefB, base,true) = no 94is_a( STRING:undefB, base) = no 95is_subclass_of( STRING:undefB, base,false) = no 96is_subclass_of( STRING:undefB, base) = no 97 98>>> With Defined class 99is_a( OBJECT:base, derived_a) = no 100is_a( STRING:base, derived_a) = no 101is_a( STRING:base, derived_a, true) = no 102is_subclass_of( OBJECT:base, derived_a) = no 103is_subclass_of( STRING:base, derived_a) = no 104is_subclass_of( STRING:base, derived_a,false) = no 105>>> With Undefined 106is_a( STRING:undefB, derived_a,true) = no 107is_a( STRING:undefB, derived_a) = no 108is_subclass_of( STRING:undefB, derived_a,false) = no 109is_subclass_of( STRING:undefB, derived_a) = no 110 111>>> With Defined class 112is_a( OBJECT:base, if_a) = no 113is_a( STRING:base, if_a) = no 114is_a( STRING:base, if_a, true) = no 115is_subclass_of( OBJECT:base, if_a) = no 116is_subclass_of( STRING:base, if_a) = no 117is_subclass_of( STRING:base, if_a,false) = no 118>>> With Undefined 119is_a( STRING:undefB, if_a,true) = no 120is_a( STRING:undefB, if_a) = no 121is_subclass_of( STRING:undefB, if_a,false) = no 122is_subclass_of( STRING:undefB, if_a) = no 123 124>>> With Defined class 125is_a( OBJECT:base, undefA) = no 126is_a( STRING:base, undefA) = no 127is_a( STRING:base, undefA, true) = no 128is_subclass_of( OBJECT:base, undefA) = no 129is_subclass_of( STRING:base, undefA) = no 130is_subclass_of( STRING:base, undefA,false) = no 131>>> With Undefined 132is_a( STRING:undefB, undefA,true) = no 133is_a( STRING:undefB, undefA) = no 134is_subclass_of( STRING:undefB, undefA,false) = no 135is_subclass_of( STRING:undefB, undefA) = no 136 137 138>>> With Defined class 139is_a( OBJECT:derived_a, base) = yes 140is_a( STRING:derived_a, base) = no 141is_a( STRING:derived_a, base, true) = yes 142is_subclass_of( OBJECT:derived_a, base) = yes 143is_subclass_of( STRING:derived_a, base) = yes 144is_subclass_of( STRING:derived_a, base,false) = no 145>>> With Undefined 146is_a( STRING:undefB, base,true) = no 147is_a( STRING:undefB, base) = no 148is_subclass_of( STRING:undefB, base,false) = no 149is_subclass_of( STRING:undefB, base) = no 150 151>>> With Defined class 152is_a( OBJECT:derived_a, derived_a) = yes 153is_a( STRING:derived_a, derived_a) = no 154is_a( STRING:derived_a, derived_a, true) = yes 155is_subclass_of( OBJECT:derived_a, derived_a) = no 156is_subclass_of( STRING:derived_a, derived_a) = no 157is_subclass_of( STRING:derived_a, derived_a,false) = no 158>>> With Undefined 159is_a( STRING:undefB, derived_a,true) = no 160is_a( STRING:undefB, derived_a) = no 161is_subclass_of( STRING:undefB, derived_a,false) = no 162is_subclass_of( STRING:undefB, derived_a) = no 163 164>>> With Defined class 165is_a( OBJECT:derived_a, if_a) = yes 166is_a( STRING:derived_a, if_a) = no 167is_a( STRING:derived_a, if_a, true) = yes 168is_subclass_of( OBJECT:derived_a, if_a) = yes 169is_subclass_of( STRING:derived_a, if_a) = yes 170is_subclass_of( STRING:derived_a, if_a,false) = no 171>>> With Undefined 172is_a( STRING:undefB, if_a,true) = no 173is_a( STRING:undefB, if_a) = no 174is_subclass_of( STRING:undefB, if_a,false) = no 175is_subclass_of( STRING:undefB, if_a) = no 176 177>>> With Defined class 178is_a( OBJECT:derived_a, undefA) = no 179is_a( STRING:derived_a, undefA) = no 180is_a( STRING:derived_a, undefA, true) = no 181is_subclass_of( OBJECT:derived_a, undefA) = no 182is_subclass_of( STRING:derived_a, undefA) = no 183is_subclass_of( STRING:derived_a, undefA,false) = no 184>>> With Undefined 185is_a( STRING:undefB, undefA,true) = no 186is_a( STRING:undefB, undefA) = no 187is_subclass_of( STRING:undefB, undefA,false) = no 188is_subclass_of( STRING:undefB, undefA) = no 189 190NOW WITH AUTOLOAD 191 192 193>>> With Defined class 194is_a( OBJECT:base, base) = yes 195is_a( STRING:base, base) = no 196is_a( STRING:base, base, true) = yes 197is_subclass_of( OBJECT:base, base) = no 198is_subclass_of( STRING:base, base) = no 199is_subclass_of( STRING:base, base,false) = no 200>>> With Undefined 201>>>> In autoload: string(6) "undefB" 202is_a( STRING:undefB, base,true) = no 203is_a( STRING:undefB, base) = no 204is_subclass_of( STRING:undefB, base,false) = no 205>>>> In autoload: string(6) "undefB" 206is_subclass_of( STRING:undefB, base) = no 207 208>>> With Defined class 209is_a( OBJECT:base, derived_a) = no 210is_a( STRING:base, derived_a) = no 211is_a( STRING:base, derived_a, true) = no 212is_subclass_of( OBJECT:base, derived_a) = no 213is_subclass_of( STRING:base, derived_a) = no 214is_subclass_of( STRING:base, derived_a,false) = no 215>>> With Undefined 216>>>> In autoload: string(6) "undefB" 217is_a( STRING:undefB, derived_a,true) = no 218is_a( STRING:undefB, derived_a) = no 219is_subclass_of( STRING:undefB, derived_a,false) = no 220>>>> In autoload: string(6) "undefB" 221is_subclass_of( STRING:undefB, derived_a) = no 222 223>>> With Defined class 224is_a( OBJECT:base, if_a) = no 225is_a( STRING:base, if_a) = no 226is_a( STRING:base, if_a, true) = no 227is_subclass_of( OBJECT:base, if_a) = no 228is_subclass_of( STRING:base, if_a) = no 229is_subclass_of( STRING:base, if_a,false) = no 230>>> With Undefined 231>>>> In autoload: string(6) "undefB" 232is_a( STRING:undefB, if_a,true) = no 233is_a( STRING:undefB, if_a) = no 234is_subclass_of( STRING:undefB, if_a,false) = no 235>>>> In autoload: string(6) "undefB" 236is_subclass_of( STRING:undefB, if_a) = no 237 238>>> With Defined class 239is_a( OBJECT:base, undefA) = no 240is_a( STRING:base, undefA) = no 241is_a( STRING:base, undefA, true) = no 242is_subclass_of( OBJECT:base, undefA) = no 243is_subclass_of( STRING:base, undefA) = no 244is_subclass_of( STRING:base, undefA,false) = no 245>>> With Undefined 246>>>> In autoload: string(6) "undefB" 247is_a( STRING:undefB, undefA,true) = no 248is_a( STRING:undefB, undefA) = no 249is_subclass_of( STRING:undefB, undefA,false) = no 250>>>> In autoload: string(6) "undefB" 251is_subclass_of( STRING:undefB, undefA) = no 252 253 254>>> With Defined class 255is_a( OBJECT:derived_a, base) = yes 256is_a( STRING:derived_a, base) = no 257is_a( STRING:derived_a, base, true) = yes 258is_subclass_of( OBJECT:derived_a, base) = yes 259is_subclass_of( STRING:derived_a, base) = yes 260is_subclass_of( STRING:derived_a, base,false) = no 261>>> With Undefined 262>>>> In autoload: string(6) "undefB" 263is_a( STRING:undefB, base,true) = no 264is_a( STRING:undefB, base) = no 265is_subclass_of( STRING:undefB, base,false) = no 266>>>> In autoload: string(6) "undefB" 267is_subclass_of( STRING:undefB, base) = no 268 269>>> With Defined class 270is_a( OBJECT:derived_a, derived_a) = yes 271is_a( STRING:derived_a, derived_a) = no 272is_a( STRING:derived_a, derived_a, true) = yes 273is_subclass_of( OBJECT:derived_a, derived_a) = no 274is_subclass_of( STRING:derived_a, derived_a) = no 275is_subclass_of( STRING:derived_a, derived_a,false) = no 276>>> With Undefined 277>>>> In autoload: string(6) "undefB" 278is_a( STRING:undefB, derived_a,true) = no 279is_a( STRING:undefB, derived_a) = no 280is_subclass_of( STRING:undefB, derived_a,false) = no 281>>>> In autoload: string(6) "undefB" 282is_subclass_of( STRING:undefB, derived_a) = no 283 284>>> With Defined class 285is_a( OBJECT:derived_a, if_a) = yes 286is_a( STRING:derived_a, if_a) = no 287is_a( STRING:derived_a, if_a, true) = yes 288is_subclass_of( OBJECT:derived_a, if_a) = yes 289is_subclass_of( STRING:derived_a, if_a) = yes 290is_subclass_of( STRING:derived_a, if_a,false) = no 291>>> With Undefined 292>>>> In autoload: string(6) "undefB" 293is_a( STRING:undefB, if_a,true) = no 294is_a( STRING:undefB, if_a) = no 295is_subclass_of( STRING:undefB, if_a,false) = no 296>>>> In autoload: string(6) "undefB" 297is_subclass_of( STRING:undefB, if_a) = no 298 299>>> With Defined class 300is_a( OBJECT:derived_a, undefA) = no 301is_a( STRING:derived_a, undefA) = no 302is_a( STRING:derived_a, undefA, true) = no 303is_subclass_of( OBJECT:derived_a, undefA) = no 304is_subclass_of( STRING:derived_a, undefA) = no 305is_subclass_of( STRING:derived_a, undefA,false) = no 306>>> With Undefined 307>>>> In autoload: string(6) "undefB" 308is_a( STRING:undefB, undefA,true) = no 309is_a( STRING:undefB, undefA) = no 310is_subclass_of( STRING:undefB, undefA,false) = no 311>>>> In autoload: string(6) "undefB" 312is_subclass_of( STRING:undefB, undefA) = no 313 314 315>>> With Defined class 316is_a( OBJECT:derived_b, base) = yes 317is_a( STRING:derived_b, base) = no 318is_a( STRING:derived_b, base, true) = yes 319is_subclass_of( OBJECT:derived_b, base) = yes 320is_subclass_of( STRING:derived_b, base) = yes 321is_subclass_of( STRING:derived_b, base,false) = no 322>>> With Undefined 323>>>> In autoload: string(6) "undefB" 324is_a( STRING:undefB, base,true) = no 325is_a( STRING:undefB, base) = no 326is_subclass_of( STRING:undefB, base,false) = no 327>>>> In autoload: string(6) "undefB" 328is_subclass_of( STRING:undefB, base) = no 329 330>>> With Defined class 331is_a( OBJECT:derived_b, derived_a) = no 332is_a( STRING:derived_b, derived_a) = no 333is_a( STRING:derived_b, derived_a, true) = no 334is_subclass_of( OBJECT:derived_b, derived_a) = no 335is_subclass_of( STRING:derived_b, derived_a) = no 336is_subclass_of( STRING:derived_b, derived_a,false) = no 337>>> With Undefined 338>>>> In autoload: string(6) "undefB" 339is_a( STRING:undefB, derived_a,true) = no 340is_a( STRING:undefB, derived_a) = no 341is_subclass_of( STRING:undefB, derived_a,false) = no 342>>>> In autoload: string(6) "undefB" 343is_subclass_of( STRING:undefB, derived_a) = no 344 345>>> With Defined class 346is_a( OBJECT:derived_b, if_a) = yes 347is_a( STRING:derived_b, if_a) = no 348is_a( STRING:derived_b, if_a, true) = yes 349is_subclass_of( OBJECT:derived_b, if_a) = yes 350is_subclass_of( STRING:derived_b, if_a) = yes 351is_subclass_of( STRING:derived_b, if_a,false) = no 352>>> With Undefined 353>>>> In autoload: string(6) "undefB" 354is_a( STRING:undefB, if_a,true) = no 355is_a( STRING:undefB, if_a) = no 356is_subclass_of( STRING:undefB, if_a,false) = no 357>>>> In autoload: string(6) "undefB" 358is_subclass_of( STRING:undefB, if_a) = no 359 360>>> With Defined class 361is_a( OBJECT:derived_b, undefA) = no 362is_a( STRING:derived_b, undefA) = no 363is_a( STRING:derived_b, undefA, true) = no 364is_subclass_of( OBJECT:derived_b, undefA) = no 365is_subclass_of( STRING:derived_b, undefA) = no 366is_subclass_of( STRING:derived_b, undefA,false) = no 367>>> With Undefined 368>>>> In autoload: string(6) "undefB" 369is_a( STRING:undefB, undefA,true) = no 370is_a( STRING:undefB, undefA) = no 371is_subclass_of( STRING:undefB, undefA,false) = no 372>>>> In autoload: string(6) "undefB" 373is_subclass_of( STRING:undefB, undefA) = no 374