`
hulunberbus
  • 浏览: 865253 次
文章分类
社区版块
存档分类
最新评论

Drupal: 面向对象的设计理念

 
阅读更多

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实现。


分享到:
评论

相关推荐

    Front End Drupal: Designing, Theming, Scripting (Developer's Library)

    Konstantin Käfer, Emma Hogbin "Front End Drupal: Designing, Theming, Scripting (Developer's Library)" Prentice Hall PTR | English | 2009-04-15 | ISBN: 0137136692 | 456 pages | PDF | 4 MB “For ...

    drupal:这个 Composer 包是一个安装程序,它将从 http 下载 Drupal

    使用这个 Composer 包安装 Drupal: 不习惯作曲家? 第一步是安装 Composer。 这本质上是一个单行过程: curl -s https://getcomposer.org/installer | php Windows 用户可以在此处下载 phar 文件:[ composer)...

    template-drupal:网站外部模板的模板

    欢迎使用@ koromerzhin / template-drupal :waving_hand: 网站模板模板 :house: 需要 软件: 制作 码头工人 库罗默任(Koromerzhin)/ traefikproxy储存库 配置: 码头工人 主持人: drupal.traefik.me Récup...

    cbf-drupal:用于CBF的Drupal模块

    cbf-drupal:用于CBF的Drupal模块

    ansible-role-drupal:Ansible角色-Drupal

    ansible-role-drupal:Ansible角色-Drupal

    helm-drupal:Kubernetes的Drupal舵图

    头盔图:Drupal 。 这些是利用Helm安装Drupal的说明。 该图表将使您可以设置和配置Drupal以及其他集成: 使用ProxySQL配置MySQL 使用PGBouncer配置的PostgreSQL 雷迪斯漆请查阅我们的体系结构图以获取有关Azure的...

    Drupal:Litmos Drupal 插件

    litmos 和 litmos_feature 模块会将您的课程从 CallidusCloud 的 Litmos 学习平台导入到您的 Drupal 站点作为节点。 启用模块后,您将在管理配置页面中看到 Litmos 设置。 输入您的 Litmos API 凭据以启用自动课程...

    docker-drupal:Docker 上的 Drupal

    docker-drupal Docker 上的 Drupal示例用法注意:以下过程已确认在 OS X 上使用boot2docker和boot2docker docker-compose 。 git clone ...

    Drupal: Validate & Check Version-crx插件

    drupal:验证和检查版本 drupal验证和检查版本扩展名为: 现在支持最新版本!!! - 验证是否使用drupal构建了网站并检测其版本 - 显示哪些次要版本更新可用于下载并提供直接链接 - 显示哪些主要版本更新可用于下载并...

    fishy-drupal:面向 Drupal 开发人员的 oh-my-fish 主题。 将 git branch、git status 和 drush 别名放入命令提示符

    可疑的drupal 插件到。特征显示当前工作目录,缩写(默认鱼样式) 显示活动的 git 分支,如果有的话显示活动的 drush 站点别名(如果有) 如果当前 git 目录是“脏的”,则显示黄色 ✗

    ansible-deploy-drupal:用于部署Drupal 8站点的Ansible角色

    ansible-deploy-drupal:用于部署Drupal 8站点的Ansible角色

    awesome-drupal:Drupal 的资源和最佳实践

    模块以下是您在每个项目中都应该拥有的一些模块: - Drupal 6、Drupal 7 - Drupal 6、Drupal 7 - Drupal 6、Drupal 7 - Drupal 6、Drupal 7 - Drupal 7 - Drupal 6、Drupal 7、Drupal 8 - Drupal 6、Drupal 7 - ...

    react_to_drupal:使用Webpack在自定义模块Drupal 8中实现ReactJs

    对Drupal做出React 该模块将React中的一个简单语句集成到了drupal 8块中。 先决条件 Drupal的实例 node.js npm 纱 网页包 激活模块之前 将模块放在模块的自定义文件夹中。 然后,在命令行中,将自己置于模块的...

    docker4drupal:Docker容器可以运行本地drupal环境

    要开始使用此docker4drupal本地环境实例,请更新Makefile: 用{PRODUCT_NAME}将所有字​​符串更新为您想要的名称。更新docker-compose.yml 1.要开始使用此docker4drupal本地环境实例,请更新Makefile: 使用docker-...

    bitnami-docker-drupal:Drupal的Bitnami Docker映像

    用于Drupal的Bitnami Docker映像 什么是Drupal? Drupal是市场上功能最多的开源内容管理系统之一。 Drupal专为高性能而构建,可扩展到许多服务器,可通过REST,JSON,SOAP和其他格式轻松集成,并具有多达15,000个...

    drupal:Plataforma Drupal FFLCH

    Drupal FFLCH Plataforma Drupal美国站点位于FFLCH。 创建和编辑composer.json。 原则原则: 网站/配置文件/配置文件/ fflchprofile:配置文件自定义配置 网站/模块/自定义:módulosespecifícosde cada网站 部署...

    chef-deploy-drupal:部署-Drupal食谱

    部署Drupal Cookbook 描述 安装,配置和引导在MySQL和Apache上运行的站点,并在需要时使用Nginx反向代理。 本菜谱支持两个主要用例: 您有一个现有的Drupal站点(代码库,数据库SQL转储,并且可能是在加载所有内容...

    fepper-drupal:Drupal的Fepper

    用于网站快速原型制作的前端原型工具Fepper的此发行版具有为Drupal 8配置的模板以及为容纳这些模板而构建的。 为了使该项目适应Drupal 7,请遵循。 如果您不需要与Drupal交互,。模板重用对source/03-templates中的...

    systemaker_bootstrap_drupal:适用于Drupal的Systemaker Bootstrap主题

    适用于Drupal的SYSTEMAKER BOOTSTRAP主题可直接用于Drupal的Bootswatch外观的Bootstrap子主题。 要使用其他靴子表皮,请按照以下说明进行操作: 在下载其较少的文件(variables.less和bootswatch.less)。 将它们...

    Drupal 8: Enterprise Web Development

    Drupal 8: Enterprise Web Development English | 30 Dec. 2016 | ASIN: B01N2ZWUK1 | ISBN-13: 9781787283190 | 1005 Pages | This course offers a thorough coverage of developing, managing, extending, and ...

Global site tag (gtag.js) - Google Analytics