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!