av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

PHP程序員:你過來,給我說說$this,self,static有什么區(qū)別?

引言

港閘網(wǎng)站建設公司創(chuàng)新互聯(lián)公司,港閘網(wǎng)站設計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為港閘近千家提供企業(yè)網(wǎng)站建設服務。企業(yè)網(wǎng)站搭建\外貿營銷網(wǎng)站建設要多少錢,請找那個售后服務好的港閘做網(wǎng)站的公司定做!

我們每天都在敲代碼,對著各種各樣的類與繼承。面向對象的編程設計方式,裹挾著PHP程序員加入 OOP 大軍。

但是歷史包袱太重,導致PHP的函數(shù)工具庫的印象,那樣的深刻。而諸如 Zend Symfony Laravel 框架出現(xiàn),參與開發(fā)的人數(shù)眾多,設計模式非常巧妙,讓很多優(yōu)秀的開發(fā)者把精力投入到 PHP 的 OOP 化。

那么問題來了,你寫了這么多的 PHP 代碼,搞得清楚 self 和 $this 的區(qū)別嗎?本文就來簡要說一說。

學習時間

簡單地說,

 
 
 
  1. $this 指向當前的對象實例,self 指向當前類。

換句話說:

 
 
 
  1. $this->member 調用非靜態(tài)屬性/方法,self::number 調用靜態(tài)屬性/方法。

舉個栗子,比較直觀,說概念總是那么枯燥。

上面這個例子很明確地使用了靜態(tài)屬性,和動態(tài)屬性,在構造函數(shù)內調用。實例化時執(zhí)行。

如果反過來用就出錯了,比如使用:

 
 
 
  1. self::$non_static_member . ' ' . $this->static_member;

self 調用了非靜態(tài)屬性,而 $this 調用了靜態(tài)屬性,這是錯誤的用法。

下面使用含有 $this 對象屬性/方法調用重載了的函數(shù)方法,演示類的多態(tài)性:

上述文件執(zhí)行后,返回值 Y::foo()。$this 作為實例化的 Y 對象,直接訪問了其動態(tài)方法 foo()。而繼承的 X 類的 foo() 方法被重寫,并不執(zhí)行。

現(xiàn)在換一種寫法。

這次類 X 的 bar 方法我們使用 self::foo() 調用。那么很顯然,self 就是 class X 本身,那么調用的也自然是 X 的 foo 方法。上述程序輸出 X::foo()。

引申:盡量別用 self::,要用 static::

self 簡單好用,但是作用域叫人惱火。因為它的作用域是在定義時的,而不是執(zhí)行時的。比如這么個例子:

如果調用 Person::status(),返回 'Person is alive'?,F(xiàn)在新建類,并繼承該類:

執(zhí)行 Deceased::status(),你期望得到什么,肯定是 Decased 類的 getStatus() 返回的值對么?可是結果返回了 Person::status() 的值。這是因為 status 方法被調用時,使用了 self::getStatus(),訪問的是 Person 類的 getStatus() 方法。這是由 self 作用域決定的。

怎么才能返回期望的值?使用 static 替換 self。

還是那個規(guī)則:$this 引用的是當前的類的實例,static 引用的是當前的類本身。

我們從優(yōu)秀的代碼中學習用法。下面是 Laravel ValidationData 類內的一個靜態(tài)方法。

寫在最后

本文通過幾個簡單的小栗子,說明了 $this self static 之間的微妙差別,以及作用區(qū)間。希望大家在設計類的時候,能夠謹慎地選用。


分享文章:PHP程序員:你過來,給我說說$this,self,static有什么區(qū)別?
標題來源:http://uogjgqi.cn/article/dpechjh.html
掃二維碼與項目經(jīng)理溝通

我們在微信上24小時期待你的聲音

解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流