2013-12-03 2 views
0

Я видели реестр вопросов узора на здесь, но сейчас я быть отброшен сообщением об ошибке я получаю: Using $this when not in object context ...реестр шаблон, Singleton и Fatal Error PHP

Я взял образец кода от http://avedo.net/101/the-registry-pattern-and-php/, и я просмотрел эти строки кода, но я просто не могу обернуть голову вокруг проблемы.

EDIT: Я получаю ощущение от ответов, что статья я связан не следует рассматривать как «рабочий код» ...

Вот отрывок из моего реестра код класса:

class registry { 

    //Holds variables, objects, etc. 
    private $reg = array(); 

    private static $instance = null; 

    public static function getInstance() { 
     if($this->instance === null) {  //THROWS THE FATAL ERROR 
      $this->instance = new registry(); 
     } 
     return $this->instance; 
    } 

    //Disallow creation of new objects, forcing use of the Singleton 
    private function __construct() {} 
    private function __clone() {} 

То, что я не понимаю, это ПОЧЕМУ, что это бросает эту ошибку. Как я понял $this, что оно относится к тому, что называется метод, который этот отрывок из моего init.php файла:

//Instantiate registry 
    $registry = registry::getInstance(); 

Я чувствую себя немного перегорел от чтения и кодирования (эти последние несколько дней Я был посвящен обучению себя тому, как работает MVC, создавая мою собственную небольшую веб-инфраструктуру. Мне нужно пропустить что-то простое, но мне также кажется, что это именно то, что иллюстрирует статья. Для чего это стоит, я использую PHP 5.x.

Если кто-то чувствует, что им нужно прояснить некоторые из этих концепций для меня, пожалуйста, не стесняйтесь. :) Как всегда, спасибо, что нашли время, чтобы прочитать это.

+0

Вам действительно следует избегать использования в ваших проектах синглетов и других форм глобального состояния. –

+0

Было бы лучше создать объект реестра и передать его другим объектам, требующим доступа к его элементам? – armadadrive

+0

Возможно, вам следует начать с просмотра [this] (http://www.youtube.com/watch?v=-FRm3VPhseI) и [this] (http://www.youtube.com/watch?v=RlfLCWKxHJ0) лекции , Это должно объяснить как проблемы, вызванные глобальным состоянием, так и рекомендации для решения. –

ответ

2

Вы ссылаетесь на переменную контекста $this, которая является недоступна при вызове метода статически.

Вы используете класса контекст (вызов foo::bar()), а не объект контекст ($obj->foo())

Как одноэлементно вы должны быть ссылки на статическое свойство с помощью оператора self::.

Например:

public static function getInstance() { 
    if(null == self::$instance) { 
     self::$instance = new self(); 
    } 
    return self::$instance; 
} 
+0

У меня возникает ощущение, что статья, которую я использовал, фактически предоставила некоторый довольно плохой код, затем ... – armadadrive

+0

@armadadrive Я думаю, что даже с использованием шаблона singleton плохой дизайн – AlexP

+0

Спасибо. Мне дали хорошее чтение по этому вопросу, но теперь ваш ответ разрешил мою проблему и объяснил это хорошо. – armadadrive

1

У вас есть статические функции и доступ к статическим Var, использование:

self::$instance 

$this-> используется в контексте объекта, self:: используется для доступа к членам класса статическими.

1

Он выдает сообщение об ошибке по той причине, по которой он говорит.

Вы не находитесь в объектном контексте, когда вызываете функцию STATIC, поэтому $ this не существует.

self::$instance будет работать вместо вас.

1

Я думаю, вы получаете путать между методами экземпляра и класса.класс методы могут быть вызваны без создания экземпляра объекта этого класса. методы экземпляра вызываются из объекта или экземпляра класса. подумайте о $this как ссылающийся на этот экземпляр класса.

например: $obj = new MyClass(); $obj->myInstanceMethod();

для класса (статические) методы, нет экземпляра, поэтому, нет это не например: $returnVal = MyClass::myClassMethod();

вы хотели бы использовать self вместо this с классом методы

Сообщите мне, если вы хотите больше разъяснений! это одна из самых сложных штук ОО, чтобы понять сначала