php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Return to Bug #55475
Patch final_patch_for_5_4_and_HEAD_v2 revision 2011-11-08 09:24 UTC by alan_k@php.net
Patch is_a_5.4_alternative revision 2011-10-17 13:15 UTC by jbondc at openmv dot com
Patch final_patch_for_5_4_and_HEAD revision 2011-10-13 07:36 UTC by alan_k@php.net
Patch is_a_with_warning.txt revision 2011-09-25 09:32 UTC by alan_k@php.net
Patch Is_a_with_allow_string_argument_v3 revision 2011-09-22 23:31 UTC by alan_k@php.net
Patch Is_a_with_allow_string_argument_v2 revision 2011-09-22 23:26 UTC by alan_k@php.net
Patch Is_a_with_allow_string_argument revision 2011-09-22 23:24 UTC by alan_k@php.net
Patch is_class_of.diff revision 2011-09-20 21:32 UTC by alan_k@php.net
Patch is_class_of.txt revision 2011-09-20 21:25 UTC by alan_k@php.net
Patch revert.is_a.behaviour.to.ignoring.strings.diff revision 2011-08-25 02:37 UTC by alan at akbkhome dot com
Patch bug55475 revision 2011-08-22 10:30 UTC by kalle@php.net

Patch is_a_with_warning.txt for Scripting Engine problem Bug #55475

Patch version 2011-09-25 09:32 UTC

Return to Bug #55475 | Download this patch
Patch Revisions:

Developer: alan_k@php.net

Index: Zend/zend_builtin_functions.c
===================================================================
--- Zend/zend_builtin_functions.c	(revision 317267)
+++ Zend/zend_builtin_functions.c	(working copy)
@@ -839,13 +839,26 @@
 	int class_name_len;
 	zend_class_entry *instance_ce;
 	zend_class_entry **ce;
+	zend_bool allow_string = only_subclass;
 	zend_bool retval;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zs", &obj, &class_name, &class_name_len) == FAILURE) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zs|b", &obj, &class_name, &class_name_len, &allow_string) == FAILURE) {
 		return;
 	}
+	/* 
+	  is_a() was originaly used as a test for mixed value returns
+	  since PHP 5.1 instanceof was fixed to handle this, it is now the recommended way to do this.
+	  we can not just break BC straight away, so let's persuade everyone to use instanceof, however they can carry on using
+	  is_a() as long as the explicitly give it 3 arguments, otherwise a DEPRCECIATION warning will occur.
+	*/
+	if (!only_subclass && ZEND_NUM_ARGS() < 3) {
+		zend_error(E_DEPRECATED, 
+			"is_a() testing objects for class names is generally deprecated "
+			" - use instanceof as it now works exactly the same as is_a() does, "
+			" otherwise put false as the 3rd argument to hide this message.");
+	}
 	
-	if (Z_TYPE_P(obj) == IS_STRING) {
+	if (allow_string && Z_TYPE_P(obj) == IS_STRING) {
 		zend_class_entry **the_ce;
 		if (zend_lookup_class(Z_STRVAL_P(obj), Z_STRLEN_P(obj), &the_ce TSRMLS_CC) == FAILURE) {
 			RETURN_FALSE;
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Tue Mar 19 03:01:29 2024 UTC