is_a Conclusion

Errors:

For the majority of WordPress users, the use of is_a in the core files is of little concern. The E_STRICT errors, in PHP versions >= 5.0 < 5.3 only, can be safely ignored and are not a problem if error reporting does not include them.

Performance:

For those that have PHP versions >= 5.0 and desire a slight improvement in performance, changing the code to use the instanceof operator, at least in the wp-includes/classes.php file, may be worth the effort. In my crude tests is_a ran in .000023 seconds and instanceof in .0000082 seconds. As the is_wp_error() function is called hundreds of times per page load, this one edit will amount to a saving of roughly .0074 seconds per page load.

Readability:

The use of either is_a or instanceof in conditional tests is readable and it is easy to comprehend the intent. My use of get_class and is_subclass_of, although supported in all versions of PHP, not so much.

Maintainability:

Considering how often new versions of WordPress are released — 2 more in the short time since this series of posts began — making 38 edits in 15 files just to replace the use of is_a with something else could become a chore.

To summarize, several things need to be considered before making any edits to the WordPress core files:

  • Are the E_STRICT errors important?
  • What version of PHP is the server running?
  • How important is performance?
  • How important is code readability?
  • How important is maintainability?
Technique	PHP	Speed	Errors		Readability

is_a		4,5	slow	Strict*		simple
instanceof	5	fast	$var fix**	simple
get_class
is_subclass_of	4,5	mid***	$var fix**	complex

* is_a is only an E_STRICT error for PHP versions >= 5.0 < 5.3

** Both instanceof and is_subclass_of can cause fatal errors in PHP versions 5.0 < 5.1 unless a work-around is used, in my examples, by using a variable to hold the class name.

*** When get_class alone is enough, the conditional approximates the speed of instanceof, but when PHP must test for is_subclass_of the speed is closer to, but a bit faster than, that of is_a

Choices for is a:

is_a($object, 'WP_Class')

( $object instanceof WP_Class )

$class_name = 'WP_Class';
( $object instanceof $class_name )

( ( get_class($object) == 'WP_Class' )
	 || is_subclass_of($object, 'WP_Class') )

$class_name = 'WP_Class';
( ( get_class($object) == 'WP_Class' )
	 || is_subclass_of($object, $class_name) )

Choices for Not is a:

!is_a($object, 'WP_Class')

!( $object instanceof WP_Class )

$class_name = 'WP_Class';
!( $object instanceof $class_name )

( ( get_class($object) != 'WP_Class' )
	 && !is_subclass_of($object, 'WP_Class') )

$class_name = 'WP_Class';
( ( get_class($object) != 'WP_Class' )
	 && !is_subclass_of($object, $class_name) )

WordPress core files containing is_a

Technorati Tags: ,

wp-admin includes template.php

This file causes two is_a E_STRICT errors.

function wp_category_checklist( $post_id = 0, $descendants_and_self = 0, $selected_cats = false, $popular_cats = false, $walker = null ) {
.....
//	if ( empty($walker) || !is_a($walker, 'Walker') )
	$class_name = 'Walker';
	if ( empty($walker)
	 || ( ( get_class($walker) != $class_name )
	 && !is_subclass_of($walker, $class_name) ) )
.....
function user_row( $user_object, $style = '', $role = '' ) {
.....
//	if ( !( is_object( $user_object) && is_a( $user_object, 'WP_User' ) ) )
	$class_name = 'WP_User';
	if ( !( is_object( $user_object)
	 && ( ( get_class($user_object) == $class_name )
	 || is_subclass_of($user_object, $class_name) ) ) )
Technorati Tags: ,

wp-includes Text Diff Renderer.php

One is_a

class Text_Diff_Renderer {
.....
	function render($diff)
.....
//		if (is_a($edit, 'Text_Diff_Op_copy')) {
		$class_name = 'Text_Diff_Op_copy';
		if ( ( get_class($edit) == $class_name )
		 || is_subclass_of($edit, $class_name) ) {
Technorati Tags: ,

wp-includes Text Diff.php

The Text_Diff class has a not is_a and an is_a

class Text_Diff {
.....
	function isEmpty()
.....
//		if (!is_a($edit, 'Text_Diff_Op_copy')) {
		$class_name = 'Text_Diff_Op_copy';
		if ( ( get_class($edit) != $class_name )
		 && !is_subclass_of($edit, $class_name) ) {
.....
	function lcs()
.....
//		if (is_a($edit, 'Text_Diff_Op_copy')) {
		$class_name = 'Text_Diff_Op_copy';
		if ( ( get_class($edit) == $class_name )
		 || is_subclass_of($edit, $class_name) ) {
Technorati Tags: ,

wp-includes widgets.php

Only 1 is_a

function the_widget($widget, $instance = array(), $args = array()) {
.....
//	if ( !is_a($widget_obj, 'WP_Widget') )
	$class_name = 'WP_Widget';
	if ( ( get_class($widget_obj) != $class_name )
	 && !is_subclass_of($widget_obj, $class_name) )
Technorati Tags: ,