不在对象上下文模型中时使用 $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。您必须改用 self
。 self
指当前class:
array_push(self::list, $array[$i]);
static
关键字表示该函数是在 class 本身上调用的,而不是在 class 的实例上调用的。这意味着 $this
没有引用任何东西。
如果它是一个需要在特定实例上调用以便您可以访问其成员的函数,则需要使其成为非静态的或传入 class 的实例(可能是前者,因为这就是非静态方法的用途)。
就让 class 保留其实例列表而言:您在这里所做的是在 实例 上初始化 list
你的 class,所以每个实例都会有一个空列表。这可能不是您想要的。
您不能简单地在静态方法中使用 $this
,因为静态方法不是 $this
引用的实例化对象的一部分。即使未实例化对象也可以调用静态方法。
你必须reorderOrg
非静态才能工作。
请阅读 PHP 中的静态方法和属性。
您无法在静态方法中访问 $this
,因为您没有 class 的任何实例,它应该被称为 $this
。
这里有两个选择
将 属性 声明为静态并使用 self
关键字访问它。例如
//声明
public static $list = array();
//访问
self::$list[] = 'something';
创建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,...);
我已经说明了我的定制 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。您必须改用 self
。 self
指当前class:
array_push(self::list, $array[$i]);
static
关键字表示该函数是在 class 本身上调用的,而不是在 class 的实例上调用的。这意味着 $this
没有引用任何东西。
如果它是一个需要在特定实例上调用以便您可以访问其成员的函数,则需要使其成为非静态的或传入 class 的实例(可能是前者,因为这就是非静态方法的用途)。
就让 class 保留其实例列表而言:您在这里所做的是在 实例 上初始化 list
你的 class,所以每个实例都会有一个空列表。这可能不是您想要的。
您不能简单地在静态方法中使用 $this
,因为静态方法不是 $this
引用的实例化对象的一部分。即使未实例化对象也可以调用静态方法。
你必须reorderOrg
非静态才能工作。
请阅读 PHP 中的静态方法和属性。
您无法在静态方法中访问 $this
,因为您没有 class 的任何实例,它应该被称为 $this
。
这里有两个选择
将 属性 声明为静态并使用
self
关键字访问它。例如//声明
public static $list = array();
//访问
self::$list[] = 'something';
创建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,...);