Причина вы должны использовать статические переменные, а не $this
что $this
относительна только к текущему объекту - каждый раз, когда вы создаете новый объект SeemsLikeInfinity
, вы создаете новый $this
для этого объекта, поэтому $this->instance
всегда является null
, когда вы создаете экземпляр класса.
Итак, что происходит в конструкторе:
if ($this->instance == null) {
$this->instance = new self;
}
... новый $this->instance
(без присвоенного значения) создается, когда объект построен таким образом новый объект строится с новым $this->instance
, снова без значения, поэтому новый объект строится с новым $this->instance
, снова без значения ... и так далее, навсегда.
Статические переменные, однако, относятся к самому классу ... вы можете создать экземпляр класса столько раз, сколько захотите, и каждый созданный объект наследует последние заданные значения статических переменных из класса.
То, что вы пытаетесь сделать, это создать Singleton, так что вы никогда не вызвать конструктор непосредственно, инстанцировании и доступ к классу через статический getInstance()
метод:
// I've made this a "final" class - you can't really
// extend Singletons without getting into a mess
final class SeemsLikeInfinity {
// this needs to be a static variable as it'll
// be checked from the static self::getInstance() method
// it should also be private as you'll never call it from
// outside the class
private static $instance;
// the constructor function should also be private
// as it'll ONLY ever be called from the
// self::getInstance() method
private function __construct() {
// ... do stuff here to instantiate your class
}
// Singletons can't be cloned
public function __clone() {
throw new Exception("ERROR : you can't clone Singletons", E_USER_ERROR);
}
// this is the main getInstance() method called
// to actually instantiate or call the class
public static function getInstance() {
if(!self::$instance) { self::$instance = new self(); }
return self::$instance;
}
}
// now, to instantiate or access your class you'd use getInstance()
// you'll no longer have permanently reiterating classes and you
// should be golden
$looping = SeemsLikeInfinity::getInstance();
Как и в сторону, лучше всего использовать I «когда-либо найденный для Singletons создает оболочку управления сеансом, поскольку сеанс, по самой своей природе, имеет только один экземпляр.
Спасибо, это была попытка реализовать шаблон Singleton, но я ошибался. Я знаю, что $ this представляет экземпляр текущего объекта, я пытался создать объект, доступ к которому можно было бы получить с помощью $ object-> instance-> doSomething(), в то время как экземпляр содержит экземпляр объекта $. – user3104270
Обновлено, как правильно сделать синглтон. –
Это также приведет к «Неустранимая ошибка: использование $ this, когда не в контексте объекта» Я считаю, что ... – CD001