PHP中的trait是什么
自PHP5.4.0起,PHP實(shí)現(xiàn)了一種代碼復(fù)用的方法,稱(chēng)為T(mén)rait。因?yàn)镻HP是單繼承,當(dāng)你需要多個(gè)區(qū)別的特性,就不得不去組合多個(gè)基類(lèi),Trait出現(xiàn)后就避免了這些問(wèn)題,Trait的優(yōu)勢(shì)就是可以隨意組合。以下是小編為大家搜索整理的PHP中的trait是什么,希望能給大家?guī)?lái)幫助!
trait
trait 是在一些類(lèi)(Class)的應(yīng)該具備的特定的屬性或方法,而同父級(jí)的另外一些類(lèi)應(yīng)該避免包含這些屬性和方法情況下使用的.
當(dāng)然, 這也和開(kāi)發(fā)者對(duì)類(lèi)的抽象能力有關(guān), 有些抽象能力好的, 可以減少對(duì) trait 的使用 但是這種情況應(yīng)該是無(wú)法避免的 不然 trait 出現(xiàn)就毫無(wú)意義了.
還有一種情況, 就是使用 trait 的時(shí)候, 可以起到的約束開(kāi)發(fā)者的作用, 提醒開(kāi)發(fā)者注意需要在開(kāi)發(fā)的過(guò)程中調(diào)用 trait 的某些屬性和方法.
同事則提出了一個(gè)好問(wèn)題, 接口(interface) 不也是這個(gè)作用么?
不急, 讓我們先看個(gè)例子:
比如你要收集網(wǎng)站上各類(lèi)數(shù)據(jù), 開(kāi)發(fā)了 Spider 類(lèi). Spider 有個(gè)方法叫 request() 負(fù)責(zé)請(qǐng)求.
但是采集數(shù)據(jù)的過(guò)程中, 有些網(wǎng)站對(duì)蜘蛛敏感有些則不. 對(duì)于敏感的網(wǎng)站, 我們給出了一個(gè)使用代理的解決方案. 但是使用代理是會(huì)影響抓取速度的. 這就產(chǎn)生了 Spider 的子類(lèi)有些需要用代理, 而能不用代理則盡量不用的情況.
于是這個(gè)時(shí)候我們新增了一個(gè) trait Proxy:
isProxy = true; return $this; } public function request($url) { if (!$this->isProxy) { throw new Exception("Please using proxy."); } /pic/p>
trait 重寫(xiě)了 Spider 的 request() 方法, 限定了在沒(méi)有調(diào)用代理的情況下調(diào)用會(huì)拋出異常.
回到之前的問(wèn)題, trait 這樣的用法和 接口(interface) 有什么區(qū)別?
接口的約束是前置的是定義初始就必須實(shí)現(xiàn)的, 他可以約束方法的實(shí)現(xiàn)卻無(wú)法約束方法的調(diào)用, trait 是一種后置的調(diào)用, 他已經(jīng)實(shí)現(xiàn)了方法, 關(guān)鍵的是, 他只對(duì)調(diào)用了自身的類(lèi)產(chǎn)生約束(廢話(huà)一句), 而對(duì)沒(méi)有調(diào)用自身的類(lèi)不產(chǎn)生影響(再一句廢話(huà)), 同時(shí)他是可復(fù)用的, 而且沒(méi)有破壞 Spider 類(lèi)自身的實(shí)現(xiàn)增加, Spider 還是那個(gè) Spider.
我想 trait 的用法再這里已經(jīng)很有效了吧.
后話(huà)
有人可能決定 另外實(shí)現(xiàn)一個(gè) request 比如叫, proxyRequst 不就完了么? 你說(shuō)的好有道理…然是如果我使用了不一樣的 代理具體對(duì)請(qǐng)求上有細(xì)節(jié)差異怎么辦呢? 在代碼里不停的 if if if 么? trait 如此清爽的方案 為何要放棄呢?
拓展:PHP發(fā)展歷程
PHP是一個(gè)擁有眾多開(kāi)發(fā)者的開(kāi)源軟件項(xiàng)目,最開(kāi)始是Personal Home Page的縮寫(xiě),已經(jīng)正式更名為 "PHP: Hypertext Preprocessor"。PHP是在1994年由RasmusLerdorf創(chuàng)建的,最初只是一個(gè)簡(jiǎn)單的用Perl語(yǔ)言編寫(xiě)的統(tǒng)計(jì)他自己網(wǎng)站訪(fǎng)問(wèn)者數(shù)量的程序。后來(lái)重新用C語(yǔ)言編寫(xiě),同時(shí)可以訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),1995年,PHP(Personal Home Page Tools)對(duì)外發(fā)表第一個(gè)版本PHP1。此后,越來(lái)越多的網(wǎng)站開(kāi)始使用PHP,并且強(qiáng)烈要求增加一些特性,如循環(huán)語(yǔ)句和數(shù)組變量等,1995年發(fā)布的PHP2加入了對(duì)mySQL的支持。
Andi Gutmans和Zeev Suraski在為一所大學(xué)的項(xiàng)目中開(kāi)發(fā)電子商務(wù)程序時(shí)發(fā)現(xiàn)PHP2功能明顯不足,于是他們重寫(xiě)了代碼發(fā)布了PHP3。PHP3是類(lèi)似于現(xiàn)代PHP語(yǔ)法結(jié)構(gòu)的第一個(gè)版本,PHP3的最強(qiáng)大的功能是它的可擴(kuò)展性,PHP3的新功能和廣泛的第三方數(shù)據(jù)庫(kù)、API的支持使得這樣程序的編寫(xiě)成為可能。
PHP3官方發(fā)布不久,Andi Gutmans和Zeev Suraski開(kāi)始重新編寫(xiě)PHP代碼。設(shè)計(jì)目標(biāo)是增強(qiáng)復(fù)雜程序運(yùn)行時(shí)的性能和PHP自身代碼的模塊性。經(jīng)過(guò)不懈努力Zend引擎研發(fā)成功并且實(shí)現(xiàn)了設(shè)計(jì)目標(biāo),并在1999年中期引入 PHP;谠撘娌⒔Y(jié)合了更多新功能的 PHP4于2000年5月正式發(fā)布。除了更高的性能以外,PHP4還包含一些關(guān)鍵功能,比如:支持更多的 web 服務(wù)器、HTTP Sessions 支持、輸出緩沖、更安全的用戶(hù)輸入和一些新的語(yǔ)言結(jié)構(gòu)。
PHP5于2004年7月正式發(fā)布,它的核心是Zend引擎2代(PHP7是Zend加強(qiáng)版3代),引入了新的對(duì)象模型和大量新功能,開(kāi)始支持面向?qū)ο缶幊。隨著PHP6經(jīng)歷長(zhǎng)時(shí)間的開(kāi)發(fā)流產(chǎn)后,PHP5發(fā)布了6個(gè)版本頑強(qiáng)的支撐著開(kāi)源社區(qū)的發(fā)展,直到2015-12-03那天迎來(lái)了PHP 7.0的發(fā)布,其實(shí)PHP5.6已經(jīng)包含了很多PHP6想實(shí)現(xiàn)的特性,它為PHP7的研發(fā)爭(zhēng)取了寶貴的時(shí)間。不負(fù)眾望PHP7.0對(duì)比PHP5.6性能整整提升了2倍,PHP7的成功發(fā)布讓很多核心開(kāi)發(fā)成員回歸到PHP社區(qū),并且在2020-11-26發(fā)布了PHP8。和php7系列相對(duì)比,PHP8對(duì)各種變量判斷和運(yùn)算采用更嚴(yán)格的驗(yàn)證判斷模式,這點(diǎn)有利后續(xù)版本對(duì)jit的性能優(yōu)化。
PHP語(yǔ)言作為一種高級(jí)語(yǔ)言,其特點(diǎn)是開(kāi)源, 在設(shè)計(jì)體系上屬于C語(yǔ)言體系,它可以讓很多接受過(guò)高等教育的初學(xué)者能很快接受并完成入門(mén)學(xué)習(xí),簡(jiǎn)單好上手容易找工作自然粉絲多。如果數(shù)據(jù)量大及訪(fǎng)問(wèn)壓力大,可以集成redis、mysql分表分區(qū)分庫(kù)、elasticsearch搜索引擎、消息隊(duì)列寫(xiě)保護(hù)和php系統(tǒng)分布式集群部署等技術(shù)方案,緩解數(shù)據(jù)存儲(chǔ)、服務(wù)訪(fǎng)問(wèn)和數(shù)據(jù)檢索帶來(lái)的巨大壓力。
無(wú)論是大中小型項(xiàng)目,PHP都是一個(gè)十分適合的高級(jí)編程語(yǔ)言,是否適合就看項(xiàng)目研發(fā)團(tuán)隊(duì)的對(duì)它的掌握程度。 但是對(duì)于較大的和更為復(fù)雜的項(xiàng)目,最常見(jiàn)的php-fpm編程模式就顯出它的薄弱了。針對(duì)PHP-fpm暴露出的一系列缺點(diǎn)問(wèn)題,最簡(jiǎn)單靠譜的方案就是及時(shí)升級(jí)兼容PHP的高版本,PHP7.0.0對(duì)比PHP5.6性能提升了2倍,另外PHP7.4提供的Preloading預(yù)加載機(jī)制實(shí)現(xiàn)了部分程序常駐內(nèi)存,獲取了不錯(cuò)的性能提升,在PHP8又提供了高效的JIT (Just-In-Time即時(shí)編譯)運(yùn)算支持。另外水平更高的開(kāi)發(fā)者可以轉(zhuǎn)向難度更高的php-cli編程,它能解決大部分的系統(tǒng)性能問(wèn)題,無(wú)論是PHP7和PHP8都支持這種模式的編程。
經(jīng)過(guò)二十多年的發(fā)展,隨著php-cli相關(guān)組件的快速發(fā)展和完善,PHP已經(jīng)可以應(yīng)用在TCP/UDP服務(wù)、高性能Web、WebSocket服務(wù)、物聯(lián)網(wǎng)、實(shí)時(shí)通訊、游戲、微服務(wù)等非 Web 領(lǐng)域的系統(tǒng)研發(fā)。
根據(jù)W3Techs2019年12月6號(hào)發(fā)布的統(tǒng)計(jì)數(shù)據(jù),PHP在WEB網(wǎng)站服務(wù)器端使用的編程語(yǔ)言所占份額高達(dá)78.9%。在內(nèi)容管理系統(tǒng)的網(wǎng)站中,有58.7%的網(wǎng)站使用WordPress(PHP開(kāi)發(fā)的CMS系統(tǒng)),這占所有網(wǎng)站的25.0%。
【PHP中的trait是什么】相關(guān)文章:
PHP中的Trait11-20
PHP中trait的使用方法12-26
PHP中trait的使用方法介紹01-15
PHP中trait使用方法介紹03-04
PHP中的Streams是什么07-30
PHP中的流是什么01-09
PHP中的流是什么呢10-28
PHP中MySql操作是什么02-09
PHP7.1中重大更新是什么01-11
- 相關(guān)推薦