php 用trait 解决单继承问题实例

用实例来了解php的trait,这个用起来很爽。

Trait的声明使用trait关键词,trait不能实例化,通过在其他类中使用use 关键字,声明要组合的Trait名称。爽快。

注意的几点:

  • 在trait中我们一般不加成员属性,只加成员方法
  • trait不能实例化
  • trait中的方法想让子类来使用,该方法必须是public
<?php
/**
 * 在php中通过trait解决单继承的问题实例
 *
 * @package Trait Test
 */

trait Hello_World {
	/**
	 * Method in trait.
	 *
	 * @return void
	 */
	public function say_hello() {
		echo 'Trait says: Hello!';
	}

	/**
	 * Method in trait.
	 *
	 * @return void
	 */
	public function sum( $a, $b ) {
		return $a + $b;
	}

	/**
	 * Method in trait.
	 *
	 * @return void
	 */
	public function product( $a, $b ) {
		return $a * $b;
	}

}

class User {
	/**
	 * Method in User Class.
	 *
	 * @return void
	 */
	public function say_name() {
		echo 'I am a Person.</br>';
	}
}

class Teacher extends User {
	use Hello_World;
	/**
	 * Construct.
	 */
	public function __construct() {

		echo 'From Teacher Class:<br>';

		$hello = Hello_World::say_hello();
		echo $hello;
		echo 'I am a Teacher.<br>';
		self::teach();

		$sum = Hello_World::sum( 1, 2 );
		echo '1 + 2 = ' . $sum . '</br>';

		$product = Hello_World::product( 3, 4 );
		echo '3 * 4 = ' . $product . '</br>';
	}
	/**
	 * Method in Teacher Class.
	 *
	 * @return void
	 */
	public function teach() {
		echo 'I Can Teach you.</br>';
	}
}

class Student extends User {
	use Hello_World;
	/**
	 * Construct.
	 */
	public function __construct() {

		echo 'From Student Class:<br>';

		$hello = Hello_World::say_hello();
		echo $hello;
		echo 'I am a Student.<br>';
		self::learn();

		$sum = Hello_World::sum( 1, 2 );
		echo '1 + 2 = ' . $sum . '</br>';

		$product = Hello_World::product( 3, 4 );
		echo '3 * 4 = ' . $product . '</br>';

	}

	/**
	 * Method in Teacher Class.
	 *
	 * @return void
	 */
	public function learn() {
		echo 'I Can Learn.</br>';
	}
}

$teacher = new Teacher();
echo '<br>---------------------</br>';
$student = new Student();

其实trait还有其他的用法和细节需要大家注意。

比如trait可以嵌套使用,多个trait还有相同方法时如何解决?trait的优先级等相关问题。本实例仅是一个简单的使用实例,便于理解这玩意是干什么用的。

更多的内容还请移步google.combaidu.com.


发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据