PHP
PHP即“超文本預(yù)處理器”,是一種通用開(kāi)源腳本語(yǔ)言。PHP是在服務(wù)器端執(zhí)行的腳本語(yǔ)言,與C語(yǔ)言類(lèi)似,是常用的網(wǎng)站編程語(yǔ)言。根據(jù)動(dòng)態(tài)網(wǎng)站要求,PHP語(yǔ)言作為一種語(yǔ)言程序,其專(zhuān)用性逐漸在應(yīng)用過(guò)程中顯現(xiàn),其技術(shù)水平的優(yōu)劣與否將直接影響網(wǎng)站的運(yùn)行效率。其特點(diǎn)是具有公開(kāi)的源代碼, 在程序設(shè)計(jì)上與通用型語(yǔ)言,如C語(yǔ)言相似性較高,因此在操作過(guò)程中簡(jiǎn)單易懂,可操作性強(qiáng)。
繼承
單繼承:一個(gè)類(lèi)只能從一個(gè)上級(jí)類(lèi)繼承其特性信息。PHP和大多數(shù)面向?qū)ο蟮恼Z(yǔ)言都是單繼承模式
被繼承的類(lèi)稱(chēng)為父類(lèi),繼承了父類(lèi)的所有數(shù)據(jù)和操作的類(lèi)稱(chēng)為子類(lèi)。
php中的繼承語(yǔ)法:extends,繼承并不改變類(lèi)的結(jié)構(gòu)。而是表名了兩個(gè)類(lèi)之間存在著某種關(guān)系,使得其中的成員看起來(lái)像是在別的類(lèi)中存在。
在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,采用繼承的方式來(lái)組織設(shè)計(jì)系統(tǒng)中的類(lèi),可以提高程序的抽象程度,更接近人的思維方式,使程序結(jié)構(gòu)更清晰并降低編碼和維護(hù)的工作量。
PHP 僅支持單繼承,而多繼承是通過(guò)接口或者 Trait 來(lái)實(shí)現(xiàn)的。
PHP的單繼承示例
// 單繼承:一個(gè)子類(lèi)只能有一個(gè)父類(lèi) class A{ function show() { echo "A"; } } class B{ function show() { echo "B"; } } class C extends A{ } $c = new C; $c->show();
使用Trait解決PHP的單繼承
自 PHP 5.4.0 起,PHP 實(shí)現(xiàn)了一種代碼復(fù)用的方法,稱(chēng)為 trait。
Trait 是為類(lèi)似 PHP 的單繼承語(yǔ)言而準(zhǔn)備的一種代碼復(fù)用機(jī)制Trait 為了減少單繼承語(yǔ)言的限制,使開(kāi)發(fā)人員能夠自由地在不同層次結(jié)構(gòu)內(nèi)獨(dú)立的類(lèi)中復(fù)用 methodTrait 和 Class 組合的語(yǔ)義定義了一種減少?gòu)?fù)雜性的方式,避免傳統(tǒng)多繼承和 Mixin 類(lèi)相關(guān)典型問(wèn)題無(wú)法通過(guò) trait 自身來(lái)實(shí)例化
示例:
<?php trait Reader{ public function add($var1,$var2){ return $var1+$var2; } } trait writer { public function multiplication($var1,$var2){ return $var1*$var2; } } class File { use Reader; use writer; public function calculate($var1,$var2){ echo "Ressult of addition:".$this->add($var1,$var2) ."\n"; echo "Ressult of multiplication:".$this->multiplication($var1,$var2); } } $o = new File(); $o->calculate(5,3);
多個(gè)trait
通過(guò)逗號(hào)分隔,在 use 聲明列出多個(gè) trait,可以都插入到一個(gè)類(lèi)中。
<?php trait Hello { public function sayHello() { echo 'Hello '; } } trait World { public function sayWorld() { echo 'World'; } } class MyHelloWorld { use Hello, World; public function sayExclamationMark() { echo '!'; } } $o = new MyHelloWorld(); $o->sayHello(); $o->sayWorld(); $o->sayExclamationMark();
沖突的解決
如果兩個(gè) trait 都插入了一個(gè)同名的方法,如果沒(méi)有明確解決沖突將會(huì)產(chǎn)生一個(gè)致命錯(cuò)誤。
為了解決多個(gè) trait 在同一個(gè)類(lèi)中的命名沖突,需要使用 insteadof 操作符來(lái)明確指定使用沖突方法中的哪一個(gè)。
以上方式僅允許排除掉其它方法,as 操作符可以 為某個(gè)方法引入別名。 注意,as 操作符不會(huì)對(duì)方法進(jìn)行重命名,也不會(huì)影響其方法。
示例:
<?php trait A { public function smallTalk() { echo 'a'; } public function bigTalk() { echo 'A'; } } trait B { public function smallTalk() { echo 'b'; } public function bigTalk() { echo 'B'; } } class Talker { use A, B { B::smallTalk insteadof A; A::bigTalk insteadof B; } } class Aliased_Talker { use A, B { B::smallTalk insteadof A; A::bigTalk insteadof B; B::bigTalk as talk; } }
從trait 來(lái)組成trait
正如 class 能夠使用 trait 一樣,其它 trait 也能夠使用 trait。在 trait 定義時(shí)通過(guò)使用一個(gè)或多個(gè) trait,能夠組合其它 trait 中的部分或全部成員。
<?php trait Hello { public function sayHello() { echo 'Hello '; } } trait World { public function sayWorld() { echo 'World!'; } } trait HelloWorld { use Hello, World; } class MyHelloWorld { use HelloWorld; } $o = new MyHelloWorld(); $o->sayHello(); $o->sayWorld();
Trait的抽象成員
為了對(duì)使用的類(lèi)施加強(qiáng)制要求,trait 支持抽象方法的使用。
<?php trait Hello { public function sayHelloWorld() { echo 'Hello'.$this->getWorld(); } abstract public function getWorld(); } class MyHelloWorld { private $world; use Hello; public function getWorld() { return $this->world; } public function setWorld($val) { $this->world = $val; } }
Trait的靜態(tài)成員
Traits 可以被靜態(tài)成員靜態(tài)方法定義。
<?php<br>// 靜態(tài)成員 trait Counter { public function inc() { static $c = 0; $c = $c + 1; echo "$c\n"; } } class C1 { use Counter; } class C2 { use Counter; } $o = new C1(); $o->inc(); // echo 1 $p = new C2(); $p->inc(); // echo 1
<?php // 靜態(tài)方法 trait StaticExample { public static function doSomething() { return 'Doing something'; } } class Example { use StaticExample; } Example::doSomething();
<?php // 定義屬性 trait PropertiesTrait { public $x = 1; } class PropertiesExample { use PropertiesTrait; } $example = new PropertiesExample; $example->x;
以上就是PHP 使用 Trait 解決 PHP 單繼承問(wèn)題的實(shí)例詳解的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司其它相關(guān)文章!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
新聞標(biāo)題:PHP如何運(yùn)用Trait解決單繼承問(wèn)題-創(chuàng)新互聯(lián)
文章地址:http://www.chinadenli.net/article20/gsoco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、建站公司、全網(wǎng)營(yíng)銷(xiāo)推廣、網(wǎng)站策劃、軟件開(kāi)發(fā)、用戶體驗(yàn)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容