0

我有一个 CodeIgniter php 设置并使用 RESTful 功能对其进行了增强。

我有以下结构

base.php(这是基本控制器类

class Base {
    private $model
    public function __construct($model = false) {
        $this->model = $model . '_model';
        $this->load->model($this->model);
    ...
}

然后是一个指定模型的控制器

class Products extends Base {

    public function __construct() {
        parent::__construct('product');     
    }
}

问题如下:在 base.php 中,我有 HTTP 方法(get、post、put、delete)的函数,但我无法从模型中调用静态方法,如下所示:

public function get() {
    return $this->model::loadData();
}

如果我在其中分配$this->model一个局部变量,get()它会起作用,但对我来说它看起来很丑。

所以我的问题是:如何在给定 B 类成员中的类名的情况下调用 A 类的静态方法,而不将其分配给 B 类方法中的新局部变量?

PS:我知道 CodeIgniter 看起来不像这样,但它的结构与我的问题无关。

4

1 回答 1

2

正如您所指出的,将$this->model分配给像$model这样的局部变量,然后调用$model::loadData()可以按预期工作。

$this->model::loadData()调用不起作用的事实可能是我们在::->运算符之间的优先级,但我不能肯定地说,因为在官方文档。

对于同等优先级的运算符,左结合性意味着计算从左到右进行,而右结合性则相反。对于非关联的具有相同优先级的运算符,这些运算符可能不与它们自身关联。例如,语句 1 < 2 > 1 在 PHP 中是非法的。然而,语句 1 <= 1 == 1 不是,因为 T_IS_EQUAL 运算符的优先级低于 T_IS_SMALLER_OR_EQUAL 运算符。

来自PHP 运算符优先级

我可能离这里很远,但是从您的代码的行为来看,我会说它们的优先级相同,或者::的优先级高于->,因此不能按您的意图一起使用。

更新

它确认::运算符具有更高的优先级->因此 PHP 解释了这一点:

$this->model::loadData();

作为

($this->(model::loadData()));

检查$var::staticfunction() 的答案 OK 但 $this->var::staticfunction() 不是。理由是什么?问题。

于 2013-04-19T10:34:34.927 回答