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

Using $this when not in object context model class

我已经说明了我的定制 MV,我有一个简单的模型 + 控制器 classes,当被不同的函数调用时我无法识别模型中的 var

控制器 class 是

  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(); 调用模型 class,它的 $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;
      }


  }

我得到以下错误 Using $this when not in object context in and its to do with the array_push in the model class not liking $this->list。如何设置私有变量,以便它可以在自己的 class 函数中使用

您不在 对象上下文 中,因为您的函数是 static。您必须改用 selfself指当前class:

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

static 关键字表示该函数是在 class 本身上调用的,而不是在 class 的实例上调用的。这意味着 $this 没有引用任何东西。

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

就让 class 保留其实例列表而言:您​​在这里所做的是在 实例 上初始化 list你的 class,所以每个实例都会有一个空列表。这可能不是您想要的。

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

你必须reorderOrg非静态才能工作。

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

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

这里有两个选择

  1. 将 属性 声明为静态并使用 self 关键字访问它。例如

    //声明

    public static $list = array();

    //访问

    self::$list[] = 'something';

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

    // 创建对象

    $staff = new Staff();

    //访问

    $staff->list[] = 'something';

记得阅读documentation

相关Post:Using this inside a static function fails

这是否解决了您的问题?使用静态方法时;你必须使用 self:: 而不是 $this->

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

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