Skip to content

Instantly share code, notes, and snippets.

@FrankHB
Created January 10, 2018 11:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save FrankHB/f741a3afa4ba31aeb8266d5cf5794816 to your computer and use it in GitHub Desktop.
Save FrankHB/f741a3afa4ba31aeb8266d5cf5794816 to your computer and use it in GitHub Desktop.
Traits
PHP的所谓traits是一种语言特性,可以算是一种弱化的mixin,能用于替代多继承的一部分常见使用;而C++核心语言特性并没有traits这种东西。C++原生支持多继承(先不评论设计得如何),不需要另外加特性模拟。
C++的traits或者说type traits不是语言特性,而是TR1那时候搞出来的一类翻译时的语用技巧,算是惯用法。
也有其它设计成语言特性的如Rust,和继承(一种inclusion subtyping)也没什么关系(和C++的concept一样都更像是Haskell的typeclasses),尽管可以实现类似的目的。区别是C++的这坨都是严格受限翻译时确定的,其它语言类似特性就没那么明显的限制(但有其它的破事)。
加上PHP,硬要说这些用法的共同点的话,就是和C++的traits依赖的模板名称查找一样都算是structrual typing的实例,只有用到了traits以后才做具体的名义类型检查。
考虑到可用特性的正交性,PHP的tratis应该是其中表达能力最弱的——只适合用于对付缺少继承的问题。
C++再烂,用SFINAE强行introspect的出来的起码在翻译时也能是个first-class value,允许让类类型用于实现足够多其它语言做不到的和面向对象没什么关系的玩意儿。
至于“实现”traits的语义——谁在乎呢?表达能力足够强的语言根本不需要包含这种特性,让用户随便自己糊就是了。
另一个事实是除了当年脑子进OOP水一股脑跟风设计的语言特性(包括C++的多继承和Java的interface之流,不过多继承在用途上不至于那么鸡肋)以外,现在没多少通用目的语言会像PHP一样专门搞一个基本没法正交的如此specific的特性出来糊弄用户的。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment