2016-04-20 7 views
-1

私は自分の注文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を使用し、モデルクラスのarray_pushとの間には$this->listがありません。あなたの関数が静的あるので、それはそれ自身のクラスのつく内で使用することができるので、セットにプライベートVARを行う方法

+0

をあなたは静的メソッドで、「この」コンテキストを持っていません。 '$ this-> list'の代わりに' self :: $ list'を呼び出さなければなりません。 – rinukkusu

答えて

2

staticキーワードは、その関数が、クラス自体ではなく、クラスのインスタンスに呼び出されることを意味します。つまり、$thisは何も参照していません。

メンバーにアクセスできるように特定のインスタンスで呼び出す必要がある関数の場合は、非静的にするか、クラスのインスタンスを渡す必要があります(おそらく、これは非静的なメソッドのためです)。あなたがここでやっていることはあなたのクラスのインスタンスlistを初期化しているので、各インスタンスは空のリストを持っています。限りクラスは、そのインスタンスのリストを保つたとして

これはあなたが意図しているものではないかもしれません。

0

あなたはオブジェクトコンテキストではありません。代わりにselfを使用する必要があります。 selfは現在のクラスを指す:

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

$thisが参照するインスタンス化されたオブジェクトの一部ではないため、静的メソッドでは$thisを使用できません。静的メソッドは、オブジェクトがインスタンス化されていなくても呼び出すことができます。

reorderOrgを動作させるには、非静的にする必要があります。

0

PHPの静的メソッドとプロパティについては、こちらをご覧ください。

$thisと呼ばれるクラスのインスタンスがないため、静的メソッドで$thisにアクセスすることはできません。

あなたは、静的およびselfキーワードでアクセスをとしてプロパティを宣言し、ここで

  1. 2つのオプションがあります。例えば

    //宣言

    のpublic static $一覧=配列();

    //アクセス

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

  2. 作成したオブジェクトのクラスとアクセスプロパティのオブジェクトを作成します。

    //オブジェクトを作成

    $ staff = new Staff();

    //アクセス

    $ staff->リスト[] = '何か';

documentationを必ずお読みください!

関連する問題