ID: 39946
Comment by: toomuchphp-phpbugs at yahoo dot com
Reported By: scott dot mcnaught at synergy8 dot com
Status: Open
Bug Type: Feature/Change Request
Operating System: All
PHP Version: 6CVS-2006-12-25 (CVS)
New Comment:
Perhaps some nicer solutions to your got-cha's:
- What happens when $members = new members() is called
If the class is defined as a singleton, then PHP should create the
instance as
normal (this includes calling __construct() ) and store it in the hash
table,
or return the cached instance if it's already created.
-- I say an exception being thrown and a suggestion to remove "new"
You should still be able to use 'new', with the expectation that if the
class
is a singleton, you might actually get a cached instance, rather than a
'new'
instance, but it's not very difficult to understand:
$a = new members;
$b = new members;
$c = new members;
// $a $b and $c are all the same instance because members is a
singleton
If you really think 'new' is too ambiguous, why not add a new token
such as
'only', which is used for instantiation of singletons?
$a = only members;
$b = only members;
$c = only members;
// it's a bit more obvious $a $b and $c are the same instance.
- Is it ok to go $members = members; ?
That's too ambiguous. In that example 'members' could be a constant,
singleton, or simply the string 'members'.
- Singleton constructors should not have parameters
Perhaps they could (and it might be useful), if it's done like this:
singleton class members { ... }
$foo = new members(1, 2, 3); // arguments are passed to __construct()
$bar = new members(3, 2, 1); // arguments are ignored, object has
already been constructed
$baz = new members(4, 5, 6); // arguments are ignored, object has
already been constructed
- Perhaps a new function singleton_getobjects needs to be added to
enable access to the internal hash table
Not a bad idea. Getting in 'through the back door' is really important.
Why not
also a 'singleton_is_loaded()', and an 'is_singleton()'? Obviously
this would
eventually need to be visible through the Reflection classes (etc,
etc).
- Never have singleton abstract classes?
I think that would be an unfair limitation.
You should just need to:
- add T_SINGLETON to the parser.
- add an is_singleton flag for class definitions, activated by
T_SINGLETON.
- overload the 'new' operator to retrieve from the hash table if the
class is
a singleton (otherwise call __construct() as normal).
- implement some of those helper functions such as
singleton_getobjects().
Previous Comments:
[2006-12-29 08:23:57] scott dot mcnaught at synergy8 dot com
But the term singleton and static class are two different things.
The problem with pure static classes is that you can't inherit because
an instance is never created.
With static classes, you arent invoking methods on an instance of a
class. You are simply calling static functions in a static namespace.
[2006-12-29 07:59:22] me at bashkim dot com dot au
I think the term "singleton" itself is a little confusing for newbies
(considering that it's who you want to target here). Perhaps what
you're looking for is a "static class" ...
[2006-12-25 17:45:13] scott dot mcnaught at synergy8 dot com
Description:
###
# Introduction
###
This document is an RFC for adding a small patch to the zend engine to
allow for native singleton classes. The problem
is that currently theres no clean way to implement singleton classes in
user-land over the entirety of a project.
Singleton classes are beneficial because:
- Removes the overhead of having multiple instances of the one object
when there is no need
- Allows you to keep the objects state rather than always starting from
an initial state.
- They provide namespaces with the benefits of polymorphism (eg -
singleton classes can override / inherit from each other)
Throughout this document, I will use an example of a singleton class
"members" which acts as an interface to a database table.
This class can save and load members from this database table simply by
calling the following methods in this class.
members::get($member_id) Loads a member from a member id and returns an
associative array with info about that member
members::save($member) Saves a member to the database from an array of
properties about that member
With the recent phase of tiered and service oriented architecture, the
need for Singleton has become more and more apparent.
###
# Singleton in php5
###
In the past, I have implemented Singleton two different ways. Both of
these have problems.
# Method 1:
The first method involves having a public static getInstance method in
every singleton class. This