2020-09-01

九月你好,又是一个艳阳天,今天的知识点还是很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,具体的我会在后面的实战项目中,尝试使用一下,希望能够使用到这些东西,完善自己的开发的思想和开发的本能,引出我们可以使用今天的关键来实现什么应用场景????

你可能感兴趣的:(2020-09-01)