最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP中的self關(guān)鍵字詳解

 更新時(shí)間:2019年06月23日 14:45:11   作者:tlanyan  
這篇文章主要給大家介紹了關(guān)于PHP中self關(guān)鍵字的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用PHP具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

PHP群里有人詢問(wèn)self關(guān)鍵字的用法,答案是比較明顯的:靜態(tài)成員函數(shù)內(nèi)不能用this調(diào)用非成員函數(shù),但可以用self調(diào)用靜態(tài)成員函數(shù)/變量/常量;其他成員函數(shù)可以用self調(diào)用靜態(tài)成員函數(shù)以及非靜態(tài)成員函數(shù)。隨著討論的深入,發(fā)現(xiàn)self并沒(méi)有那么簡(jiǎn)單。鑒于此,本文先對(duì)幾個(gè)關(guān)鍵字做對(duì)比和區(qū)分,再總結(jié)self的用法。

與parent、static以及this的區(qū)別

要想將徹底搞懂self,要與parent、static以及this區(qū)分開。以下分別做對(duì)比。

parent

self與parent的區(qū)分比較容易:parent引用父類/基類被隱蓋的方法(或變量),self則引用自身方法(或變量)。例如構(gòu)造函數(shù)中調(diào)用父類構(gòu)造函數(shù):

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常規(guī)用途是修飾函數(shù)或變量使其成為類函數(shù)和類變量,也可以修飾函數(shù)內(nèi)變量延長(zhǎng)其生命周期至整個(gè)應(yīng)用程序的生命周期。但是其與self關(guān)聯(lián)上是PHP 5.3以來(lái)引入的新用途:靜態(tài)延遲綁定。

有了static的靜態(tài)延遲綁定功能,可以在運(yùn)行時(shí)動(dòng)態(tài)確定歸屬的類。例如:

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();

程序輸出結(jié)果如下:

Base constructor!
Child constructor!
Base Foo!
Child Foo!
Child Foo!

在函數(shù)引用上,self與static的區(qū)別是:對(duì)于靜態(tài)成員函數(shù),self指向代碼當(dāng)前類,static指向調(diào)用類;對(duì)于非靜態(tài)成員函數(shù),self抑制多態(tài),指向當(dāng)前類的成員函數(shù),static等同于this,動(dòng)態(tài)指向調(diào)用類的函數(shù)。

parent、self、static三個(gè)關(guān)鍵字聯(lián)合在一起看挺有意思,分別指向父類、當(dāng)前類、子類,有點(diǎn)“過(guò)去、現(xiàn)在、未來(lái)”的味道。

this

self與this是被討論最多,也是最容易引起誤用的組合。兩者的主要區(qū)別如下:

  1. this不能用在靜態(tài)成員函數(shù)中,self可以;
  2. 對(duì)靜態(tài)成員函數(shù)/變量的訪問(wèn),建議 用self,不要用$this::或$this->的形式;
  3. 對(duì)非靜態(tài)成員變量的訪問(wèn),不能用self,只能用this;
  4. this要在對(duì)象已經(jīng)實(shí)例化的情況下使用,self沒(méi)有此限制;
  5. 在非靜態(tài)成員函數(shù)內(nèi)使用,self抑制多態(tài)行為,引用當(dāng)前類的函數(shù);而this引用調(diào)用類的重寫(override)函數(shù)(如果有的話)。

self的用途

看完與上述三個(gè)關(guān)鍵字的區(qū)別,self的用途是不是呼之即出?一句話總結(jié),那就是:self總是指向“當(dāng)前類(及類實(shí)例)”。詳細(xì)說(shuō)則是:

  1. 替代類名,引用當(dāng)前類的靜態(tài)成員變量和靜態(tài)函數(shù);
  2. 抑制多態(tài)行為,引用當(dāng)前類的函數(shù)而非子類中覆蓋的實(shí)現(xiàn);

槽點(diǎn)

  1. 這幾個(gè)關(guān)鍵字中,只有this要加$符號(hào)且必須加,強(qiáng)迫癥表示很難受;
  2. 靜態(tài)成員函數(shù)中不能通過(guò)$this->調(diào)用非靜態(tài)成員函數(shù),但是可以通過(guò)self::調(diào)用,且在調(diào)用函數(shù)中未使用$this->的情況下還能順暢運(yùn)行。此行為貌似在不同PHP版本中表現(xiàn)不同,在當(dāng)前的7.3中ok;
  3. 在靜態(tài)函數(shù)和非靜態(tài)函數(shù)中輸出self,猜猜結(jié)果是什么?都是string(4) "self",迷之輸出;
  4. return $this instanceof static::class;會(huì)有語(yǔ)法錯(cuò)誤,但是以下兩種寫法就正常:
$class = static::class;
return $this instanceof $class;
// 或者這樣:
return $this instanceof static;

所以這是為什么啊?!

參考

When to use self over $this?

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • php實(shí)現(xiàn)的中文分詞類完整實(shí)例

    php實(shí)現(xiàn)的中文分詞類完整實(shí)例

    這篇文章主要介紹了php實(shí)現(xiàn)的中文分詞類,結(jié)合完整實(shí)例形式分析了php基于字符串的遍歷、轉(zhuǎn)換、運(yùn)算等技巧實(shí)現(xiàn)中文分詞功能的具體方法,需要的朋友可以參考下
    2017-02-02
  • PHP獲取數(shù)據(jù)庫(kù)表中的數(shù)據(jù)插入新的表再原刪除數(shù)據(jù)方法

    PHP獲取數(shù)據(jù)庫(kù)表中的數(shù)據(jù)插入新的表再原刪除數(shù)據(jù)方法

    在本篇文章中我們給大家分享了關(guān)于PHP獲取要?jiǎng)h除數(shù)據(jù)庫(kù)表中的數(shù)據(jù)插入新的表再原刪除數(shù)據(jù)的詳細(xì)方法和相關(guān)代碼,需要的朋友們參考下。
    2018-10-10
  • php部分常見(jiàn)問(wèn)題總結(jié)

    php部分常見(jiàn)問(wèn)題總結(jié)

    php常見(jiàn)問(wèn)題解決集錦,主要包括php的運(yùn)行方法等小技巧
    2008-03-03
  • ThinkPHP6.0 重寫URL去掉Index.php的解決方法

    ThinkPHP6.0 重寫URL去掉Index.php的解決方法

    這篇文章主要介紹了ThinkPHP6.0 重寫URL去掉Index.php的解決方法,解決問(wèn)題最好多看看官方給的文檔,但有時(shí)候也不能全看官網(wǎng)文檔,可以結(jié)合官網(wǎng)下面的討論區(qū),借鑒各個(gè)大佬們的回答去解決問(wèn)題
    2021-01-01
  • windows中PHP5.2.14以及apache2.2.16安裝配置方法

    windows中PHP5.2.14以及apache2.2.16安裝配置方法

    windows中PHP5.2.14以及apache2.2.16安裝配置,需要配置php運(yùn)行環(huán)境的朋友可以參考下。
    2010-09-09
  • PHP使用自定義key實(shí)現(xiàn)對(duì)數(shù)據(jù)加密解密的方法

    PHP使用自定義key實(shí)現(xiàn)對(duì)數(shù)據(jù)加密解密的方法

    這篇文章主要介紹了PHP使用自定義key實(shí)現(xiàn)對(duì)數(shù)據(jù)加密解密的方法,涉及php針對(duì)字符串的轉(zhuǎn)換、截取等操作實(shí)現(xiàn)加密解密功能的相關(guān)技巧,需要的朋友可以參考下
    2017-12-12
  • 輕松實(shí)現(xiàn)php文件上傳功能

    輕松實(shí)現(xiàn)php文件上傳功能

    這篇文章主要教大家輕松實(shí)現(xiàn)php文件上傳功能,利用PHP可以把文件上傳到服務(wù)器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • PHP讀MYSQL中文亂碼的快速解決方法

    PHP讀MYSQL中文亂碼的快速解決方法

    下面小編就為大家?guī)?lái)一篇PHP讀MYSQL中文亂碼的快速解決方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10
  • PHP控制反轉(zhuǎn)(IOC)和依賴注入(DI)

    PHP控制反轉(zhuǎn)(IOC)和依賴注入(DI)

    本文主要介紹了PHP控制反轉(zhuǎn)(IOC)和依賴注入(DI)的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • 如何用PHP實(shí)現(xiàn)多線程編程

    如何用PHP實(shí)現(xiàn)多線程編程

    原以為 PHP 普遍都是單線程模型,并不適合多線程領(lǐng)域,發(fā)現(xiàn)PHP的多線程也頗有可取之處,用來(lái)解決某些問(wèn)題竟然非常適合。本文對(duì)比多進(jìn)程介紹了下多線程的優(yōu)勢(shì)和適用場(chǎng)景,提出了一種巧用方案,并使用PHP代碼實(shí)現(xiàn)了多線程的常見(jiàn)用法。
    2021-05-05

最新評(píng)論

青阳县| 静海县| 北宁市| 宜昌市| 广宁县| 兰溪市| 内丘县| 峨山| 吴川市| 沁源县| 湾仔区| 五寨县| 全椒县| 信阳市| 宜宾市| 乌兰浩特市| 丰城市| 永吉县| 玉龙| 秭归县| 临清市| 罗定市| 南溪县| 红河县| 崇仁县| 库尔勒市| 柘城县| 高要市| 武汉市| 大渡口区| 股票| 长春市| 盱眙县| 尉氏县| 富民县| 凤庆县| 敦化市| 合水县| 抚松县| 浦北县| 昌黎县|