人的記憶力會隨著歲月的流逝而衰退,,寫作可以彌補記憶的不足,將曾經的人生經歷和感悟記錄下來,,也便于保存一份美好的回憶,。范文怎么寫才能發(fā)揮它最大的作用呢?以下是小編為大家收集的優(yōu)秀范文,,歡迎大家分享閱讀,。
php trait php中的文件包含函數(shù)有幾種篇一
php提供了一種全新的代碼復用的概念,那就是trait,。下面一起來看看!
現(xiàn)在有和這兩個類,。要在其中添加log功能,記錄類內部的動作,。有以下幾種方案:
繼承
多態(tài)
trait
如圖:
代碼結構如下:
//
class log {
public function startlog() {
// echo ...
}
public function endlog() {
// echo ...
}
}
//
class publish extends log {
}
//
class answer extends log {
}
可以看到繼承的確滿足了要求,。但這卻違背了面向對象的原則。而發(fā)布(publish)和回答(answer)這樣的操作和日志(log)之間的關系并不是子類與父類的關系,。所以不推薦這樣使用,。
如圖:
實現(xiàn)代碼:
//
interface log {
public function startlog();
public function endlog();
}
//
class publish implements log {
public function startlog() {
// todo: implement startlog() method.
}
public function endlog() {
// todo: implement endlog() method.
}
}
//
class answer implements log {
public function startlog() {
// todo: implement startlog() method.
}
public function endlog() {
// todo: implement endlog() method.
}
}
記錄日志的操作應該都是一樣的,因此,發(fā)布(publish)和回答(answer)動作中的日志記錄實現(xiàn)也是一樣的。很明顯,這違背了dry(don’t repeat yourself)原則,。所以是不推薦這樣實現(xiàn)的,。
如圖:
實現(xiàn)代碼如下:
//
trait log{
public function startlog() {
// echo ..
}
public function endlog() {
// echo ..
}
}
//
class publish {
use log;
}
$publish = new publish();
$publish->startlog();
$publish->endlog();
//
class answer {
use log;
}
$answer = new answer();
$answer->startlog();
$answer->endlog();
可以看到,我們在沒有增加代碼復雜的情況下,實現(xiàn)了代碼的復用,。
繼承的方式雖然也能解決問題,但其思路違背了面向對象的原則,顯得很粗暴;多態(tài)方式也可行,但不符合軟件開發(fā)中的dry原則,增加了維護成本。而trait方式則避免了上述的不足之處,相對優(yōu)雅的實現(xiàn)了代碼的復用,。
了解了trait的好處,我們還需要了解其實現(xiàn)中的規(guī)則,先來說一下作用域,。這個比較好證明,實現(xiàn)代碼如下:
class publish {
use log;
public function dopublish() {
$this->publicf();
$this->protectf();
$this->privatef();
}
}
$publish = new publish();
$publish->dopublish();
執(zhí)行上述代碼輸出結果如下:
public function
protected function
private function
可以發(fā)現(xiàn),trait的作用域在引用該trait類的內部是都可見的??梢岳斫鉃閡se關鍵字將trait的實現(xiàn)代碼copy了一份到引用該trait的類中,。
說到優(yōu)先級,就必須要有一個對比的參照物,這里的參照對象時引用trait的類及其父類。
通過以下的'代碼來證明trait應用中的屬性的優(yōu)先級:
trait log
{
public function publicf() {
echo __method__ . ' public function' . php_eol;
}
protected function protectf() {
echo __method__ . ' protected function' . php_eol;
}
}
class question {
public function publicf() {
echo __method__ . ' public function' . php_eol;
}
protected function protectf() {
echo __method__ . ' protected function' . php_eol;
}
}
class publish extends question {
use log;
public function publicf() {
echo __method__ . ' public function' . php_eol;
}
public function dopublish() {
$this->publicf();
$this->protectf();
}
}
$publish = new publish();
$publish->dopublish();
上述代碼的輸出結果如下:
publish::publicf public function
log::protectf protected function
通過上面的例子,可以總結出trait應用中的優(yōu)先級如下:
來自當前類的成員覆蓋了 trait 的方法
trait 覆蓋了被繼承的方法
類成員優(yōu)先級為:當前類>trait>父類
在一個類中,可以引用多個trait,如下:
trait log
{
public function startlog() {
echo __method__ . ' public function' . php_eol;
}
protected function endlog() {
echo __method__ . ' protected function' . php_eol;
}
}
trait check
{
public function parametercheck($parameters) {
// do sth
}
}
class publish extends question {
use log,check;
public function dopublish($para) {
$this->startlog();
$this->parametercheck($para);
$this->endlog();
}
}
通過上面的方式,我們可以在一個類中引用多個trait,。引用多個trait的時候,就容易出問題了,最常見的問題就是兩個trait中如果出現(xiàn)了同名的屬性或者方法該怎么辦呢?這個時候就需要用到insteadof 和 as 這兩個關鍵字了.請看如下實現(xiàn)代碼:
trait log
{
public function parametercheck($parameters) {
echo __method__ . ' parameter check' . $parameters . php_eol;
}
public function startlog() {
echo __method__ . ' public function' . php_eol;
}
}
trait check
{
public function parametercheck($parameters) {
echo __method__ . ' parameter check' . $parameters . php_eol;
}
public function startlog() {
echo __method__ . ' public function' . php_eol;
}
}
class publish {
use check, log {
check::parametercheck insteadof log;
log::startlog insteadof check;
check::startlog as csl;
}
public function dopublish() {
$this->startlog();
$this->parametercheck('params');
$this->csl();
}
}
$publish = new publish();
$publish->dopublish();
執(zhí)行上述代碼,輸出結果如下:
log::startlog public function
check::parametercheck parameter checkparams
check::startlog public function
就如字面意思一般,insteadof關鍵字用前者取代了后者,as 關鍵字給被取代的方法起了一個別名,。
在引用trait時,使用了use關鍵字,use關鍵字也用來引用命名空間。兩者的區(qū)別在于,引用trait時是在class內部使用的,。
s("content_relate");【php中的trait】相關文章:
php中trait的使用方法
08-25
php中trait的使用方法介紹
07-15
php中的表單處理
09-14
php中json應用
08-20
php中的streams是什么
09-30
php中的隨機性
10-10
session在php中的使用
10-03
php中switch語句的運用
09-16
php中while 循環(huán)的運用
08-27