首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

更新后的 PHP PHP 的新面孔(2)

更新后的 PHP PHP 的新面孔(2)

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




在 清单 5 中,第 2 行的开头处声明了                trait logging。请注意,这个特征包含一个方法,以及大量的属性(包括静态属性)。从表面看,该声明看起来类似于类的声明,但它使用了                trait 关键字。
进一步深入研究清单 5,将特征带到 User 和 DB 类中,我再次使用了                use 关键字。类定义的顶部的 use logging; 指令实质上将所有属性和方法从                logging 特征拉入了本地类中。现在,每个类都能直接访问所有日志工具,无需单独实现它们。特征内部使用的                __CLASS__ 变量成为了在此时使用该特征的类的名称,因而支持立即为类定制日志消息。
返回列表