在傳統(tǒng)上,面向?qū)ο蟮木幊袒陬惡蛯?duì)象的概念,這些類和對(duì)象繼承自其他類和對(duì)象。您可以從一個(gè)抽象概念開(kāi)始了解這些,然后逐漸了解具有子類的次級(jí)類,獲得更具體的細(xì)節(jié)。如果您需要在對(duì)象之間使用一個(gè)一致的 API,那么您還應(yīng)該了解接口的概念;在那里,您可以定義對(duì)象需要實(shí)現(xiàn)的方法。但是,如果不僅想要聲明 哪些方法必須存在,還想在同一時(shí)間提供自己的實(shí)現(xiàn),該怎么做?讓我們來(lái)了解一下特征(traits)。
特征(PHP 5.4 中添加的特性)是一個(gè)適用于水平代碼重用(而繼承是垂直代碼重用)的工具。在其他語(yǔ)言中,該特性有時(shí)被稱為混合(mixin)。這個(gè)概念在兩種情況下都很簡(jiǎn)單。特征或混合是開(kāi)發(fā)任意數(shù)量的方法的一種方式。也許您有一些常用方法來(lái)過(guò)濾和操作一些對(duì)象將會(huì)分享的數(shù)據(jù)或業(yè)務(wù)邏輯。您可以將它們保存在一個(gè)特征中,然后在您可能希望使用的任何類中重用它們。
下面顯示了一個(gè)簡(jiǎn)化的示例,該示例提供了一個(gè)日志記錄方法,任何類都可以使用該方法作為記錄事件的統(tǒng)一方法
<?php
trait logging {
private static $LOG_ERROR = 100;
private static $LOG_WARNING = 50;
private static $LOG_NOTICE = 10;
protected $log_location = 'output.log';
protected function log($level, $msg) {
$output = [];
$output[] = "Class: ".__CLASS__.' | ';
$output[] = "Level: {$level} | ";
$output = array_merge($output, (array)$msg, ["\n"]);
file_put_contents($this->log_location, $output, FILE_APPEND);
}
}
class User {
use logging;
public function __construct() {
$this->log(self::$LOG_NOTICE, 'New User Created');
}
}
class DB {
use logging;
private $db = 'localhost:8080';
public function connect() {
// ... attempt to connect and fail:
$this->log(self::$LOG_ERROR, ['Connection Failed-', $this->db]);
}
}