rfc:array_count_handlers

Request for Comments: count_elements Vs. count()

  • Version: 1.0
  • Date: 2008-06-25
  • Author: Etienne Kneuss colder@php.net
  • Status: Implemented

Introduction

An internal class has two ways to achieve a special feature:

  1. implement the interface and define the method
  2. define the handler

for a class to be userland-friendly AND fast it must:

  1. define a zend_function pointer in the object for a specific method
  2. when creating the object, check if the method is overriden, if so, assign that pointer to the child method
  3. define a handler that will check that pointer, if defined: call it, if not, proceed without any method call

Proposal and Patch

There are one problem with how the count_elements handler is defined/used: if an internal class extends Countable, it will call its count() method regardless of the handler pointer.

There are two main reasons why it's a problem:

  1. while it's userland friendly, it doesn't give the possibility of internals class to spare a method call if the method is not overriden.
  2. it's not consistent with other handlers

The patch consists of changing the order of the checks to fix that problem:

http://patches.colder.ch/php-src/array-1.308.2.21.2.37.2.34.patch?markup http://patches.colder.ch/php-src/array-1.454.patch?markup

Possible Breaks

Internal classes that define a count_elements handler will have to be fixed.

Changelog

rfc/array_count_handlers.txt · Last modified: 2011/04/06 12:59 (external edit)