--- [EMAIL PROTECTED] wrote: > 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 ;))
Really it's best to stick with 'new' because of compatibility with non-singletons: $class = '...'; $a = new $class; If you use a different keyword or syntax for singletons: $class = '...'; $a = is_singleton($class) ? singleton $class : new $class; And you would end up reproducing that anywhere you have to create an instance of an unknown class. > Do you see this as being a useful feature? There's plenty of room to improve PHP's OO capabilities for PHP6, and singletons are a good start. regards, Peter > 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 > > 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