Ошибка PHP: фатальная ошибка: использование $ this, когда не в контексте объекта - PullRequest
1 голос
/ 05 июня 2010

    public static function assign($name, $value)
    {
        $this->params[] = array($name => $value);
    }

    public static function draw()
    {
        return $this->params;
    }
}


<?php
    $test = Templater::assign('key', 'value')->draw();
    print_r($test);

Мне нужно, чтобы функция "assign" была статической, но $ params была общей для всего класса. Но этот код не работает.

Fatal error: Using $this when not in object context

Есть идеи?

Ответы [ 4 ]

7 голосов
/ 05 июня 2010

Звучит так, как будто вы хотите, чтобы $params было static:

<?php
class Templater
{
    static $params = array();

    public static function assign($name, $value)
    {
        self::$params[] = array($name => $value);
    }

    public static function draw()
    {
        return self::$params;
    }
}


<?php
    Templater::assign('key', 'value');
    $test = Templater::draw();
    print_r($test);
2 голосов
/ 05 июня 2010

$this ключевое слово относится к экземпляру класса. Когда вы пытаетесь вызвать его внутри статического метода, экземпляр класса не используется. Таким образом, ваш метод assign не может быть статическим для взаимодействия с $params, который не является статическим. Сделать $params статическим или assign динамическим (не статичным).

<?php
class Templater
{
    static var $params = array();

    public static function assign($name, $value)
    {
        $this->params[] = array($name => $value);
    }

    public static dunction draw()
    {
        return self::params;
    }
}

или

<?php
class Templater
{
    var $params = array();

    public function assign($name, $value)
    {
        $this->params[] = array($name => $value);
    }

    public dunction draw()
    {
        return $this->params;
    }
}

Оба будут работать, но вы должны выбрать тот, который больше подходит для дизайна вашего приложения.

1 голос
/ 05 июня 2010

Синглтон будет хорошо работать здесь

class Templater {
  private static $instance = null;
  private $params = array();

  public function __construct(){
    return $this;
  }

  public static function instance(){
    if(is_null(self::$instance)) self::$instance = new self();
    return self::$instance;
  }

  public function assign($name, $value){
    $this->params[$name] = $value;
    return $this;
  }

  public function draw(){
    return $this->params;
  }
}

Использование:

$test = Templater::instance()
  ->assign('var1', 'value1')
  ->assign('var2', 'value2')
  ->draw();
print_r($test);
1 голос
/ 05 июня 2010

Если вы имеете в виду $params как статическое поле, используйте:

class Templater {
  private static $params = array();

  public static function assign($name, $value) {
    self::params[] = array($name => $value);
  }

  public static dunction draw() {
    return self::params;
  }
}

static функции не имеют $this контекста.

Кстати, не используйте var для объявления переменных экземпляра. Это PHP4. Сделайте это PHP5 способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...