用实例来了解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.com或baidu.com.
发表回复