批改状态:合格
老师批语:缺点就是让代码的复杂度提高了, 但凡事没有二全其美的
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(){// 内部方法可以访问私有方法tfun1return 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中同名方法均可使用.
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号