Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:缺点就是让代码的复杂度提高了, 但凡事没有二全其美的
trait Trait1
{
/* 同名属性没办法处理 */
// public static $prop1 = 'prop_of_trait1';
public static function func1()
{
return sprintf('%s中定义的%s方法', __TRAIT__, __METHOD__);
}
}
trait Trait2
{
// public static $prop1 = 'prop_of_trait2';
public static function func1()
{
return sprintf('%s中定义的%s方法', __TRAIT__, __METHOD__);
}
}
class Demo1
{
use Trait1, Trait2 {
// 使用Trait1::func1()方法覆盖Trait2中的同名方法
Trait1::func1 insteadof Trait2;
// 给Trait1::func2()起别名
Trait2::func1 as public t2_func1;
}
}
echobr(Demo1::func1());
echobr(Demo1::t2_func1());
/*
result:
Trait1中定义的Trait1::func1方法
Trait2中定义的Trait2::func1方法
*/
as
关键字
trait Trait3
{
public static function func1()
{
return sprintf('%s中定义的%s方法', __TRAIT__, __METHOD__);
}
}
class Demo2
{
use Trait3 {
Trait3::func1 as private tfunc1;
}
public static function func1()
{
// 内部方法可以访问私有方法tfun1
return self::tfunc1();
}
}
echobr(Demo2::func1());
// 外部访问已被改变为私有的成员方法tfunc1, 将会报错
echobr(Demo2::tfunc1());
/*
result:
Trait3中定义的Trait3::func1方法
Fatal error: Uncaught Error: Call to private method Demo2::tfunc1() from context '' in D:\phpstudy_pro\WWW\php11\PHP\0430\homework.php:73 Stack trace: #0 {main} thrown in D:\phpstudy_pro\WWW\php11\PHP\0430\homework.php on line 73
*/
想不出来…
// 数据库操作接口
interface IDbOpera
{
public function getData($id = null);
public function addData($data);
public function saveData($id, $data);
public function deleteData($id);
}
// 模拟员工信息表的数据库操作, 实现IDbOpera接口的抽象方法
trait TDbOpera
{
private $datas = [
['id' => 1, 'name' => '张三', 'sex' => 'male', 'age' => 25, 'salary' => 9999],
['id' => 2, 'name' => '李四', 'sex' => 'female', 'age' => 30, 'salary' => 8888],
['id' => 3, 'name' => '王五', 'sex' => 'male', 'age' => 35, 'salary' => 7777],
['id' => 4, 'name' => '赵六', 'sex' => 'male', 'age' => 40, 'salary' => 11111],
['id' => 5, 'name' => '钱七', 'sex' => 'female', 'age' => 45, 'salary' => 9797],
['id' => 6, 'name' => '吴八', 'sex' => 'male', 'age' => 28, 'salary' => 7979],
['id' => 7, 'name' => '陈九', 'sex' => 'male', 'age' => 37, 'salary' => 8866],
];
public function getData($id = null)
{
if ($id) {
return $this->datas[$id];
}
return $this->datas;
}
public function addData($data)
{
array_push($this->datas, $data);
$keys = array_keys($this->datas);
$key = end($keys);
$this->datas[$key]['id'] = $key + 1;
}
public function saveData($id, $data)
{
$this->datas[$id - 1] = $data;
}
public function deleteData($id)
{
unset($this->datas[$id - 1]);
}
}
// 抽象类定义员工管理的操作
abstract class AbstractEmployeeManage implements IDbOpera
{
use TDbOpera;
// 雇佣新员工
abstract function addEmployee($employee);
// 解雇
abstract function fireEmployee($id);
// 获取员工
abstract function getEmployee($id = null);
// 修改员工信息
abstract function updateEmployee($id, $employee);
}
// 员工管理实现类
class EmployeeManage extends AbstractEmployeeManage
{
// 雇佣新员工
function addEmployee($employee)
{
$this->addData($employee);
echobr('新员工新增成功');
}
// 解雇
function fireEmployee($id)
{
$this->deleteData($id);
echobr('该员工已成功解雇');
}
// 获取员工
function getEmployee($id = null)
{
return $this->getData($id);
}
// 修改员工信息
function updateEmployee($id, $employee)
{
$this->saveData($id, $employee);
echobr('员工信息修改成功');
}
function showEmployee($employee)
{
if (!isset($employee['id'])) {
foreach ($employee as $emp) {
// printfpre($emp);
$sex = ($emp['sex'] === 'male') ? '男' : '女';
echobr("id: {$emp['id']}, 姓名: {$emp['name']}, 性别: {$sex}, 年龄: {$emp['age']}, 月薪: {$emp['salary']}.");
}
} else {
$sex = $emp['sex'] === 'male' ? '男' : '女';
echobr("id: {$employee['id']}, 姓名: {$employee['name']}, 性别: {$sex}, 年龄: {$employee['age']}, 月薪: {$employee['salary']}.");
}
}
}
// 客户端调用
$employeeManage = new EmployeeManage;
$newEmployee = ['name' => '小明', 'sex' => 'female', 'age' => 23, 'salary' => 5000];
/* 新增员工 */
$employeeManage->addEmployee($newEmployee);
/*
result: 新员工新增成功
*/
echobr();
/* 获取所有员工信息 */
echobr('员工信息列表');
$employeeManage->showEmployee($employeeManage->getEmployee());
/*
result:
员工信息列表
id: 1, 姓名: 张三, 性别: 男, 年龄: 25, 月薪: 9999.
id: 2, 姓名: 李四, 性别: 女, 年龄: 30, 月薪: 8888.
id: 3, 姓名: 王五, 性别: 男, 年龄: 35, 月薪: 7777.
id: 4, 姓名: 赵六, 性别: 男, 年龄: 40, 月薪: 11111.
id: 5, 姓名: 钱七, 性别: 女, 年龄: 45, 月薪: 9797.
id: 6, 姓名: 吴八, 性别: 男, 年龄: 28, 月薪: 7979.
id: 7, 姓名: 陈九, 性别: 男, 年龄: 37, 月薪: 8866.
id: 8, 姓名: 小明, 性别: 女, 年龄: 23, 月薪: 5000.
*/
echobr();
/* 获取王五的信息 */
echobr('王五的员工信息');
$emp = $employeeManage->getEmployee(2);
$employeeManage->showEmployee($emp);
/*
result:
王五的员工信息
id: 3, 姓名: 王五, 性别: 女, 年龄: 35, 月薪: 7777.
*/
/* 王五涨工资了 */
$emp['salary'] = 8848;
$employeeManage->updateEmployee($emp['id'], $emp);
/*
result: 员工信息修改成功
*/
/* 钱七被解雇了 */
$employeeManage->fireEmployee(5);
echobr('员工信息表');
$employeeManage->showEmployee($employeeManage->getEmployee());
/*
result:
该员工已成功解雇
员工信息表
id: 1, 姓名: 张三, 性别: 男, 年龄: 25, 月薪: 9999.
id: 2, 姓名: 李四, 性别: 女, 年龄: 30, 月薪: 8888.
id: 3, 姓名: 王五, 性别: 男, 年龄: 35, 月薪: 8848.
id: 4, 姓名: 赵六, 性别: 男, 年龄: 40, 月薪: 11111.
id: 6, 姓名: 吴八, 性别: 男, 年龄: 28, 月薪: 7979.
id: 7, 姓名: 陈九, 性别: 男, 年龄: 37, 月薪: 8866.
id: 8, 姓名: 小明, 性别: 女, 年龄: 23, 月薪: 5000.
*/
insteadof
和as
关键字实现triat中同名方法均可使用.