Hi Jeff,
Your examples 1-4 are bad.
They snould use non-static methodos.
Example (5) make sense, but it is not exelent (I did the same :), because
"A" MUST be child of Singleton and it must declare special property.
BTW: generic singletons can be implemented with one very simple function
function single_instance($class_name) {
static $instances = array();
return (isset($instances[$class_name])) ? $instances[$class_name] :
($instances[$class_name] = new $class_name);
}
Thanks. Dmitry.
> -----Original Message-----
> From: Jeff Moore [mailto:[email protected]]
> Sent: Wednesday, March 01, 2006 11:45 PM
> To: Dmitry Stogov
> Cc: 'Mike Lively'; 'Andi Gutmans'; 'Marcus Boerger';
> 'PHP-DEV'
> Subject: Re: [PHP-DEV] [PATCH] Late Static Binding
>
>
>
> On Mar 1, 2006, at 9:37 AM, Dmitry Stogov wrote:
>
> > 1) I would very like to see some real example where "static" is
> > necessary?
>
> Some use cases for late static binding, tested using self on 5.1.2:
>
> 1. What class am I really?
>
> class A {
> static function myclass() {
> return get_class();
> }
> }
>
> class B extends A {}
>
> echo A::myclass(); // A
> echo B::myclass(); // also A
>
>
> 2. Template method pattern for static methods requires late binding:
>
> class Common {
> static function doit() {
> self::header();
> echo "The answer is 42";
> self::footer();
> }
> // could be abstract
> static function header() {}
> static function footer() {}
> }
>
> class Html extends Common {
> static function header() {
> echo "<html>\n<body><B>";
> }
> static function footer() {
> echo "</B></body>\n</html>";
> }
> }
>
> echo html::doit(); // Sorry, no html
>
>
> 3. Accessing a static property with late binding:
>
> class A {
> static protected $statprop = 'A';
> static function getStatprop() {
> return self::$statprop;
> }
> }
>
> class B extends A {
> static protected $statprop = 'B';
> }
>
> echo A::getStatprop(); // A
> echo B::getStatprop(); // Also A
>
>
> 4. Static properties are hard to get at for anything other than the
> explicit class name:
>
> class A {
> static public $iprop = 'A';
> }
>
> $class = 'A';
> echo $class::$iprop; // syntax error, unexpected
> T_PAAMAYIM_NEKUDOTAYIM
>
>
> 5. A (non-working) singleton base class implementation combining
> multiple late binding issues:
>
> class Singleton {
> public $iprop = NULL;
> static protected $instance;
>
> static public function getInstance() {
> if (!isset(self::$instance)) {
> $class = get_class();
> $obj = new $class();
> self::configure($obj);
> self::$instance = $obj;
> }
> return self::$instance;
> }
>
> static protected function configure($obj) {
> }
> }
>
> class A extends Singleton {
> static protected $instance;
> static protected function configure($obj) {
> $obj = 'A';
> }
> }
>
> var_dump(A::getInstance()->iprop); //NULL
>
>
> This is an issue I would very much like to see resolved prior to 6.
>
> Regards,
>
> Jeff
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>
>