PHP:代码复用trait

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值