Laravel:从公共静态函数访问类变量(基本oop问题)

时间:2014-06-05 14:06:26

标签: php oop laravel

修改

与此同时,这个问题被访问了几次。只是为了分享我在stackoverflow和其他资源的帮助下学到的东西,我不建议使用我要求的技术。更简洁的方法是在控制器中附加包含数据库文本的变量:

$txt = Model::find(1);
return view('name', array('text' => $txt->content);

现在您可以像这样访问视图中的文字

{{ $text or 'Default' }}

但是,如果您目前还忙着使用基本的oop和/或mvc架构继续阅读。也许它会有所帮助: - )


原始问题

我正在尝试输出从db加载的一些文本。 这是我的设置:

查看:

{{ ContentController::getContent('starttext') }}

控制器:

class ContentController extends BaseController {

    public $text = '';

    public static function getContent($description)
    {
        $content = Content::where('description', $description)->get();
        $this->text = $content[0]->text;

        return $this->text;
    }

}

我正在尝试各种方法来声明一个类变量并在我的函数中访问它,但我总是最终得到:

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

我认为我缺乏一些基本的oop知识:-D

3 个答案:

答案 0 :(得分:3)

静态方法无法访问$this$this是指实例化的类(使用new语句创建的对象,例如$obj = new ContentController()),并且静态方法不在对象中执行。

您需要做的是将所有$this更改为self,例如self::$text访问您班级中定义的静态变量。然后,您需要将public $text = '';更改为public static $text = '';

这就是为什么静态方法/变量在大多数时候都是不好的做法......

不是Laravel的专家,但我确定您不需要使用静态方法将变量传递到模板中......如果是这样的话,我会留下地狱来自Laravel ...

答案 1 :(得分:2)

您可以尝试这样的事情(在static的情况下):

class ContentController extends BaseController {

    public static $text = null;

    public static function getContent($description)
    {
        $content = Content::where('description', $description)->first();
        return static::$text = $content->text;
    }
}

阅读其他答案以了解其中的差异;另请阅读Late Static Bindings,而是......

您可以在Laravel中尝试这样的操作以避免static

class ContentController extends BaseController {

    public $text = null;

    public function getContent($description)
    {
        $content = Content::where('description', $description)->first();
        return $this->text = $content->text;
    }
}

像这样使用:

{{ App::make('ContentController')->getContent('starttext') }}

还有:

{{ with(new ContentController)->getContent('starttext') }}

或者这个(即使没有Laravel):

{{ (new ContentController)->getContent('starttext') }}

答案 2 :(得分:1)

在Laravel 5.7中,or运算符已被删除,因此{{ $text or 'Default' }}不再起作用。 新的运算符是??。从Laravel 5.7开始,它应该是{{ $text ?? 'Default' }}