不在对象上下文模型类中时使用$ this

时间:2016-04-20 06:34:17

标签: php class protected

我已经说明了我的定制MV,我有一个简单的模型+控制器类,我不能通过不同的函数调用模型中的var

控制器类是

  class StaffController {

    protected $module = "staff";

    public function __construct()
    {
        //include the staff Model
        require_once(MODEL_PATH.$this->module.'.php');
    }
    public function index() {

        // we store all the posts in a variable
        $staff = Staff::all();

        header('Content-Type: application/json');
        echo json_encode($staff);

    }

$staff = Staff::all();调用模型类,并调用未被识别的$list变量:

  class Staff {

    public $list = array();

    public function __construct() {
          $this->list = [];
    }


    public static function all() {
      //get all the staff 

      $temp = [];

      $db = Db::getInstance();

      $req = $db->query('SELECT * FROM data ORDER BY ParentID ASC');

      // we create a list of Post objects from the database results
      foreach($req->fetchAll() as $staff) { array_push($temp,$staff);

      self::reorderOrg($temp );

      return $final;
    }


    private static function reorderOrg($array, $parent = 0, $depth = 0){
          //reorganise org 

        for($i=0, $ni=count($array); $i < $ni; $i++){
            //check if parent ID same as ID

            if($array[$i]['parentID'] == $parent){

                array_push($this->list ,$array[$i]); //***** no being recognized

                self::reorderOrg($array, $array[$i]['id'], $depth+1);

            }
        }

        return true;
      }


  }

我收到以下错误在不在对象上下文中使用$ this 并且它与模型类中不喜欢$this->list的array_push有关。如何设置私有var,以便它可以在自己的类函数中使用

5 个答案:

答案 0 :(得分:2)

static关键字表示在类本身上调用该函数,而不是在类的实例上调用。这意味着$this不会引用任何内容。

如果它是一个需要在特定实例上调用的函数,以便您可以访问其成员,则需要将其设置为非静态或传入类的实例(可能是前者,因为这就是非静态方法的用途。)

让类保留其实例列表:您在这里做的是在类的实例上初始化list,因此每个实例都有一个空列表。这可能不是你想要的。

答案 1 :(得分:0)

您不在对象上下文中,因为您的函数是 static 。你必须使用self代替。 self指的是当前的类:

array_push(self::list, $array[$i]);

答案 2 :(得分:0)

你很简单,不能在静态方法中使用$this,因为静态方法不是$this引用的实例化对象的一部分。即使没有实例化对象,也可以调用静态方法。

为了工作,你必须使reorderOrg非静态。

答案 3 :(得分:0)

请阅读PHP中的静态方法和属性。

您无法在静态方法中访问$this,因为您没有该类的任何实例应该被称为$this

这里有两个选择

  1. 将属性声明为静态,并使用self关键字对其进行访问。例如

    //宣言

    public static $ list = array();

    //访问

    self :: $ list [] =&#39;某事&#39;;

  2. 创建类的对象并访问已创建对象的属性。

    //创建对象

    $ staff = new Staff();

    //访问

    $ staff-&gt; list [] =&#39; something&#39;;

  3. 请务必阅读documentation

答案 4 :(得分:0)

相关文章:Using this inside a static function fails

这是否可以解决您的问题?使用静态方法时;你必须使用self :: not $ this-&gt;

http://php.net/manual/en/language.oop5.static.php

array_push(self::list,...);