九月你好,又是一个艳阳天,今天的知识点还是很EASY的,但是万丈高楼平地起。
今天的知识点:父类方法的调用、trait的妙用、trait的冲突、trait的权限的控制
分类方法的调用
class GrandParents{
public function say(){
return '我有一个好儿子';
}
}
class Parents extends GrandParents {
public function say()
{
$str = '我有一个好爸爸,而且';
$str.=parent::say(); // TODO: Change the autogenerated stub
return $str;
}
}
$obj = new Parents();
echo $obj -> say();
我有一个好爸爸,而且我有一个好儿子
TRAIT的妙用,可以继承使用多个类的方法,很实用的一个方法,等我学完以后我会在实战项目中用到这里,实战项目目前还在想要去写一个什么玩意出来,不做多得阐述,这里的话就是两个类的方法都是可被Tools类调用使用。
trait Log{
public function save(){
return __METHOD__;
}
}
trait Comment{
public function user(){
return __METHOD__;
}
}
class Tools{
use Log,Comment;
}
$obj = new Tools();
echo $obj -> user();
trait的冲突,在我们说到冲突的时候,首先需要知道的是多重类继承的的优先级的东西
场景一
trait Log{
public function save(){
return __METHOD__;
}
}
trait Comment{
public function user(){
return __METHOD__;
}
}
class Tools{
use Log,Comment;
public function save(){
return __METHOD__;
}
}
$obj = new Tools();
echo $obj -> user();
Tools::save
由此可得,优先级一定是本类大于引用类
场景二
trait Log{
public function save(){
return __METHOD__;
}
}
trait Comment{
public function user(){
return __METHOD__;
}
}
class Site{
public function save(){
return __METHOD__;
}
}
class Tools extends Site{
use Log,Comment;
public function save(){
return __METHOD__;
}
}
$obj = new Tools();
echo $obj -> save();
Tools::save
由此可得,优先级还是本类大于引用类和继承类的方法
场景三
trait Log{
public function save(){
return __METHOD__;
}
}
trait Comment{
public function user(){
return __METHOD__;
}
}
class Site{
public function save(){
return __METHOD__;
}
}
class Tools extends Site{
use Log,Comment;
}
$obj = new Tools();
echo $obj -> save();
Log::save
总结得出:在我们优先级的问题中,从基类继承的成员会被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。
优先级知道了,那么冲突走一波?
冲突重现
trait Log{
public function save(){
return __METHOD__;
}
public function save(){
return __METHOD__;
}
}
trait Comment{
public function user(){
return __METHOD__;
}
}
class Site{
public function save(){
return __METHOD__;
}
}
class Tools extends Site{
use Log,Comment;
}
$obj = new Tools();
echo $obj -> save();
Fatal error: Trait method save has not been applied, because there are collisions with other trait methods on Tools in E:\phpstudy_pro\WWW\www.studay.com\TraitUser.php on line 83
致命错误:无法在E:\phpstudy_pro\WWW中重新声明Log::save()\www.studay.com网站\TraitUser.php61号线
那岂不是卧槽了,如果是两个人写的类 都要去改名字,岂不是要炸,PHP程序员都说是腿绑着炸药包的人,尤其是像我这种卧蹬几百斤的人,对吧,然后就会有中和的方法来实现 as 这个词语可出来了嘿
trait Log{
public function save(){
return __METHOD__;
}
}
trait Comment{
public function user(){
return __METHOD__;
}
public function save(){
return __METHOD__;
}
}
class Site{
public function save(){
return __METHOD__;
}
}
class Tools extends Site{
use Log,Comment{
Log::save insteadof Comment;
}
}
$obj = new Tools();
echo $obj -> save();
Log::save
可以看出来,我使用了insteadof做了一个替换,这也是最常见的方法。
那如果出现另外一种情况,冲突的只是方法名,但是逻辑我得用呀,这就要用到我们的as关键词啦
trait Log{
public function save(){
return __METHOD__;
}
}
trait Comment{
public function user(){
return __METHOD__;
}
public function save(){
return __METHOD__;
}
}
class Site{
public function save(){
return __METHOD__;
}
}
class Tools extends Site{
use Log,Comment{
Log::save insteadof Comment;
Comment::save as saveRe;
}
}
$obj = new Tools();
echo $obj -> saveRe();
Comment::save
那我们不难看出我们有可以使用Comment的save方法啦
trait的权限的控制
引言:权限修饰,这个需要根据实际的场景去,才能被很好的利用,现在我们就先写一个DEMO玩玩
trait Log{
public function save(){
return __METHOD__;
}
}
trait Comment{
public function user(){
return __METHOD__;
}
public function save(){
return __METHOD__;
}
}
class Site{
public function save(){
return __METHOD__;
}
}
class Tools extends Site{
use Log,Comment{
Log::save insteadof Comment;
Log::save as protected;
Comment::save as protected saveRe;
}
}
$obj = new Tools();
echo $obj -> save();
echo $obj -> saveRe();
Fatal error: Access level to Log::save() must be public (as in class Site) in E:\phpstudy_pro\WWW\www.studay.com\TraitUser.php on line 83
总结:父类方法的使用、trait的妙用、trait的冲突、trait的权限的控制 上述阐述也学习的是基础的使用,和他本身的调用的方式的DEMO,具体的我会在后面的实战项目中,尝试使用一下,希望能够使用到这些东西,完善自己的开发的思想和开发的本能,引出我们可以使用今天的关键来实现什么应用场景????