组合方式实现多重继承(表象模拟)
---采用的是类内部实现对象引用技术
class Student
{
private $name = '袭人';
public function getName() {
echo $this->name . "\n";
}
}
class Teacher
{
private $work_year = 3;
public function getWorkYear() {
echo $this->work_year . "\n";
}
}
class GraduateStudent extends Student
{
private $teacher;
public function __construct()
{
$this->teacher = new Teacher();
}
public function getWorkYear()
{
$this->teacher->getWorkYear();
}
}
$BaoChai = new GraduateStudent();
$BaoChai->getWorkYear();
接口方式实现多重继承(完全模拟)
---通过把类的特征抽象为接口,并通过实现接口的方式让对象有多重身份。
interface User
{
function getName();
}
interface Teacher
{
function getWorkYear();
}
class Student implements User
{
private $name = '晴雯';
public function getName()
{
echo "Student name is $this->name <br>";
}
}
/*class GraduateTeacher implements Teacher
{
private $work_year = 3;
public function getWorkYear()
{
echo "Teacher work year is $this->work_year <br>";
}
}*/
class GraduateStudent extends Student implements Teacher
{
/*private $teacher;
public function __construct()
{
$this->teacher = new GraduateTeacher();
}
public function getWorkYear()
{
$this->teacher->getWorkYear();
}
*/
private $work_year = 3;
public function getWorkYear()
{
echo "Teacher work year is $this->work_year <br>";
}
}
$BaoChai = new GraduateStudent();
$BaoChai->getName();
$BaoChai->getWorkYear();
class Test
{
//User是接口名
static function getName(User $student) {
$student->getName();
}
//Teacher是接口名
static function getWorkYear(Teacher $teacher) {
$teacher->getWorkYear();
}
}
echo '<hr>';
Test::getName($BaoChai);
Test::getWorkYear($BaoChai);
/*
* 结果:
Student name is 晴雯
Teacher work year is 3
-------------------------------------
Student name is 晴雯
Teacher work year is 3
*/