PHP错误:致命错误:在不在对象上下文中时使用$ this

时间:2010-06-05 14:32:08

标签: php oop static

    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 个答案:

答案 0 :(得分:7)

听起来您希望$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);

答案 1 :(得分:2)

$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;
    }
}

两者都可以,但你必须选择一个更适合你的应用程序设计的那个。

答案 2 :(得分:1)

如果您的意思是$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的方式做。

答案 3 :(得分:1)

Singleton在这里工作得很好

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);