自 PHP 5.4.0 起,PHP 實作了一種代碼復用的方法,稱為 Trait,
Trait 是為類似 PHP 的單繼承語言而準備的一種代碼復用機制,Trait 為了減少單繼承語言的限制,使開發人員能夠自由地在不同層次結構內獨立的類中復用 method,
trait看上去更像是為了代碼的復用而寫的一個小插件,它類似于include可以用use放在類中間,讓trait里面定義的方法作為class的一部分 本身不能直接實體化,Trait的作用域在參考該Trait類的內部是都可見的(public、private等等都可以) 可以理解為use關鍵字將Trait的實作代碼Copy了一份到參考該Trait的類中 ,
<?php trait ezcReflectionReturnInfo {
function getReturnType() { /*1*/ }
function getReturnDescription() { /*2*/ }
}
class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* ... */ }
class ezcReflectionFunction extends ReflectionFunction {
use ezcReflectionReturnInfo;
/* ... */ } ?>
優先級
從基類繼承的成員會被 trait 插入的成員所覆寫,優先順序是來自當前類的成員覆寫了 trait 的方法,而 trait 則覆寫了被繼承的方法,
<?php class Base {
public function sayHello() {
echo 'Hello ';
}
}
trait SayWorld {
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
class MyHelloWorld extends Base {
use SayWorld;
} $o = new MyHelloWorld(); $o->sayHello(); #輸出:Hello, World! ?>
<?php trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
}
class TheWorldIsNotEnough {
use HelloWorld;
public function sayHello() {
echo 'Hello Universe!';
}
} $o = new TheWorldIsNotEnough(); $o->sayHello(); #輸出:Hello Universe! ?>
多個 trait
通過逗號分隔,在 use 宣告列出多個 trait,可以都插入到一個類中,
<?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(); ?>
如果兩個 trait 都插入了一個同名的方法,如果沒有明確解決沖突將會產生一個致命錯誤,
參考地址:https://www.php.net/traits
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/67433.html
標籤:PHP
