Brandon Savage in his frustrations with the Zend Framework and the "self" keyword in PHP has written up a new post showing how you can use late static binding to work around it.
he problem is, when extended, My_Auth::getInstance() still returns an instance of Zend_Auth. The solution was to duplicate the static method in my My_Auth class, which worked properly. What did I get as a return value? Zend_Auth [...] Why didnâ€™t I get an instance of My_Auth instead of Zend_Auth? Well, thatâ€™s because PHP determines the meaning of the self keyword at compile time, meaning that when you call a function that makes use of it later, youâ€™ll get whatever itâ€™s been defined to mean when it was compiled.
To remedy the situation he uses late static binding (in PHP 5.3+) by using the "static" keyword like you would use "self" to refer correctly to the current class, not the class it sees at runtime.