Thanks Peter.

I agree with everything except the use of the keyword "new".  I think that
it's just simply too confusing.  People won't know whether they are getting
a fresh instance or not.

The "only" keyword suggestion is not bad. I think id prefer "get" or
something. (or better no keyword at all ;))

I was meaning with "$members = members", is it ok to set a variable to an
instance of a singleton.  Could have been "$a = members" etc.

Do you see this as being a useful feature?

Scott


-----Original Message-----
From: Peter Hodge [mailto:[EMAIL PROTECTED] 
Sent: Tuesday, 6 March 2007 3:55 PM
To: [EMAIL PROTECTED]; 'Guilherme Blanco'
Cc: internals@lists.php.net
Subject: RE: [PHP-DEV] Native Singleton Implementation

Also posted in the bug report:



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:

  $a = new members(1, 2, 3); // arguments are passed to __construct()
  $b = new members(3, 2, 1); // arguments are ignored, object has already
been
constructed
  $c = 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().


regards,
Peter






--- [EMAIL PROTECTED] wrote:

> Sure, implementing singleton is easy enough.  But you can't abstract it in
> PHP.
> 
> In C++ you can use things called template classes or generics to abstract
> the singleton implementation. This way you dont have to duplicate the
> protected constructor, the instance and the accessor for each class.
> 
> I guess I'm really talking about the bigger picture here, where you might
> have an application which has around 50 singleton classes.  I dont want
to
> duplicate code in each one.
> 
> I have already implemented singleton in two different ways (see examples 1
> and 2 in the bug report - http://bugs.php.net/bug.php?id=39946) and they
> both have drawbacks.
> 
> Hmm... give the bug report a quick read over again :)
> 
> 
> -----Original Message-----
> From: Guilherme Blanco [mailto:[EMAIL PROTECTED] 
> Sent: Monday, 5 March 2007 6:21 AM
> To: [EMAIL PROTECTED]
> Cc: internals@lists.php.net
> Subject: Re: [PHP-DEV] Native Singleton Implementation
> 
> Hi,
> 
> The idea behing a native singleton class implementation should be
> really handy, but this is fairly simple to achieve.
> 
> Take a look at PHP documentation to see some patterns implementation:
> http://www.php.net/manual/en/language.oop5.patterns.php
> 
> 
> I hope this helps.
> 
> 
> Best regards,
> 
> On 3/4/07, [EMAIL PROTECTED] <[EMAIL PROTECTED]>
wrote:
> > *** Sorry - forgot to change the subject ***
> >
> > Hello All,
> >
> > I am new to the php internals mailing list.  I am a fairly experienced
> > programmer with a few ideas floating around.  I have come from a C++
games
> > development background and have now moved to primarily writing in php.
> >
> > One thing that I used extensively in C++ was the singleton design
pattern.
> > I assume that most of you know what that is, if not a quick google
search
> > will let you know.  I have written an implementation of singleton in
php,
> > but it's slow, and you have to use strings to reference the classes, or
> > duplicate a lot of code. (See methods 1 and 2 below)
> >
> > I recently submitted an RFC to bugs.php.net about this, but there was
> never
> > feedback from the internals group, so I am going to try here.
> >
> > http://bugs.php.net/bug.php?id=39946
> >
> > In a few months time, I would like to start helping the development of
> php,
> > but I am too busy at the moment.
> >
> > I was wondering if anyone has the time to implement this winner feature.
> I
> > think it would encourage good programming practise and speed up a lot of
> php
> > apps.  Also I would like people's thoughts and feedback on the idea.
> >
> > If no-one can implement this before me, I will have a go at it in a few
> > months time.
> >
> > Thankyou,
> >
> > Scott McNaught
> >
> >
> >
> > 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 sucks because you
> > need to manually copy and paste it into every singleton class you make.
> > Using a singleton class in this way is also confusing
> > for novice programmers. Eg:
> >
> > <?php
> >
> > class members
> > {
> >         static public function getInstance()
> >         {
> >                 static $object = null;
> >
> >                 if($object)
> >                 {
> >                         return $object;
> >                 }
> >
> >                 $object = new members();
> >                 return $object;
> >         }
> >
> >         /**
> >          * Returns a member from the database based on their id
> >          */
> >         function get($id)
> >         {
> >                 // ...
> >         }
> >
> >         // save method etc...
> > }
> >
> > // Usage
> > $arrMember = members::getInstance()->get(49);
> > $arrMember['member_f_name'] = 'Scott';
> > members::getInstance()->save($arrMember);
> >
> > ?>
> >
> > # Method 2:
> > This method involves an associative array of class names to their
> > instances, probably via a helper function similar to this.
> >
> > <?php
> >
> > class members
> > {
> >         /**
> >          * Returns a member from the database based on their id
> >          */
> >         function get($id)
> >         {
> >                 // ...
> >         }
> >
> >         // save method etc...
> > }
> >
> > /**
> >  * Returns an instance of a singleton class from its class name
> >  */
> > function getInstance($strClass)
> > {
> >         static $objects = array();
> >
> >         if(!isset($objects[$strClass]))
> >         {
> >                 return $objects[$strClass];
> >         }
> >
> >         $objects[$strClass] = new members();
> >         return $objects[$strClass];
> > }
> >
> > // Usage
> > $arrMember = getInstance('members')->get(49);
> > $arrMember['member_f_name'] = 'Scott';
> > getInstance('members')->save($arrMember);
> >
> > ?>
> >
> > This sucks because its slow, confusing for novices, and IDEs never pick
> > up the class for code hinting.
> >
> > ###
> > # Proposed new functionality
> > ###
> >
> > I propose that singleton classes become a native part of the php
> > language by adding the "singleton" class modifier T_SINGLETON.
> >
> > I don't know if native singleton classes have been implemented in a
> > language before.  Most other languages eg - C++
> > you can use template classes or generics to implement a clean
> > singleton.
> >
> > The zend engine could feature a hash table and store the instances of
> > objects.
> >
> > An example of the new way of using singleton classes would be:
> >
> > <?php
> >
> > /**
> >  * A class for saving / retreiving members from a database
> >  */
> > singleton class members extends dataadapter
> > {
> >         /**
> >          * Returns a member from the database based on their id
> >          */
> >         function get($id)
> >         {
> >                 // ...
> >         }
> >
> >         // save method etc...
> > }
> >
> > // Usage
> > $arrMember = members->get(49);
> > members->save($arrMember);
> >
> > ?>
> >
> > ###
> > # Edge cases / got-cha's
> > ###
> > Some investigation will have to be performed as to how inheritence will
> > work with singletons.
> >
> > Eg
> > - Never have singleton abstract classes?
> >
> > - What happens when $members = new members() is called
> > -- I say an exception being thrown and a suggestion to remove "new"
> >
> > - Is it ok to go $members = members; ?
> > -- I'd say yes
> >
> > - Singleton constructors should not have parameters
> >
> > - Perhaps a new function singleton_getobjects needs to be added to
> > enable access to the internal hash table
> >
> > - Dereferencing a non-singleton class should produce the same error
> >
> > --
> > PHP Internals - PHP Runtime Development Mailing List
> > To unsubscribe, visit: http://www.php.net/unsub.php
> >
> >
> 
> 
> -- 
> Guilherme Blanco - Web Developer
> CBC - Certified Bindows Consultant
> Cell Phone: +55 (16) 9166-6902
> MSN: [EMAIL PROTECTED]
> URL: http://blog.bisna.com
> São Carlos - SP/Brazil
> 
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
> 
> 


Send instant messages to your online friends http://au.messenger.yahoo.com 

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to