簡體   English   中英

Laravel:從公共靜態函數訪問類變量(基本 oop 問題)

[英]Laravel: Get access to class-variable from public static function (basic oop issues)

編輯

與此同時,這個問題被訪問了幾次。 只是為了分享我在 stackoverflow 和其他資源的幫助下學到的東西,我不建議使用我要求的技術。 更簡潔的方法是在控制器中附加一個包含數據庫文本的變量:

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

現在您可以像這樣訪問視圖中的文本

{{ $text ?? '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

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

你可以嘗試這樣的事情(在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') }}

靜態方法無權訪問$this $this指的是一個實例化的類(一個用new語句創建的對象,例如$obj = new ContentController() ),並且靜態方法不在對象內執行。

您需要做的是將所有$this更改為self ,例如self::$text以訪問類中定義的靜態變量。 然后你需要改變public $text = ''; public static $text = '';

這就是為什么靜態方法/變量在大多數情況下都是不好的做法......

不是 Laravel 的專家,但我確定您不需要使用靜態方法將變量傳遞到模板中...如果是這種情況,我將遠離 Laravel...

在 Laravel 5.7 中, or運算符已被刪除,因此{{ $text or 'Default' }}不再起作用。 新的運營商是?? . 從 Laravel 5.7 開始,它應該是{{ $text ?? 'Default' }} {{ $text ?? 'Default' }}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM