It would not be such a problem to write something that does the same task 
through a static or global function, but unfortunately it is impossible, due 
to the following: you can build a cache in an array, then in a __new() 
function you could check if the requested object is already loaded and return 
a reference. However, if this is the case, objects that enter the cache never 
leave it because they are still referenced in the array when all other 
references have gone, so they never destruct, except when the array is 
destroyed at program's end.
So, the 'cache' would grow to include all possible objects, that's not good.
Now, the question is not if there should be an 'existing' keyword for 
replacing singletons... singletons are ok, but there may be some 
circumstances when one would like to return some already existing instance of 
some class (between other existing instances, determined by the $id member 
for example) and get the destructor executed when all references to that 
instance are gone. However, it is not possible to do it because there is not 
any way to detect the removal of a reference to an object instance, except 
implementing specific (and really ugly) methods for assigning and deassigning 
the variables, such as __new(&$var) and __release(&$var) functions that do 
the task of incrementing and decrementing a reference count for the object 
and remove it from the cache when the refcount reaches 0. The main 
disadvantage of this is that any request for an object of the mentioned class 
should be matched with a __release() function much like in a C++ program 
using new and delete.
Is there any way of checking the existing instances of a class and returning 
the same instance in a function without implementing that cache system, so 
when all references are gone it naturally gets destroyed by the normal and 
natural php code flux?

Leo


On Monday 09 May 2005 20:28, Rory Browne wrote:
> I think Leonardo might have a point here. Built-in support for
> Singletons could be a nice feature, without the use of static
> functions, would be nice. I wouldn't use the 'new' keyword however. I
> think something along the lines of existing, or ref
>
> $ref = existing TEST; // which would return an existing instance of
> TEST, if one exists, and a new one if it doesn't. ( pretty much like
> the singleton code, except no need for singleton code)
>
> I don't think it's anything important, and there are more pressing
> matters, to be worked on, I'm sure, but if someone created the code,
> and it was secure / bug-free / compliant-with-coding-standards / etc,
> I can't see why it couldn't(or shouldn't) be included. When all's said
> and done though, it's still just syntactic sugar. It all depends on
> how sweet the devs consider it.
>
> On 5/9/05, Jochem Maas <[EMAIL PROTECTED]> wrote:
> > Leonardo Pedretti wrote:
> > > I would like (for code cleanliness purposes) to make 'new' return a
> > > reference to an already created object under certain circumstances
> > > without using a factory, is it possible?
> >
> > not unless you hack the php engine (in which case
> > your code will only work on your custom php build),
> > I'll bet money that none of the php/zend devs feel anything for
> > introducing this kind of 'magic' into engine.
> >
> > IMHO a factory would be a clean method of handling this behaviour and
> > has the benefit that no programmer looking at your code will
> > misinterpret occurances of the 'new' keyword. e.g.:
> >
> > class Test
> > {
> >         /* ... */
> >         function __construct() {}
> >         function get() {}
> > }
> >
> > // and do:
> >
> > $var = Test::get( /* pass ctor args */ );
> >
> > // instead of:
> >
> > $var = new Test( /* pass ctor args */ );
> >
> > ... in this example its only 1 extra char to type when
> > using the factory method and you could turn that around by
> > doing something evil(tm) like:
> >
> > $var = Test::_( /* pass ctor args */ ); // '_' is a function name!!! (ala
> > wordpress-CS)
> >
> > maybe reply to generals describing what you are (trying to) do[ing],
> > I for one am always interested in other people's realworld php5/oo
> > problems/ideas/etc :-)
> >
> > rgds,
> > Jochem
> >
> > ps - I redirected this reply to generals because I didn't really think
> > that it was an internals question (and those guys are busy enough :-)
> >
> > > Thanx
> >
> > --
> > PHP General Mailing List (http://www.php.net/)
> > To unsubscribe, visit: http://www.php.net/unsub.php

-- 

Leonardo Pedretti
Axon Sistemas
Líder de Equipo Proyecto Basalto

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

Reply via email to