]> granicus.if.org Git - php/commitdiff
Fixed Bug#43926 (isInstance() isn't equivalent to instanceof operator)
authorFelipe Pena <felipe@php.net>
Wed, 30 Jan 2008 10:27:28 +0000 (10:27 +0000)
committerFelipe Pena <felipe@php.net>
Wed, 30 Jan 2008 10:27:28 +0000 (10:27 +0000)
NEWS
ext/reflection/php_reflection.c
ext/reflection/tests/bug43926.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 1bd1e391a600d2c292b029a5d6f74ef654bacb67..c48c1d6cc0f149092d333b744ef9f085401bd666 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -240,6 +240,7 @@ PHP                                                                        NEWS
 - Fixed PECL bug #11216 (crash in ZipArchive::addEmptyDir when a directory
   already exists). (Pierre)
 
+- Fixed bug #43926 (isInstance() isn't equivalent to instanceof operator). (Marcus)
 - Fixed bug #42368 (Incorrect error message displayed by pg_escape_string).
   (Ilia)
 - Fixed bug #42365 (glob() crashes and/or accepts way too many flags).
index d4917846002766f6e0a5b344815f1d3d7839da54..f798475b45e1c49ea03b88d89dec504b00700427 100644 (file)
@@ -3402,7 +3402,7 @@ ZEND_METHOD(reflection_class, isInstance)
                return;
        }
        GET_REFLECTION_OBJECT_PTR(ce);  
-       RETURN_BOOL(ce == Z_OBJCE_P(object));
+       RETURN_BOOL(HAS_CLASS_ENTRY(*object) && instanceof_function(Z_OBJCE_P(object), ce));
 }
 /* }}} */
 
diff --git a/ext/reflection/tests/bug43926.phpt b/ext/reflection/tests/bug43926.phpt
new file mode 100644 (file)
index 0000000..373f9f1
--- /dev/null
@@ -0,0 +1,37 @@
+--TEST--
+Bug#43926 - isInstance() isn't equivalent to instanceof operator
+--FILE--
+<?php
+
+class E {
+}
+class D extends E {
+}
+
+class A extends D {
+}
+
+class C extends A {
+}
+
+$ra = new ReflectionClass('A');
+$rc = new ReflectionClass('C');
+$rd = new ReflectionClass('D');
+$re = new ReflectionClass('E');
+
+$ca = $ra->newInstance();
+$cc = $rc->newInstance();
+$cd = $rd->newInstance();
+$ce = $re->newInstance();
+
+print("Is? A ". ($ra->isInstance($ca) ? 'true' : 'false') .", instanceof: ". (($ca instanceof A) ? 'true' : 'false') ."\n");
+print("Is? C ". ($ra->isInstance($cc) ? 'true' : 'false') .", instanceof: ". (($ca instanceof C) ? 'true' : 'false') ."\n");
+print("Is? D ". ($ra->isInstance($cd) ? 'true' : 'false') .", instanceof: ". (($ca instanceof D) ? 'true' : 'false') ."\n");
+print("Is? E ". ($ra->isInstance($ce) ? 'true' : 'false') .", instanceof: ". (($ca instanceof E) ? 'true' : 'false') ."\n");
+
+?>
+--EXPECT--
+Is? A true, instanceof: true
+Is? C false, instanceof: false
+Is? D true, instanceof: true
+Is? E true, instanceof: true
\ No newline at end of file