2010-11-29 4 views
3

Почему следующий код печатает «1,1,1» вместо «4,5,6»?статический экземпляр в PHP


class MyClass { 
    // singleton instance 
    private static $instance = 3; 

    function __construct() { 
$instance++; 
echo $instance . ","; 
    } 
} 

for($i = 0; $i < 3; $i++) { 
$obj = new MyClass(); 
} 

ответ

10

$instance - локальная переменная, а не свойство статического класса. В отличии от Java, вы всегда должны получить доступ к переменным или свойствам в theire объеме

$var; // local variable 
$this->var; // object property 
self::$var; // class property 

Я просто видел

// singleton instance 

Одноэлементная модель обычно реализуется различной

class SingletonClass { 
    protected $instance = null; 
    protected $var = 3; 
    protected __construct() {} 
    protected __clone() {} 
    public static function getInstance() { 
     if (is_null(self::$instance)) { self::$instance = new self(); } 
     return self::$instance; 
    } 
    public function doSomething() { 
     $this->var++; 
     echo $this->var; 
    } 
} 
$a = SingletonClass::getInstance(); 
$a->doSomething(); 

Одноэлементная модель гарантирует, что вы всегда взаимодействуете с одним экземпляром класса.

3

В вашем конструкторе $instance еще не определено. Вы должны использовать:

self::$instance++; 
echo self::$instance . ","; 

ссылка на статическое свойство вашего класса.