Correction status:qualified
Teacher's comments:trait只是提供了另一种选择罢了, 目前在开发过程 , 并未被足够重视,也未大量使用
第一个知识点 接口常量,接口常量和类常量类似,也是用const来定义,
第二个知识点 后期静态绑定(延迟静态绑定),绑定是在代码运行是发生的。静态继承的上下文环境中,调用子类重新的静态方法,使用关键词static代替self。
第三个知识点 命名空间的分级管理
第三个知识点 trait是为了解决子类只能继承一个父类单继承机制,在宿主类中引用trait类,使用use traitName就可以使用
作业一:写一个分级的命名空间, 并实现类的自动加载
<?php namespace __1010; spl_autoload_register(function($className){ $path=str_replace('\\',DIRECTORY_SEPARATOR,$className); $path=__DIR__.DIRECTORY_SEPARATOR.$path.'.php'; include $path; }); //类的别名使用use \__NAMESPACE__\className as Name 来定义,use默认是从根空间开始的,因此最前面的\可以省略。如果省略了Name,那么类的别名就是类名,as定义放置空间命名冲突 use config\inc\text1; use config\inc\text2; use config\demo1; use config\demo2; use inc\test1; use inc\test2 as test2; //测试结果,输出的都是类名下的text()方法,加载成功。 echo text1::text().'<br>'; echo text2::text().'<br>'; echo demo1::text().'<br>'; echo demo2::text().'<br>'; echo test1::text().'<br>'; echo test2::text();
点击 "运行实例" 按钮查看在线实例
作业二: 写一个trait类, 理解它的功能与使用场景
//创建一个返回姓名和年龄的trait类 trait info{ public $name; public $age; public function info(){ return '我名字是'.$this->name.',年龄是'.$this->age; } } //创建一个返回地址和电话的trait类 trait address{ public $address; public $phone; public function ainfo(){ return '我家住在'.$this->address.',我的电话是'.$this->phone; } } //创建类来继承方法,最后返回信息 class getInfo{ use info; use address; public function __construct($name,$age,$phone,$address) { $this->phone=$phone; $this->name=$name; $this->age=$age; $this->address=$address; } public function getInfo(){ return $this->info().$this->ainfo(); } } echo '<br>'; $info=new getInfo('小新',18,13598653541,'重庆市渝北区万寿山'); echo $info->getInfo();
点击 "运行实例" 按钮查看在线实例
Trait类是为了解决子类只能继承一个父类而生的,这样子类就可以继承多个trait类的属性和方法,更加灵活多变。