批改状态:合格
老师批语:
- 实例演示类声明,类的实例化,类的静态成员与类的扩展;
- 描述trait功能,以及trait与父类的区别与联系,并实例演示trait 的冲突与优先级的解决方案
// 实例演示类声明,类的实例化,类的静态成员与类的扩展;// class 声明一个类class ParentClass{// 私有属性:当前类中使用private $id;// 受保护的属性:当前和扩展类中使用protected $slug;// 公开属性:外部可访问public $title;// 静态属性public static $num;// 构造方法public function __construct($id, $slug, $title, $num){$this->id = $id;$this->slug = $slug;$this->title = $title;// 静态成员赋值self::$num = $num;}// 公开方法public function show(){return sprintf('id=%d, slug=%s, title=%s, num=%d', $this->id, $this->slug, $this->title, self::$num);}}// 类的实例化$parentClass = new ParentClass(7, 'seven', 'title-seven', 77);// 访问公开属性// title-sevenecho $parentClass->title, '<br>';// 访问公开静态属性// 77echo ParentClass::$num, '<br>';// 访问公开方法// id=7, slug=seven, title=title-seven, num=77echo $parentClass->show(), '<br>';// 声明一个扩展类class SubClass extends ParentClass{// 子类私有属性private $child;// 子类构造方法public function __construct($id, $slug, $title, $num, $child){// 调用父类构造方法parent::__construct($id, $slug, $title, $num);// 设置私有属性$this->child = $child;}// 子类覆盖父类方法public function show(){// 调用父类方法和自己本身的私有方法return parent::show() . ', ' . $this->child();}// 子类自己的私有方法private function child() {return $this->child;}}// 扩展类实例化$subClass = new SubClass(10, 'ten', 'title-ten', 10, 'has a child');// id=10, slug=ten, title=title-ten, num=10, has a childecho $subClass->show(), '<br>';

trait 特征类,提供一组公共方法集,借用类的语法实现,特征类本身不能实例化。
父类,可以实例化。
trait 特征类,类使用 use 关键字,实现代码复用特征类中的方法。
父类,类使用 extends 扩展父类,实现代码复用父类中的方法。
类同时扩展父类,又使用 trait 特征类,同名方法优先级是:类自身中的方法 > trait 特征类 > 扩展的父类
// 描述trait功能,以及trait与父类的区别与联系,并实例演示trait 的冲突与优先级的解决方案// 描述trait功能,以及trait与父类的区别与联系// trait 特征类trait P1{public function hello(){return 'hello trait!';}}// 声明一个父类class P2{public function hello(){return 'hello parent!';}}// 声明一个类使用特征类方法class S1{// 使用 P1 特征类中方法use P1;// hello trait!function show(){return $this->hello();}}$s1 = new S1;// hello trait!echo $s1->show(), '<br>';// 声明一个扩展类使用父类方法class S2 extends P2{public function show(){// hello parent!return $this->hello();}}$s2 = new S2;// hello parent!echo $s2->show(), '<br>';// 声明一个类,扩展父类,又使用特征类class S3 extends P2{// 使用特征类中方法use P1;public function show(){// hello trait!return $this->hello();}}$s3 = new S3;// hello trait!echo $s3->show(), '<br>';// 实例演示trait 的冲突与优先级的解决方案trait T1 {public function t() {return 'Trait T1';}}trait T2 {public function t() {return 'Train T2';}}class S {use T1, T2 {// 优先级T1::t insteadof T2;// 别名T2::t as t2;}}// Trait T1echo (new S)->t(), '<br>';// Train T2echo (new S)->t2(), '<br>';

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号