Originariamente inviato da weppos
Sarà possibile, ad esempio, creare un trait SIngleton e mixarlo all'interno delle classi che si desidera singletonizzare.
ecco, per il Singleton credo che il trait sia l'ultima cosa da fare ... Singleton e' Singleton, non hai problemi di ereditarieta' multipla. Con late static bindings puoi gia' fare quello che ti pare, estendi Singleton e pace.
codice:
class Singleton {
    static  public  function    getInstance(){
        if(!isset(static::$_instance)){
            $arguments  = func_get_args();
            $i          = 0;
            switch(count($arguments)){
                case    3:
                    static::$_instance  = new static($arguments[$i++], $arguments[$i++], $arguments[$i++]);
                    break;
                case    2:
                    static::$_instance  = new static($arguments[$i++], $arguments[$i++]);
                    break;
                case    1:
                    static::$_instance  = new static($arguments[$i++]);
                    break;
                case    0:
                    static::$_instance  = new static;
                    break;
                default:
                    throw new Exception('Would be nice to make it possible with new ReflectionClass(__CLASS__)->newInstanceArgs');
                    break;
            }
        }
        return  static::$_instance;
    }

    static  protected   $_instance;

    protected   function    __construct(){
        
    }
    
    public   function   __clone(){
        throw new Exception('Singleton is not cloneable');
    }
}

class MyS extends Singleton {
    static  protected   $_instance;
}

// true, true, true
var_dump(
    Singleton::getInstance() === Singleton::getInstance()
);
var_dump(
    MyS::getInstance() === MyS::getInstance()
);
var_dump(
    Singleton::getInstance() != MyS::getInstance()
);
Io comunque tutto questo problema con l'ereditarieta' multipla non 'ho mai capito ... in primo luogo bisogna essere fagiani per incantarsi, secondo basta ridefinire il metodo se proprio necessario, terzo c'e' un ordine in extends ( A, B, C ) e seguendo quell'ordine mi aspetto metodo C sulla D senza problemi ... voglio dire, Python non ha mai avuto questo problema, ma ancora PHP prende il peggio di Java ed ignora il meglio di Python ... boh

[edit]
che poi non si capisce perche' per le interfaccie il problema non dovrebbe esistere ... ah no, ci sono i conflitti, e che li mettano anche sulla extends se vogliono essere logici ... ri-boh!