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

Kri*_*sto 5 php oop laravel

编辑

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

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

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

{{ $text ?? 'Default' }}
Run Code Online (Sandbox Code Playgroud)

但是,如果您目前也在忙于基本的 oop 和/或 mvc 架构,请继续阅读。也许它有帮助:-)


原问题

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

看法:

{{ ContentController::getContent('starttext') }}
Run Code Online (Sandbox Code Playgroud)

控制器:

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

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

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

tbh 我想我缺乏一些基本的 oop 知识:-D

Pop*_*lus 6

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

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

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

不是 Laravel 专家,但我确信你不需要使用静态方法将变量传递到模板中...如果是这样的话,我就远离 Laravel...


The*_*pha 5

你可以尝试这样的事情(在 的情况下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;
    }
}
Run Code Online (Sandbox Code Playgroud)

阅读其他答案以了解差异;还阅读了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;
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

{{ App::make('ContentController')->getContent('starttext') }}
Run Code Online (Sandbox Code Playgroud)

还有这个:

{{ with(new ContentController)->getContent('starttext') }}
Run Code Online (Sandbox Code Playgroud)

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

{{ (new ContentController)->getContent('starttext') }}
Run Code Online (Sandbox Code Playgroud)