ID:               32322
 User updated by:  rickd at commando-pernod dot net
-Summary:          OOP singleton instance
 Reported By:      rickd at commando-pernod dot net
-Status:           Feedback
+Status:           Open
 Bug Type:         Zend Engine 2 problem
 Operating System: Win2000
 PHP Version:      5.0.3
 New Comment:

<?php
class test
{
    private static $instance = null;
    private $myname = '';
    
    private function __construct( $value = '' ) 
    {
        echo "New class $value created \n";
        $this -> myname = $value;
    }
    private function __clone() {}
    static public function getInstance()
    {
        if ( self::$instance == null )
        {
            self::$instance = new test('Singleton1');
        }
        else {
            echo "Using old class " . self::$instance -> myname .
"\n";
        }
        return self::$instance;
    }
    static public function getInstance2()
    {
        static $instance2 = null;
        if ( $instance2 == null )
        {
            $instance2 = new test('Singleton2');
        }
        else {
            echo "Using old class " . $instance2 -> myname . "\n";
        }
        return $instance2;
    }
    public function __destruct() 
    {
        if ( defined('SCRIPT_END') )
        {
            echo "Class " . $this -> myname . " destroyed at script end
\n";
        } else {
            echo "Class " . $this -> myname . " destroyed beforce
script end \n";
        }
    }
}    
echo "Try static instance inside class :\n";
$getCopyofSingleton    = test::getInstance();
$getCopyofSingleton    = null;
$getCopyofSingleton    = &test::getInstance();
$getCopyofSingleton    = null;
$getCopyofSingleton    = test::getInstance();
echo "Try static instance inside function :\n";
$getCopyofSingleton2   = test::getInstance2();
$getCopyofSingleton2   = null;
$getCopyofSingleton2   = &test::getInstance2();
$getCopyofSingleton2   = null;
$getCopyofSingleton2   = test::getInstance2();

define('SCRIPT_END',1);
?>

Current result :

Try static instance inside class :
New class Singleton1 created 
Using old class Singleton1
Class Singleton1 destroyed beforce script end 
New class Singleton1 created 
Try static instance inside function :
New class Singleton2 created 
Using old class Singleton2
Using old class Singleton2
Class Singleton1 destroyed at script end 
Class Singleton2 destroyed at script end 

Expected result :

Try static instance inside class :
New class Singleton1 created 
Using old class Singleton1
Using old class Singleton1
Try static instance inside function :
New class Singleton2 created 
Using old class Singleton2
Using old class Singleton2
Class Singleton1 destroyed at script end 
Class Singleton2 destroyed at script end 

php setting :
allow_call_time_pass_reference Off Off 
zend.ze1_compatibility_mode Off Off 

What i mean whats going wrong :
to return a variable by reference, you need to define the callerīs code
and function code with a & prefix, but it seems when you use the self::
and parent:: as return values
this is broken, only caller need a & prefix, that is what i mean


Previous Comments:
------------------------------------------------------------------------

[2005-03-19 21:49:04] [EMAIL PROTECTED]

Please provide an example script that actually returns something. And
give the expected / actual results too.


------------------------------------------------------------------------

[2005-03-19 07:47:09] rickd at commando-pernod dot net

CVS snapshot the same, getInstance() returning reference none copy of
var, only way at the moment is this little workaround ( when using
private static in class not in function ):


    public static function getInstance()
    {
        if ( self::$instance == null )
        {
            self::$instance = new test();
        }
        else {
            echo "old";
        }
        return ( $r =& self::$instance);
    }

------------------------------------------------------------------------

[2005-03-18 19:26:19] [EMAIL PROTECTED]

Please try using this CVS snapshot:

  http://snaps.php.net/php5-latest.tar.gz
 
For Windows:
 
  http://snaps.php.net/win32/php5-win32-latest.zip



------------------------------------------------------------------------

[2005-03-15 21:03:10] rickd at commando-pernod dot net

same but static inside class function and cant be killed with
referencing, remember in the other code i dont use &getinstance() so
the function do not return a reference how its describe in manual (
both need reference, caller and function code)

class test {
   static function getinstance() {
      static $instance;
      if ( $instance == null ) {
         $instance = new test();
      }
      return $instance;
   }
}
$user = &test::getinstance();
$user = null; // dont destroy instance
$user = &test::getinstance();
unset( $user ); // dont destroy instance

------------------------------------------------------------------------

[2005-03-15 21:00:00] rickd at commando-pernod dot net

upps i did i typing mistake :

so i mean

class test {
   static private $instance = null;
   static function getinstance() {
      if ( self::$instance == null ) {
         self::$instance = new test();
      }
      return self::$instance;
   }
}
$user = &test::getinstance();
$user = null; // destroy singleton instance
$user = &test::getinstance();
unset( $user ); // dont destroy instance

------------------------------------------------------------------------

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/32322

-- 
Edit this bug report at http://bugs.php.net/?id=32322&edit=1

Reply via email to