文章目录

在2012年3月初,PHP团队宣布了5.4版本的发布。程序员们对这次的发布已期待许久,因为这一次的升级带来了很多特性的加入。其中,最受追捧的是Traits。为了构建这次发布的版本,Shammer C特意为此撰写了一篇文档:如何使用PHP的Traits,我强烈的建议您在读这篇文章之前拜读一下,因为这篇文章需要读者能够对Traits有一定的基础了解。

Traits已经被PHP社区广泛的接受,最为关键的是因为它包含了其他Java、C++和Python编程语言的特性。除此之外,Traits也被广大的网友们神化了。那些程序员狂砍这种特性将给他们的项目带来多么大的益处,尤其指出它是能够替代面向对象(OOP)继承的特性。然而,Traits真的有那么神奇么?难道真的能对PHP开发有所促进么?还是败絮其中呢?

PHP的Traits是个祸害

从表面上来看,由于它可以降低整个应用中代码的复用成本而受到了非常强烈的支持。此外,它仍然可以帮你提高代码的可维护性,并看起来更简洁。

尽管Traits是那么的受欢迎,但是许多高级程序员却担心将来的情况并不会像当初设计的那样。高级程序员Anthony Ferrara担心它将会变成下一代被滥用的功能,像evel和constants那样。但在此之前,Anthony曾提出了一个有趣的观点:Traits其实是一个没有state的Mixins的具体集合。PHP中的Traints支持state的使用。所以,PHP的Traints实际就是Mixins。这个简单的观点说明了PHP Traits的最终真实的意图,其实就是“挂着羊皮卖狗肉”。更不用解释为什么会以Mixins的形式,而不是以全球公认的无state的Mixins形式来处理(很抱歉,我都没明白是啥意思,看来还得深入了解下)。

Anthony继续讲到,使用Traints在功能上,和使用能够将类耦合在一起的扩展非常相似。扩展已经是一个备受认可且历史悠久的功能了,所以质疑Trait在PHP中的地位,认为它的设计其实就是踩在已有功能的肩膀上也不为过。

此外,面对接口(Interface)仍是摸不着头脑。很多程序员对接口和Traits到底有哪些差别摩登两可。它门的重用特性极其相似,同时继承深度有可能也非常类似。与其说Trait是PHP的新功能,不如说仅仅是接口的升级版吧?

PHP的Traits好得飞起

先忽略上面提到的质疑,Traits对于PHP来说仍是非常实用的,因为它可以用来实现多继承场景(而扩展却只能实现单继承)。

在PHP中,单继承特性已经存在很多年了,且现在已经成为不可割舍的一部分。但正由于这种特性限制了那些高级开发人员构建功能复杂而代码精炼的系统。在其他语言中,多继承可以降低很多场景下代码的复用程度。可遗憾的是,PHP却不支持多继承。所以,接口成为了一个不成功的多继承替代品。

接口的设计思维并不是这样的,它的本意是让任何实现了某接口的类库实现其定义的功能。降低类与方法的耦合度,而并非作为一个PHP多继承的替代品。

有些程序员尝试一些富有创造性的方法来实现PHP中的多继承。但是很多方案都很臃肿,并未成功,所以也只能算是实验罢了,并称不上真正的解决方案。

有了Traits,PHP就可以灵活地使用原生的多继承特性。正如Shameer对Traits所述的那样,可以在某个类内部使用多个Traits。John Squibb曾使用Traits实现了一个多继承特性的环境

许多程序员觉得多继承特性会导致钻石问题(Diamond Problem),还是单继承更简单易用。事实上,PHP的问题并非在于多继承是否实用,而是在于增加多继承特性的趋势是否强烈。如果你再Google搜索“don’t like PHP”,你会看到很多对PHP排斥的公开声明,而且这种情况愈演愈烈。随着PHP向多继承特性的趋势发展,也变得愈来愈具有挑战性、表现力和可接受的编程语言,而脱掉了“仅仅是一门流行的Web编程语言”的帽子。当知道许多Java、Python和C++程序员拒绝使用PHP的理由却是PHP缺少一些对标准编程特性的支持时,我感到无比的安慰。

Traits预示着PHP真真正正地在朝着更规范的方向发展,期待让更多的成熟程序员能够接受并使用PHP。

总结

Traits让PHP程序员能够创建更复杂的系统,同时依然能够保证代码简洁性和高效性。

尽管争辩的声音并未平息,但这意味着正在打开PHP在面向对象特性上的另一扇大门。同时,我相信这也极大的促进了PHP的发展。

下面的是关于Traits的一些相关文章。


作者:Callum Hopkins  翻译:GenialX

文章原文:https://www.sitepoint.com/php-traits-good-or-bad/

文章来源:胡旭博客 => PHP的Traits:到底是祸害还是好得飞起?

转载请注明出处,违者必究!

Share:

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.