Drupal由于历史原因没有采用PHP5中的OO设计而被不少人诟病。
尤其是没有使用class,而这个单词实际上已成为OO的代名词。
你可以认为Drupal是面向模块和函数的,但这并非意味着Drupal的设计中没有体现OO的思想。
实际上Drupal的很多机制设计很精巧,和OO的编程模式有异曲同工之妙。
1、对象(Objects)
Drupal中的node、module、theme都可以看做是对象。比如node,是构建网页中区块的基本对象,
它基于外部可见的数据表来构造而不是class,node.install中定义了基本的数据字段。
扩展模块可以很容易的扩展node对象的数据字段。这很类似于class的属性扩展。
node的方法封装在node.module中,通常使用node_invoke来调用。
2、抽象(Abstraction)
Drupal的hooks机制是最基础的接口抽象。定义了一个模块能够执行的操作。
实际上Drupal内核并不需要了解具体模块是什么,只要它按照约定的接口来执行就行。
3、封装(Encapsulation)
Drupal并没有实现严格意义上的封装。也没有private/protected/public这样的访问限制级别。
不过通过遵循一定的编程规范,可以有类似的效果:
通过使用模块前缀命名函数,可以避免函数在模块之间发生冲突。这类似于namespace;
通过使用_和__前缀符号来表明这个函数的访问范围。
myfunc() : public
_myfunc() : protected
__myfunc(): private
4、多态(Polymorphism)
node就是Drupal实现多态的最好的例子。模块调用node_build来构造node,然后提交给drupal_render来产生html。
而最终实际的输出取决于node的类型。这和OO语言中根据消息中对象类型来决定实际调用方法的处理如出一辙。
5、继承(Inheritance)
theme可以看做是从一个抽象基类派生而来。抽象基类的方法在theme.inc中定义。缺省的theme实现在模块中完成。
theme可以决定使用自己的render实现还是使用默认的render实现。