在传统上,面向对象的编程基于类和对象的概念,这些类和对象继承自其他类和对象。您可以从一个抽象概念开始了解这些,然后逐渐了解具有子类的次级类,获得更具体的细节。如果您需要在对象之间使用一个一致的 API,那么您还应该了解接口的概念;在那里,您可以定义对象需要实现的方法。但是,如果不仅想要声明 哪些方法必须存在,还想在同一时间提供自己的实现,该怎么做?让我们来了解一下特征(traits)。
特征(PHP 5.4 中添加的特性)是一个适用于水平代码重用(而继承是垂直代码重用)的工具。在其他语言中,该特性有时被称为混合(mixin)。这个概念在两种情况下都很简单。特征或混合是开发任意数量的方法的一种方式。也许您有一些常用方法来过滤和操作一些对象将会分享的数据或业务逻辑。您可以将它们保存在一个特征中,然后在您可能希望使用的任何类中重用它们。
下面显示了一个简化的示例,该示例提供了一个日志记录方法,任何类都可以使用该方法作为记录事件的统一方法
<?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]);
}
}