usa pure il mio codice

riguardo il resto, se il costruttore è privato, non potrai mai fare new A

mentre l'assegnazione esplicita per riferimento sarà sempre possibile poichè avrai 2 nomi che puntano alla stessa istanza di oggetto

per risolvere il primo problema, devi cambiare runtime il costruttore della classe, ma ti serve la runkit extension, che è ancora giovane.

Una volta integrata in PHP, potrai fare quello che ti pare ...

codice:
class A {
    function __construct(){
        // codice che modifica il costruttore, al primo new A, non sarà possibile riusare new A
    }
}
In JS la cosa è fattibile ..
codice:
function A(){
    if(this instanceof A)
        A = undefined;
};

var a = new A;
new A(); // error
solo per darti un'idea del concetto, che oltretutto, come approccio, mi sembra molto interessante