从PHP 5.4.0版本,PHP提供了一个新的代码复用,即概念特质。特质的字面意思的特点和
功能,我们可以理解,利用特征关键词可以添加新的功能的PHP类。
熟悉面向对象的知识,软件开发中常见的代码重用有继承和多态两种方式,在PHP,只有单一继承才能实现,而特性避免了这种
情况。
1。继承vs多态与特质
现在有两类publish.php和answer.php.to加在它的日志功能,记录
操作课内。有几个
选项:
继承
多态性
特质
1.1。继承
图:
代码结构如下所示:
/ / Log.php
< PHP
班级日志
{
公共功能startlog()
{
回声…
}
公共功能endlog()
{
回声…
}
}
/ / publish.php
< PHP
类发布
扩展日志
{
} / / answer.php
< PHP
类应答扩展日志
{
}
可以看出,继承确实符合要求,但这违背了面向对象的原则,操作和日志(日志),如发布和答案之间的关系不是子类和父类之间的关系,因此不
推荐使用。
1.2。多态性
图:
实现代码:
/ / Log.php
< PHP
登录界面 {
公共功能startlog();
公共功能endlog();
}
/ / publish.php
< PHP
类发布实现日志
{
公共功能startlog()
{
实施startlog(法) / /待办事项:
}
公共功能endlog()
{
实施endlog(法) / /待办事项:
}
}
/ / answer.php
< PHP
类应答实现日志
{
公共功能startlog()
{
实施startlog(法) / /待办事项:
}
公共功能endlog()
{
实施endlog(法) / /待办事项:
}
}
日志记录的操作应该
都是一样的,所以在发布和应答操作中的日志记录实现是相同的,显然这违反了干(不要重复)原则,所以不推荐使用。
1.3。特质
图:
实现代码如下所示:
/ / Log.php
< PHP
特质的日志{
公共功能startlog(){
回声。
}
公共功能endlog(){
回声。
}
}
/ / publish.php
< PHP
类发布{
使用日志;
}
发布=新发布();
为发布-> startlog();
为发布-> endlog();
/ / answer.php
< PHP
课堂上回答{
使用日志;
}
答案=新答案();
为回答-> startlog();
为回答-> endlog();
正如您所看到的,我们实现了代码重用而不增加代码的复杂性。
1.4。结论
虽然继承方式可以
解决问题,但它违背了面向对象的原则,显得粗鲁。多态
方法也是可行的,但它不符合软件开发中的干燥原理,增加了
维护成本,而特征方法避免了上述缺点,并且比较优雅,可以实现代码的重用。
2的范围。特质
考虑到特性的好处,我们还需要了解其实现中的规则,并从范围开始,这是一个很好的证据,证明了实现代码如下所示:
< PHP
类发布{
使用日志;
公共功能dopublish(){
美元-> publicf();
美元-> protectf();
美元-> privatef();
}
}
发布=新发布();
为发布-> dopublish();
上述代码的
执行结果如下:
公共功能
保护功能
私有
函数 可以
发现,特性的范围在特征类的引用中可见,可以理解为使用关键字将特性的实现代码的副本
复制到引用特性的类中。
属性在3中的优先级。特质
当涉及到优先级时,必须有一个对比引用,其中引用对象引用特性类及其父类。
下面的代码用于证明特性
应用程序中属性的优先级:
< PHP
特质的日志
{
公共功能publicf()
{
__method__回声。公共职能。php_eol;
}
保护功能protectf()
{
__method__回声。保护功能。php_eol;
}
}
课堂提问
{
公共功能publicf()
{
__method__回声。公共职能。php_eol;
}
保护功能protectf()
{
__method__回声。保护功能。php_eol;
}
}
类发布扩展问题
{
使用日志;
公共功能publicf()
{
__method__回声。公共职能。php_eol;
}
公共功能dopublish()
{
美元-> publicf();
美元-> protectf();
}
}
发布=新发布();
为发布-> dopublish();
上述代码的输出如下所示:
发布::publicf公共功能
日志::protectf保护功能
从上面的例子中,我们可以总结特性应用程序中的优先级如下:
1。从当前类成员重写特性的方法。
2.trait覆盖继承的方法
类成员优先级是当前类>特性>父级
4。而作为关键词
在类中,可以引用多个特性,如下所示:
< PHP
特质的日志
{
公共功能startlog()
{
__method__回声。公共职能。php_eol;
}
保护功能endlog()
{
__method__回声。保护功能。php_eol;
}
}
性状
检查 {
公共功能parametercheck($
参数){
做某事
}
}
类发布扩展问题
{
使用日志,检查;
公共功能dopublish($对){
美元-> startlog();
美元-> parametercheck($对);
美元-> endlog();
}
}
顺便说一下,我们可以
参考一个类中的多个特性,当你提到多个特性时,很容易陷入麻烦。最常见的问题是两个特性中是否有相同名称的属性或方法。做这件事的两种方法是什么如果你有相同的
名字,然后你需要使用替代和。
< PHP
特质的日志
{
公共功能parametercheck($参数)
{
__method__回声。参数检查'。为参数。php_eol;
}
公共功能startlog()
{
__method__回声。公共职能。php_eol;
}
}
性状检查
{
公共功能parametercheck($参数)
{
__method__回声。参数检查'。为参数。php_eol;
}
公共功能startlog()
{
__method__回声。公共职能。php_eol;
}
}
类发布
{
使用检查,日志{
检查::parametercheck代替日志;
日志::startlog代替检查;
检查::startlog为CSL;
}
公共功能dopublish()
{
美元-> startlog();
美元-> parametercheck('params);
此$ - CSL();
}
}
发布=新发布();
为发布-> dopublish();
执行上面的代码,输出结果如下:
日志::startlog公共功能
检查::parametercheck参数checkparams
检查::startlog公共功能
正如字面意思,而不是关键字的由前更换,并作为关键字对替代方法的别名。
当引用该特性时,使用使用关键字,使用关键字用于引用名称
空间。
以上是本文的全部内容,希望能对您有所帮助,希望大家多多
支持。