Web lists-archives.com

Re: singleton in php?


On September 5, 2018 at 2:56 AM Pete Ford <pete@xxxxxxxxxxxxx> wrote:

On 02/09/18 21:15, Jeffry Killen wrote:
I have been trying to get a better understanding of "singleton".
It is defined as a class that can only produce one instance of
In the online explanation, that is accomplished by a
private constructor function that produces an instance
of the class within its instance.
But in php I am of the understanding that a constructor
function has to be made public and can't return anything.
Here is the online reference I am looking at:
So, at some point it seems that the class instance has to
be exported via a return statement at some point, otherwise
how would it be used in other code?
Is there a part of the manual that addresses this?
I have a hard copy text* on PHP that addresses the singleton
and factory pattern, but I have not been able to completely
comprehend either of these.
*I don't have immediate access to the book and don't remember
the title, but the publisher is Friends of Ed / (Apress).
I have been further thrown off by the use of singleton
to refer to an object literal in _javascript_.
I realize that this in not about _javascript_ but the concept
and this use of the term has me confused.
More than one object literal can be created and subsequently
cloned by code, so how is it a singleton, in the general sense?
Thank you for time and attention.

Not sure where you got the "constructor function has to be made public" from:
constructors can be private or protected in PHP just like most other OO
languages. You then hold a static instance of the singleton class, and access it
or create it with a static method.

So your basic code is something like:

class MySingleton


    private static $MY_INSTANCE = NULL;

    private function __construct($params)


        /* Do stuff */


    public static function getInstance($params)


        if (self::$MY_INSTANCE===NULL)


            self::$MY_INSTANCE = new MySingleton($params);


        return self::$MY_INSTANCE;


I think that should work - anyone else got any corrections?