====== PHP RFC: instance counter ======
* Version: 0.4
* Date: 2013-04-08
* Author: Frank Liepert, contact@frank-liepert.de
* Contributor: Joe Watkins
* Status: Declined
* First Published at: http://wiki.php.net/rfc/instance_counter
===== Introduction =====
Coming to Object-Orientated Programming, PHP offers a variety of possibilities to obtain information about classes and their instances (objects). In this regard, the classes/objects functions (http://www.php.net/manual/en/ref.classobj.php) as well as the reflection API (http://www.php.net/manual/en/book.reflection.php) do a great job. But still there is no function to obtain a particular information: the number of instances of a class.
One might say, simply implement a static counter in each class. But what about built-in classes like SPL? A wrapper would be required. Implementing it these ways, it not only sounds, but actually is cumbersome. The purpose of this RFC is to address this issue.
===== Proposal =====
The proposal is to add a new functionality dealing with the number of instances of either a specific class name/object or set of class names/objects or all classes.
The function name should fit in with the current names of class/object functions. Therefore, the name **get_objects_count()** seems to be reasonable.
* **If no argument is provided, the number of all objects in the object store as an associative array ('class name' => count) will be returned.**
print_r (get_objects_count());
// Array ()
$foo = new stdClass;
print_r (get_objects_count());
// Array ( [stdClass] => 1 )
$bar = new stdClass;
print_r (get_objects_count());
// Array ( [stdClass] => 2 )
$bar = null;
print_r (get_objects_count());
// Array ( [stdClass] => 1 )
$foo = null;
print_r (get_objects_count());
// Array ()
* **If a class name is provided, the number of objects of the specified class in the object store will be returned.**
print get_objects_count('stdClass');
// 0
$foo = new stdClass;
print get_objects_count('stdClass');
// 1
$bar = new stdClass;
print get_objects_count('stdClass');
// 2
$bar = null;
print get_objects_count('stdClass');
// 1
$foo = null;
print get_objects_count('stdClass');
// 0
* **If an object is provided, the number of objects of the specifiied objects class in the object store will be returned. The return value is always ≥ 1.**
$foo = new stdClass;
print get_objects_count($foo);
// 1
$bar = new stdClass;
print get_objects_count($bar);
// 2
$bar = null;
print get_objects_count($foo);
// 1
* **If an an array is provided, it will be the treated as an inclusive indexed array of class names. An associative array ('class name' => count) will be returned.**
print_r (get_objects_count(array('stdClass')));
// Array ( [stdClass] => 0 )
$foo = new stdClass;
print_r (get_objects_count(array('stdClass')));
// Array ( [stdClass] => 1 )
$bar = new stdClass;
print_r (get_objects_count(array('stdClass')));
// Array ( [stdClass] => 2 )
$bar = null;
print_r (get_objects_count(array('stdClass')));
// Array ( [stdClass] => 1 )
$foo = null;
print_r (get_objects_count(array('stdClass')));
// Array ( [stdClass] => 0 )
===== General questions & answers =====
==== Inheritance ====
On internals list there was the question, if only the "direct" instances of a class or also the instances of subclasses are counted? The answer is: only direct instances. See the following code:
class A {}
class B extends A {}
print get_objects_count('A');
// 0
$b = new B;
var_dump($b instanceof A);
// bool(true)
print get_objects_count('A');
// 0
print get_objects_count('B');
// 1
===== Use cases: =====
* Debugging
* Implementation of design patterns (f.ex. flyweight pattern)
* Extended control: limit the number of objects
* Teach people about assignment of objects
* to be continued...
===== Function name =====
Since there were no objections against the proposed function name, its status changes to accepted.
// Proposed + Accepted
get_objects_count()
// Alternatives
get_instances_counts()
get_instances_count()
get_instance_counts()
get_object_store_count()
get_class_counts()
===== Backward Incompatible Changes =====
No BC breaks.
===== Proposed PHP Version(s) =====
next PHP 5.4.x or PHP 5.5.x
===== SAPIs Impacted =====
None.
===== Impact to Existing Extensions =====
None.
===== New Constants =====
None.
===== php.ini Defaults =====
None.
===== Open Issues =====
None.
===== Patches and Tests =====
Implementation: https://gist.github.com/krakjoe/5275773
Tests need to be done.
===== References =====
* https://gist.github.com/krakjoe/5275773
* http://www.php.net/manual/en/ref.classobj.php
* http://www.php.net/manual/en/book.reflection.php
===== Rejected Features =====
- None.
===== Vote =====
* Yes
* No
==== Voting period ====
Start: **2013/04/30**
End: **2013/05/07**