PHP实现了代码复用的一个方法,称为trait。
通常情况下,当我们需要在多个不同的类使用同一个方法的时候,继承是不错的解决方法。但是,在PHP中,每个类只能从单一的父类继承,这样的话,就不能设计一个比较通用的父类了。解决办法:可以使用trait,trait允许我们在不适用继承的情况下为一个类增加一个功能。
示例程序:
trait tDebug {
public function dumpObject() {
//获取类名
$class = get_class($this);
//获取属性
$attrs = get_object_vars($this);
//获取方法
$methods = get_class_methods($this);
echo "<h2>$class Object</h2>";
//打印属性
echo "<h3>Attributes</h3><ul>";
foreach ($attrs as $k => $v) {
echo "<li>$k: $v</li>";
}
echo "</ul>";
echo "<h3>Methods</h3><ul>";
foreach ($methods as $v) {
echo "<li>$v</li>";
}
echo "</ul>";
}
}
将其另存为:trait.php
class Rectangle {
use tDebug;
protected static $_count = 0;
protected $width;
protected $height;
function __construct($width, $height) {
$this->width = $width;
$this->height = $height;
self::$_count++;
echo "已成功创建".self::$_count."个Rectangle对象<br>";
}
function __destruct() {
echo "销毁一个Rectangle对象<br>";
}
function getArea() {
echo "Rectangle面积是:".($this->width * $this->height."<br>");
}
function getConunt() {
return self::$_count;
}
}
class Square extends Rectangle {
function __construct($side) {
$this->width = $side;
$this->height = $side;
parent::$_count++;
echo "已成功创建".parent::$_count."个Rectangle(Square)对象<br>";
}
}
将其另存为:rectangle.php
require('trait.php');
require('rectangle.php');
$r = new Rectangle(10,20);
$r->dumpObject();
将其另存为:test.php
以上我们创建了三个文件,其中trait.php创建了trait tDebug,其包含一个方法dumpObject()。在rectangle.php中创建了一个类Rectangle,该类中并没有定义dumpObject()方法,但是由于use tDebug,所以我们在对象中是可以使用该方法的。最后在test.php中把所有使用到的模块包含进来,由于在类中引用了trait,所以包含的顺序不能变,trait所在文件要先包含进来(其实我们也可以在rectangle.php中将trait.php包含进来,这样在主程序中只要引进rectangle.php即可)。看一下运行结果:
最后说两句:1、trait可以有抽象方法,但是它必需在任何使用该trait的类中实现该方法;2、如果在一个类中包含多个trait,使用逗号将其分隔开,形如use tTrait1,tTrait2;