成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發(fā) 后端
我們每天都在敲代碼,對著各種各樣的類與繼承。面向?qū)ο蟮木幊淘O(shè)計(jì)方式,裹挾著PHP程序員加入 OOP 大軍。

引言

我們每天都在敲代碼,對著各種各樣的類與繼承。面向?qū)ο蟮木幊淘O(shè)計(jì)方式,裹挾著PHP程序員加入 OOP 大軍。

 

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

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

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

學(xué)習(xí)時(shí)間

簡單地說,

  1. $this 指向當(dāng)前的對象實(shí)例,self 指向當(dāng)前類。 

換句話說:

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

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

 

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

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

如果反過來用就出錯(cuò)了,比如使用:

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

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

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

 

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

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

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

 

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

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

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

self 簡單好用,但是作用域叫人惱火。因?yàn)樗淖饔糜蚴窃诙x時(shí)的,而不是執(zhí)行時(shí)的。比如這么個(gè)例子:

 

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

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

 

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

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

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

還是那個(gè)規(guī)則:$this 引用的是當(dāng)前的類的實(shí)例,static 引用的是當(dāng)前的類本身。

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

 

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

寫在最后

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

責(zé)任編輯:未麗燕 來源: 今日頭條
相關(guān)推薦

2018-10-23 09:13:24

程序員學(xué)歷求職者

2023-12-13 13:31:00

useEffect對象瀏覽器

2013-04-15 10:55:09

程序員

2009-01-08 09:04:18

2009-11-19 10:21:02

2009-05-21 15:58:12

程序員工作經(jīng)驗(yàn)職場

2021-08-13 07:56:13

Git pullGit fetch倉庫里

2015-04-10 19:37:34

程序員

2019-03-20 09:59:40

硅谷程序員失業(yè)

2012-11-22 14:00:26

程序員

2017-11-14 21:30:15

2010-10-09 09:20:08

.NET

2017-09-04 13:02:00

程序員

2024-05-27 00:00:00

localhostIPv6IPv4

2022-06-08 07:34:25

InnoDBdeleteMySQL

2024-03-05 18:19:07

localhostLinux數(shù)據(jù)庫

2016-01-07 15:03:20

2021-03-12 08:28:07

百度程序員業(yè)務(wù)

2009-05-26 09:00:59

ScalaJava面向?qū)ο?/a>

2021-08-28 23:26:14

程序員編碼電腦
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日韩一级黄色片 | 久久国产精品免费一区二区三区 | 国产一区二区三区久久久久久久久 | 欧美不卡网站 | 国产精品成人一区二区三区吃奶 | 国产福利小视频 | 在线免费观看黄a | 国产精品a久久久久 | 国产成人叼嘿视频在线观看 | 久久99精品久久久久蜜桃tv | 久久新视频 | 九九亚洲 | 欧美色综合天天久久综合精品 | 日韩在线精品 | 欧美日韩不卡 | 欧美日韩一 | 欧美精品video | 国产资源在线播放 | 午夜99| 伊人网99| 日韩区 | 涩爱av一区二区三区 | 成人午夜性成交 | 九九综合| 欧美一级久久 | 国产精品美女久久久久久免费 | 欧美多人在线 | 欧美国产日韩在线观看 | 久久精品国产精品青草 | 中文字幕一级毛片视频 | 欧美日韩综合 | 亚洲日韩中文字幕一区 | 亚洲av毛片 | 欧美日韩一区二区三区在线观看 | 成人一区精品 | 日本精品一区二区三区在线观看视频 | 97精品国产97久久久久久免费 | 国产一区二区三区视频 | 成人在线视频看看 | 99re在线播放| 久久综合成人精品亚洲另类欧美 |