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 don’t 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 don’t 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

Reply via email to