文章目录

在 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. Required fields are marked *

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