php中的類不支援多繼承,但是提供了trait語法類解決單繼承沒法提供的多層**復用問題。
要點:1
trait 不能通過它自身來例項化,但可以在類中使用,也可以通過靜態呼叫使用trait中方法和屬性。
<?php
trait t }
class c }
$cls= new c();
$cls->t_method();
//通過類呼叫
$cls->c_method();
//靜態呼叫
t::t_method();
?>
輸出結果:
this is t_method
this is c_method
this is t_method
2 在類中使用trait,如果出現類的函式或屬性於trait的函式或屬性同名,就回會發生覆蓋---》當前類中的方法會覆蓋 trait 方法,而 trait 方法又覆蓋了當前類父類中的方法。
<?php
trait t
public function commonmethod()
}class base
public function commonmethod()
}class c extends base
}$cls=new c();
//trait方法覆蓋父類方法
$cls->samewithbase();
//當前類方法覆蓋trait方法
$cls->commonmethod();
輸出結果
this is trait's samewithbase()
this is class's commonmethod()
3 可以在同乙個類中使用多個trait,如果出現多個trait中有函式或屬性同名的情況,執行時就會報錯。有兩種方式解決,a方式:
需要使用 insteadof 操作符來明確指定使用衝突方法中的哪乙個 ,b方式:使用
as 操作符可以將其中乙個衝突的方法以另乙個名稱來引入。
<?php
trait t1
public function samename2()
}trait t2
public function samename2()
}class c
}$cls=new c();
$cls->samename1();
$cls->samename2();
$cls->rename();
$cls->rename1();
?>
輸出結果
this is t1's samename1()
this is t1's samename2()
this is t2's samename2()
this is t2's samename1()
4 在使用時可以修改的訪問屬性。
<?php
trait
helloworld
}// 修改 sayhello 的訪問控制
class
myclass1
}// 給方法乙個改變了訪問控制的別名
// 原版 sayhello 的訪問控制則沒有發生變化
class
myclass2
}?>
5 可以用trait來組合trait。
<?php
trait
hello
}trait
world
}trait
helloworld
class
myhelloworld
$o = new
myhelloworld
();$o
->
sayhello
();$o
->
sayworld
();?>
輸出結果
hello world!
6 trait中可以有屬性,靜態方法,抽象方法。
php trait學習筆記
php物件導向不支援多繼承,只支援單繼承。但是單繼承就有侷限性啊,於是就搞出了乙個trait。trait和類很像,但它不能繼承,不能例項化。定義trait與定義類一樣,const static public protected private abstract都可以用。而且,trait與trait之...
php trait 多繼承問題
php從以前到現在一直都是單繼承的語言,無法同時從兩個基類中繼承屬性和方法,為了解決這個問題,php 從5.4出了trait這個特性 優先順序 自身方法 trait的方法 繼承的方法 就是這樣子的。例 trait a trait b class user class vipuser extends ...
學習筆記 雜湊學習筆記
hash基本原理 hash就是乙個像函式一樣的東西,你放進去乙個值,它給你輸出來乙個值。輸出的值就是hash值。一般hash值會比原來的值更好儲存 更小 或比較。那字串hash就非常好理解了。就是把字串轉換成乙個整數的函式。而且要盡量做到使字串對應唯一的hash值。它的主要思路是選取恰當的進製,可以...