【问题标题】:PHP Error: Fatal error: Using $this when not in object contextPHP 错误:致命错误:不在对象上下文中使用 $this
【发布时间】:2010-06-05 14:32:08
【问题描述】:

    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

有什么想法吗?

【问题讨论】:

    标签: php oop static


    【解决方案1】:

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

    【讨论】:

    • 另一个错误:致命错误:在非对象中调用成员函数 draw()
    • 你在调用 ->draw()。我错过了。我已经编辑更正了。
    • $test = Templaters::assign('key', 'value')->assign('key2', 'value2')->draw();我该如何做才能以这种方式使用此代码?
    • 您必须完全消除代码中的静态方法和属性。请参阅下面的示例。
    【解决方案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;
        }
    }
    

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

    【讨论】:

      【解决方案3】:

      单例在这里会很好用

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2011-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-11
          • 1970-01-01
          相关资源
          最近更新 更多