在laravel中,self關鍵字用來取代類別名,可以引用目前類別的靜態成員變數和靜態函數,也用來抑制多態行為,可以引用目前類別的函數而非子類別中覆蓋的實現,self總是指向當前類別以及類別實例。
本文操作環境:Windows10系統、Laravel6版、Dell G3電腦。
laravel中self的用法是什麼
靜態成員函數內不能用 this
呼叫非成員函數,但可以用 self
呼叫靜態成員函數/變數/常數;其他成員函數可以用 self
呼叫靜態成員函數以及非靜態成員函數。隨著討論的深入,發現 self
並沒有那麼簡單。有鑑於此,本文先對幾個關鍵字做比較和區分,再總結 self
的用法。
與 parent
、 static
以及 this
的差異
要徹底理解 self
,要與 parent
、 static
、 this
區分開。以下分別做對比。
parent
self
與 parent
的區分比較容易: parent
引用父類別/基底類別被隱蓋的方法(或變數), self
則引用自身方法(或變數)。例如建構子中呼叫父類別建構子:
class Base { public function __construct() { echo "Base contructor!", PHP_EOL; } } class Child { public function __construct() { parent::__construct(); echo "Child contructor!", PHP_EOL; } } new Child; // 输出: // Base contructor! // Child contructor!
static
#static
常規用途是修飾函數或變數使其成為類別函數和類別變量,也可以修飾函數內變數延長其生命週期至整個應用程式的生命週期。但其與 self
關聯上是PHP 5.3以來引入的新用途:靜態延遲綁定。
有了 static
的靜態延遲綁定功能,可以在執行時動態決定歸屬的類別。例如:
class Base { public function __construct() { echo "Base constructor!", PHP_EOL; } public static function getSelf() { return new self(); } public static function getInstance() { return new static(); } public function selfFoo() { return self::foo(); } public function staticFoo() { return static::foo(); } public function thisFoo() { return $this->foo(); } public function foo() { echo "Base Foo!", PHP_EOL; } } class Child extends Base { public function __construct() { echo "Child constructor!", PHP_EOL; } public function foo() { echo "Child Foo!", PHP_EOL; } } $base = Child::getSelf(); $child = Child::getInstance(); $child->selfFoo(); $child->staticFoo(); $child->thisFoo();
程式輸出結果如下:
Base constructor! Child constructor! Base Foo! Child Foo! Child Foo!
在函數參考上, self
與 static
的差異:對於靜態成員函數, self
指向程式碼目前類別, static
指向呼叫類別;對於非靜態成員函數, self
抑制多型,指向目前類別的成員函數, static
等同於 this
,動態指向呼叫類別的函數。
parent
、 self
、 static
三個關鍵字結合在一起看挺有意思,分別指向父類別、目前類別、子類,有點「過去、現在、未來」的味道。
this
self
與 this
是討論最多,也是最容易被誤用的組合。兩者主要的差異如下:
-
this
不能用在靜態成員函數中,self
可以; ##對靜態成員函數/變數的訪問, 建議用 - self
,不要用
$this::或
$this->的形式;
對非靜態成員變數的訪問,不能用 - self
,只能用
this;
- this
要在物件已經實例化的情況下使用,
self沒有此限制;
在非靜態成員函數內使用, - self
抑制多態行為,引用目前類別的函數;而
this引用呼叫類別的重寫(override)函數(如果有的話)。
self 的用途
看完與上述三個關鍵字的區別, self 的用途是不是呼之即出?一句話總結,那就是:
self總是指向「目前類別(及類別實例)」。詳細說則是:
- 替代類別名,引用目前類別的靜態成員變數和靜態函數;
- 抑制多態行為,引用目前類別的函數而非子類別中覆寫的實作;
槽點
- 這幾個關鍵字中,只有
this
要加$
符號且必須加,強迫症表示很難受; - 靜態成員函數中不能透過
$this->
調用非靜態成員函數,但是可以透過self::
調用,且在調用函數中未使用$this->
的情況下還能順暢運作。此行為似乎在不同PHP版本表現不同,在目前的7.3中ok; - 在靜態函數和非靜態函數中輸出
self
,猜猜結果是什麼?都是string(4) "self"
,迷之輸出; -
return $this instanceof static::class;
會有語法錯誤,但是以下兩種寫法就正常:
$class = static::class;
return $this instanceof $class;
// 或者這樣:
return $this instanceof static;
#【相關推薦:laravel影片教學】
以上是laravel中self的用法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

laravelbladeenhancesfrontendtemplatinginflatinginflationll-stackprojectsbyferingCleanSyntaxandaxandpoperfelfulfeatures.1)itallowsforeasyvariableasyvariabledisplayandControlstructures.2)bladesuportsuportsuportscreatingingingingingingingingingingangingandredreingscomponents components components components,aidinginmanagingcomplexuis.3)

laravelisidealforll-stackapplicationsduetoitselegantsyntax,complastissionecosystem和perperatedfulfeatures.1)useeloquentormforintuivelbackenddatamanipulation,butavoidn 1queryissues.2)

forremotework,iusezoomforvideOcalls,Slackformessing,trelloforprojectmanagement,and giThubForCodeCollaboration.1)Zoomisreliable forlailible forlargemeetingsbuthastimelimitsonthefreeversion.2)

remoteaccessandscreensharingworkbyestablishingasecure,real-timeconnectionbetweencomputerssusterprotococolslikerdp,vnc,orproprietarysoltions.bestpracticessinclude:1)構建thrustthroustthroustthroustthroudthrouftthroughclearcommunication,2)2)SeneruringSecuringSecurityWithStrongentStrongentStrongentStrongentscorneptermeptimptermeptimplemptymentponempts和Dat

絕對值得考慮升級到最新的Laravel版本。 1)新功能和改進,如匿名遷移,提升了開發效率和代碼質量。 2)安全性提升,修復了已知漏洞。 3)社區支持增強,提供了更多資源。 4)需評估兼容性,確保平穩升級。

在Laravel中集成Sentry和Bugsnag可以提高應用的穩定性和性能。 1.在composer.json中添加SentrySDK。 2.在config/app.php中添加Sentry服務提供者。 3.在.env文件中配置SentryDSN。 4.在App\Exceptions\Handler.php中添加Sentry錯誤報告。 5.使用Sentry捕獲並報告異常,並添加額外上下文信息。 6.在App\Exceptions\Handler.php中添加Bugsnag錯誤報告。 7.使用Bugsnag監

Laravel依然是PHP开发者的首选框架,因为它在开发体验、社区支持和生态系统上表现卓越。1)其优雅的语法和丰富的功能集,如EloquentORM和Blade模板引擎,提升了开发效率和代码可读性。2)庞大的社区提供了丰富的资源和支持。3)尽管学习曲线较陡且可能导致项目复杂性增加,但通过合理配置和优化,Laravel能显著提升应用性能。

在Laravel中構建實時聊天應用需要使用WebSocket和Pusher。具體步驟包括:1)在.env文件中配置Pusher信息;2)設置broadcasting.php文件中的廣播驅動為Pusher;3)使用LaravelEcho訂閱Pusher頻道並監聽事件;4)通過PusherAPI發送消息;5)實現私有頻道和用戶認證;6)進行性能優化和調試。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3漢化版
中文版,非常好用

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)