特征及其在PHP中的应用

从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公共功能



正如字面意思,而不是关键字的由前更换,并作为关键字对替代方法的别名。



当引用该特性时,使用使用关键字,使用关键字用于引用名称空间。



以上是本文的全部内容,希望能对您有所帮助,希望大家多多支持。