最佳wordpress主题开发框架

摘自instantshift,google随便翻译。

WordPress的框架的主要目的是为了更快地编写一个WP主题通过减少所花费的时间与每一个主题,你的工作任务重复。

 

什么,为什么和谁

有几个原因,你想好好利用的框架,主要是其易于使用,支持提供各种WordPress的社区,优化代码和代码符合最新的WP标准的。即使这些框架有很多优点,也有局限性和缺点,你必须要考虑。开发商面临的问题之一是原开发框架的调用,这清楚地说明你可以和不能做你的模板和各种许可证的限制。框架伟大的工作开始开发商还是那些人用自己的框架还没有结束,因为很多时候共同框架应运而生产量重大的修改,并成为开发者的财产。

投票站

  • 优化代码和搜索引擎优化就绪平台
  • 初学者准备的结构很容易让初学者开始
  • 下载和安装,使框架立即访问

缺点

  • 大多数框架支付或需要付费会员被访问/下载
  • 没有经过充分优化的具体需求和要求修改
  • 它可以用来许可证调用各种限制

最佳WordPress的主题框架

Genesis Framework

instantShift  - 创世记框架

创世记框架,使您能够快速,轻松地构建令人难以置信的网站与WordPress。不要紧,如果你是一个新手或专业,创世记框架将为您提供一个安全和SEO优化的基础上,将采取WordPress的你从来没有想过的水平。这是非常可定制的,可以让你配置,甚至更多,完全干净的代码是很容易的。

对于一型支付创世记框架本身,即时访问所有可下载的文件,无限更新的文件,支持网站和访问详细的教程。创世记框架的StudioPress,开发商已经给你抢不止一个主题,实际上所有的主题,他们已经发布,并会在未来释放仅仅支付350元的可能性。

价格: 50元一个模板(包括框架),350美元的所有模板。

框架链接

Thesis 2.0

instantShift  - 硕士2.0

论文是另一个溢价WordPress的框架,专注于3个主要部分:盒功能添加到您的主题没有编写自己的代码的麻烦,皮肤,增加阻力和下降自己的方式来一个美丽的WordPress设计或挑选一个他们的杰作和软件包部署先进的CSS定制,只需点击几下。搜索引擎来挤满了各种皮肤为框架,该框架也进行了优化。

该框架的设计与易于使用的头脑,拖动和拖放功能。论文有一个杀手级的技术支持论坛,这将有助于你得到你的网站运行起来没有任何问题。他们的专家准备回答你的问题,将在那里站在你的背部。

价格: $ 87 – $ 164(这取决于你的包)

框架链接

PageLines Framework

instantShift  - 知道开放平台框架

知道开放平台是一个负责任的,拖放框架,是希望有一个代码免费拖放框架WP网站。框架代码是专为一个伟大的搜索引擎优化的性能与社会化营销的几个选项。它是挤满了吨的插件和响应式设计基础。色彩控制引擎,少和引导的支持和拖放设计使得它甚至更好。

有几件事情,你会喜欢知道开放平台的框架,包括其响应布局控制,可以让您控制您的网站为各种移动设备的尺寸 – 响应一个拖欧米茄下降建设者的使用。也有主题化的支持,他们提供了从他们的专业人士和友好的社区主要是开发商,恒星援助。

知道开放平台的定价他们的相应的框架,售价为$ 97或$ 14/​​mo个人计划“加籍”或$ 197的开发计划。

价格: $ 97 – 197

框架链接

Pro Theme Design

instantShift  - 专业主题设计

元素是一个干净和强大的框架为WordPress博客里面挤满了可定制的布局,导航,页面模板和字体的选项。它被开发了的BenGillbanks拥有超过10年的经验,是专业的网页设计师。他为自己创建了一个框架,但他已经提高了两年多比公开。其他框架的显着特点是:固体SEO的基础是建立在自定义WP菜单系统,部件和翻译准备的文件。

元素的框架可在两个计划:基本和开发商之一,售价为$ 80和$ 160相应。

框架链接

Headway Themes

instantShift  - 一班主题

班次框架是另一个拖累n下落主题生成器,可以让你自定义的任何页面,颜色,字体,所有班次的可视化编辑器的威力。从来没有伟大的设计更加灵活,容易定制这个框架。该框架是集成有几个选项和扩展,如拖动正掉落电网,设计编辑器,搜索引擎优化的代码和响应/自适应优化。

路上前框架的基本包装$ 87和$ 174的先进封装。

框架链接

Gantry Framework

instantShift  - 龙门框架

龙门是一个简单而强大的主题,使设计的快速发展和实现一个灵活而强大的网络平台,主题。龙门架是专为Joomla和WordPress的,其中有一个非常明亮,时尚,时尚的用户界面框架。

龙门框架是免费提供的,并且可以提供它支持通过外部论坛和一堆的介绍影片。

框架链接

Theme Hybrid

instantShift  - 主题混合

混合动力是另一个免费的,但相当真棒WordPress的框架,用户界面​​友好,设有多个自定义网页模板和多个部件准备区,使​​您可以创建任何类型的网站,你想的SEO优化。有几个支持主题功能的混合,其中一些是:的面包屑支持,自定义菜单和页面模板,功能图像,后期样式表和可用性把它翻译。

有大约10个儿童主题混合的框架,它可以帮助你理解的框架的可能性。也有一些儿童主题的教程,可以帮助你更好地了解熟悉模板是如何工作的。

框架链接

Whiteboard Framework

instantShift  - 白板框架

白板框架是一个强大的框架,可以帮助你加快发展的惊人的WordPress主题。白板通过消除所有WP主题的公共代码所花费的时间,这样做是挤满了几个真棒功能,如:搜索引擎优化,速度,易用性和移动的支持。

关于这个框架是一个了不起的事情,它是完全免费的,开源的,这绝对是很大,考虑到其他模板的定价在50美元开始。白板框架多lungual兼容的,并且其代码是强大的搜索引擎优化。

框架链接

30个最受欢迎的wordpress插件排行

1、all in one seo pack

2、akismet

3、google xml sitemaps

4、contact form 7

5、nextgen gallery

6、wp supe cache

7、google analytics for wordpress

8、wptouch

9、wordpress importer

10、jetpack by wordpress.com

11、fast secure contact form

12、wp-pagenavi

13、wordpress seo by yoast

14、chare buttons by lockerz/addtoany

15、wp-ecommerce

16、google analyticator

17、yet another  related post plugin

18、tinymce advanced

19、sociable

20、really simple captcha

21、gtrans

22、wp to twitter

23、broken link checker

24、addthis

25、wp to twitter

26、buddypress

27、buddypress

28、smart youtube pro

29、redirection

30、wp-polls

 

2013年2月instantshift发布。

WordPress的被称为最好的博客的一个原因,这使您可以建立博客,网站和功能强大的在线应用平台。许多方面,包括其易于使用和可扩展性,使WordPress的最流行 ​​的博客软件。最重要的是,WordPress是一个开放源码的解决方案是免费提供给大家。

有很多方法来提高你的WordPress设置。最好的方法,包括使用自定义插件插件工具来扩展WordPress的功能WordPress的核心被设计成倾斜,以最大限度地提高灵活性和减少代码膨胀。插件提供了自定义功能,让每个用户可以定制他们的网站他们的特定需求和功能。

许多你应该知道,instantShift是自豪地采用WordPress,作为一个博客和CMS工具。如果你在寻找好的CMS或Web工具,为您的项目,我们强烈建议WordPress的。WordPress是一个伟大的工具,最好的东西是免费的!

最新清新简约wordpress主题Responsive

wordpress主题 Responsive

instantShift - New High-Quality Free WordPress Themes

下载:  Features & Download Live Demo

 

主题信息

  • 当前版本: 1.8.1
  • 最后更新: 2012年10月23日
  • 发布日期: 2012年3月16日
  • 要求: WordPress的3.4或更高版本
  • 儿童主题居住:是的- 更多信息
  • 主题类型:独立(母公司)主题
  • WordPress的3.0 +多站点:是的- 更多信息
  • 许可: GNU GPLv3的
  • 更新日志
主题特征
  • 响应性的Web设计
  • 流体可堆叠的网格系统
  • 一个部件(11小工具领域)
  • 自定义模板(9模板,不同的布局)
  • 自定义背景
  • 自定义页眉(用于logo上传)
  • 自定义菜单(4餐单)
  • 螺纹评论
  • 主题选项
  • 视网膜就绪
  • WooCommerce兼容
  • 多语言准备
  • RTL支持
  • 翻译成43种语言(计数):
    • 德国的
    • 法国人
    • 葡萄牙
    • 意大利的
    • 瑞典
    • 马来人
    • 加泰罗尼亚语
    • 西班牙的
    • 保加利亚人
    • 挪威
    • 克罗地亚
    • 塞尔维亚
    • 波斯语
    • 波兰语
    • 斯洛文尼亚
    • 丹麦的
    • 立陶宛
    • 拉脱维亚
    • 中国的
    • 中国 – (简体韩)
    • 荷兰人
    • 冰岛
    • 日本
    • 希腊的
    • 匈牙利
    • 捷克的

最新清新简约wordpress主题Origin

Origin

instantShift - New High-Quality Free WordPress Themes

下载:Features & Download Live Demo

 

 

敏感的布局更好地在移动设备上观看-智能手机和平板电脑是一个简单而优雅的主题。它是建立了  混合动力核心框架,  并继承了其专业和组织良好的编码实践,使它成为一个出色的出发点进一步的定制和开发
的思想的排版和宽敞的布局使的主题一个坚实的choise为  博客  提供愉快和通畅的阅读体验,为他们的访客。

特点

  • 响应布局
  • 主题设置
  • 面包屑
  • 先进的小工具
  • 自定义背景
  • 突出的标语
  • 灯箱
  • 儿童主题友善
  • 主题匹配样式的联系表格插件-  和  联系方式7
  • 翻译准备(包含.po / .mo文件)

翻译

翻译文件,提供了一种主题的用户:

11个华丽的wordpress图片主题

instantshift转来的,懒得翻译了,直接用google翻译了下。

社会化媒体已经采取了更加进化的飞跃,在过去两年的时间,因为它在洞穴男子用石头和骨头装饰他们的长矛和俱乐部来区分他们的真棒的东西。

11华丽的WordPress Pinterest的主题

希望每个人都熟悉当前的社会媒体迪尔里。烨是Pinterest的!先生们曾经插科打诨在Pinterest的作为一个社会媒体网站的使用受到女士们的分享烹饪食谱,现在该死的恶霸,Pinterest的用户。那么,什么是Pinterest的,使他们周转?在进入的,让我很快地破解了一些事实有关Pinterest的。

 

  • Pinterest的,在短短两年内它的出现,已经达到了世界顶级的第三大社交媒体网络站点。
  • 它的平均每月1170万独立访问者。
  • 用户注意的是,在Pinterest的相比,Facebook和Twitter。Pinterest的用户花费平均为15.8分钟,而一个网站的用户花费12.1分钟,Twitter用户平均花费3.3分钟。
  • Pinterest的驱动转介流量比Google+后,YouTube和LinkedIn(即使这三个组合)。
  • Pinterest的近70%的用户是女性,其中包括那些在25至35岁年龄组的主要参与。
  • 一个Pinterest的用户中有三分之一的家庭平均年收入10万美元。
  • Pinterest的用户有50%的孩子。
  • 97%的Facebook粉丝页上Pinterest的妇女。

为什么Pinterest的?

Pinterest的,是当今最热门的社会化媒体网络已经采取了千百万人的心。那么,为什么这Pinterest的美眉呢?一个最好的理由是,让你视觉上从事Pinterest的。凭借着惊人的照片共享设施,人们可以随时随地脚的照片和视频加入其董事会。另一个与Pinterest的最好的事情是,你可以上传照片“n”个“N”的专辑数量。Pinterest的可以让你脚的照片,无论是从您的计算机或网络。如果您是钉扎一个拍摄的图像从网页中,有一个Pinterest的书签拿起源的图像,并将其设置为链接的点击。您也可以选择同时在Facebook和Twitter上分享引脚。这种独特的方式寄托照片和视频,使用户随时沐浴在Pinterest的。

WordPress的

飘的日子,你聘请设计师设计,建设和发展您的网站。现在的趋势是设计自己的网站/博客的WordPress。WordPress是完全免费的,因此,它并不需要花钱在设计网站。WordPress是简单易用。与一个WordPress网站,你可以很容易地驾驶交通到您的网页,因为WordPress是全SEO友好。因此,您的网站可以排名在谷歌和其他搜索引擎结果页面。

WordPress的Pinterest的主题

所以,现在我们的话题。什么是WordPress的- Pinterest的主题?有大量的WordPress主题,可以让你添加到你的WordPress网站的视频,照片,内容和其他定制选项。Pinterest的最有趣的事情吸引了所有参观者的是其出色的设计和布局。像WordPress主题的几个Pinterest的出来让你的WordPress博客闪耀像Pinterest的页面。这些WordPress的Pinterest的主题,让你觉得如果你正与一个社会化媒体网络,而事实是,你在你的WordPress网站。,
虽然Pinterest的有几个像WordPress主题,我选择最好的10个主题,带有一些卓越的特点。

WP Pinterest的主题Apptha

instantShift  -  WP Pinterest的主题Apptha

这个主题开发的Apptha,代表着时尚和灵活的网页设计。的主题与多栏布局,可以帮助你添加任意数量的图像的插接。这个模板是SEO优化和集成第三方的插件,如看起来像Pinterest的网站绝对的Feedburner的电子邮件小工具或社会共享网络。Pinterest的WordPress主题是一个快速加载功能,让您的网站访问者完全迷住了。

有了这个Apptha主题,你可以上传标志和图像很容易。功能表设计,并兼容IE7,IE8,火狐,Chrome浏览器,Safari浏览器和Opera。当你滚动的内容被载入。上传的图片由管理员用户可以发表评论。管理员拥有访问上载标志,设置的无限滚动或标准的滚动和功能的图像。

特点 现场演示

转接板的Themify.me

instantShift  -  WP Pinterest的主题插件板

Pinterest的转接板是一个像WordPress主题,配备了一个具有响应性的和自动堆叠布局。转接板为您提供了无限的新职位被自动加载,当你滚动到页面底部的滚动,选择该选项。转接板与桌面和移动设备,如iPad,iPhone,黑莓和Android。主题自带的转接板的主要特点是灯箱画廊,社会媒体图标,自定义页眉/页脚的菜单布局后,3选项,自定义欢迎消息,自定义页脚文本,7个主题外观,可选的RSS和搜索形式,动画返回顶部按钮和儿童主题的支持。插拔式编码HTML5和CSS3。

特点 现场演示

Pinpress

instantShift  -  WP Pinterest的主题Pinpress

PinPress是一个WordPress主题,带有精确设计的Pinterest的。会议的主题是全社会和APT显示视觉艺术。Pinpress设有一个惊人的响应设计,搜索引擎优化和易于定制。的主题可以用在所有设备和浏览器,无论屏幕分辨率可能。它具有优良的兼容性,智能手机,平板电脑和大屏幕显示器。PinPress设计师,旅客,个人博客,摄影师,和企业博客是一个有效的选择。Pinpress是一个高级主题,提供了69美元。

特点 现场演示

Gridnik

instantShift  -  Gridnik WordPress的主题

Pinterest的Gridnik是一个像WordPress的主题,这是完全独特的。这个主题具有一个灵活的布局,适合在任何屏幕尺寸。Gridnik WizyPanel供电,并enfolds 6视频与内置的文件,让你开始。它有9华而不实的配色方案与服务的谷歌字体目录的15个字体选项。Gridnik支持WordPress的。该主题还包括一个强大的组合,内置分享这插件,内置Wizylike WordPress的插件,更新发出通知,个别画廊的项目。有10个自定义部件来与Gridnik的。这些包括Flickr,微博,视频部件,流行的项目,最近的项目中,最喜欢的项目,项目的标签,项目的类别和许多更多。在Gridnik提供优质价30元。

特点 现场演示

DailyNotes

instantShift  -  DailyNotes WordPress的主题

日报指出了整整84主题39美元。这是一个Pinterest的像WordPress主题,可用于与您的朋友分享你的一天到一天的生活的经验。每日博客,女士们,的木乃伊谁花的时间悠闲地在家里最能喜欢这个主题来装饰自己的WordPress网站。的DailyNotes是如此简单,有一个布局,诱惑你写的东西,如在个人日记。它有四个不同的颜色。日报指出兼容所有类型的浏览器和屏幕类型。这WordPress主题的多媒体集成。

特点 现场演示

图形

instantShift  - 图形WordPress的主题

图形是一个WordPress主题,是由Dessign团队。这完全是一个免费的主题与现代风格。的中间部分,是一个有特色的职位排列在一个惊人的方式。平面设计师,插画家和摄影师会发现图形是一个很好的平台,为自己的职业生涯。这个主题是与WordPress 3.1兼容。它包括一个有效的XHTML和CSS。图形是IE7,IE8,Safari和Firefox兼容。另一个这一主题的最好的事情是,图形是搜索引擎优化,因此使用这个主题,你的WordPress网站上,你可以得到您的网站在搜索引擎中的排名好。

特点 现场演示

ecoStrips

instantShift  -  ecoStrips WordPress的主题

提供优质的价格为25美元EcoStrips是一个动态的主题。这个主题具有一个动态的墙,在一个动态的方式安排自己的帖子,根据你的屏幕大小。还有一个动态的过滤器插件,它允许您过滤您的职位动态与一个单一的点击。EcoStrips使用最新的HTML5和CSS3技术。

特点 现场演示

反射

instantShift  - 反射的WordPress主题

反射是一个动态的网格/组合WordPress主题,提供35美元的溢价。它配备了一个强大的主题管理工具和筛选的动态网格布局。这个主题包括9页模板和配色方案。有超过40个字体替换选项,其中还包括从谷歌字体API和Cufon的选择。反射功能的能力,在飞行中更改缩略图和模块尺寸。还带有typekit,fontsquirrel,谷歌字体支持,灯箱,画廊,幻灯片,简码和传统的博客模板的主题。此外,还有一个可选的部件覆盖区域的页脚。支持YouTube和Vimeo视频的灯箱和内页模板。

特点 现场演示

自动对焦

instantShift  - 自动对焦WordPress的主题

自动对焦是一个优雅的WordPress主题自带的动态Flickr的整合,通过它您可以将图像直接从你的Flickr帐户。自动对焦是一个高级的主题,提供了25元。其特点是,头版图片剪裁编辑,简码的灯箱效果,支持WordPress的3.0和自定义菜​​单,自定义管理风格改进的所见即所得的体验,部件化侧边栏区,和另外两个可选的广告横幅和部件的空间。WordPress的Pinterest的主题是设计一个800万像素/ 8列格。自动对焦是与Internet Explorer,Firefox和Safari浏览器兼容。它也有一个可选的投资组合的风格布局平方图像。

特点 现场演示

动摇电网

instantShift  - 动摇电网WordPress主题

动摇主题的流体网格布局网格是一个强大的组合。会议的主题是非常容易使用和定制。VIMEO或YouTube视频的URL简单的复制和粘贴,发布视频,或创建一个完整的画廊刚刚上传您的图片和打击“发布”就这么简单!先进的后选项包括改变后的方块的大小,隐藏元素(标题,内容,幻灯片播放),变更后的个人页面更加简约。它给你带来的Pinterest的,但确切的外观更优雅的外观。它有一个内置的主题选项面板中,您可以上传您自己的徽标和自定义的外观。

忘记wordpress管理员密码怎么办

可视情况采取以下办法重设wordpress管理员密码:

1、重新安装wordpress。
2、使用wordpress自带的找回密码功能。
3、把wordpress根目录下的wp-config.php文件删除,然后重新访问网站,这次会让你重新进行最后一个安装步骤,这样就可以设置新的wordpress管理密码。
4、修改数据库。进入phpmyadmin,找到wordpress数据库的wp_users表,在这里可以看到默认的用户admin, 它的密码是加密过的。
我们可以通过修改这条数据,找到user_pass这个域,把它原来的一长串数据删掉,写上你的密码,比如123456。
这时,再你会看到一个函数的下边框,把它选择为MD5。这是为了把你的密码进行MD5算法加密。
再保存。这样,就可以使用这个密码就可以登陆wordpress了。

怎样为wordpress博客添加个性图标

所谓favicon,即Favorites Icon的缩写,顾名思义,便是其可以让浏览器的收藏夹中除显示相应的标题外,还以图标的方式区别不同的网站。而且根据不同版本的浏览器,作用效果也会有差异。

为WordPress添加个性的favicon.ico,可以让网站个性标志显示在浏览器地址栏上和收藏夹中,加深访客对网站的印象。

 

favicon.ico添加方法:

先挑一张喜欢的图片,也可自己PS制作。DIY成16×16大小,通过相关图片制作工具,将其转换为扩展名为.ico,文件名为favicon的图片,即favicon.ico

方法一

1.把准备好的favicon.ico图标直接上传到WordPress所在的网站空间的根目录

2.保存更新文件文件,清除浏览器缓存即可以地址栏看到favicon图标

方法二

1.把准备好的favicon.ico图标上传到空间的某个目录(如根目录)

2.编辑主题文件header.php,在<head>和</head>之间添加以下代码:

<link rel=”shortcut icon” href=”favicon.ico” type=”image/x-icon” />/>
<link rel=”Bookmark” href=”favicon.ico” />
保存更新文件文件,清除浏览器缓存即实现效果

添加动态favicon图标的方法:

1.先挑一张喜欢的gif动态图片,调整成16×16大小,重新命名为favicon.gif

2.编辑WordPress主题文件header.php,在<head>和</head>之间添加以下代码:

<link rel=”icon” href=”favicon.gif” type=”image/gif” >
3.保存更新文件,清除浏览器缓存即可以地址栏看到favicon动态图标效果

30款精美简洁免费WordPress 主题

2012年年30款最佳精美简洁免费免费WordPress主题。

1.Axis

演示 | 下载

2. Big Square

演示 | 下载

free-wordpress-themes-01

3. The Morning After

演示 | 下载

free-wordpress-themes-02

4. Skeptical

演示 | 下载

free-wordpress-themes-03

5. JournalCrunch

演示 | 下载

free-wordpress-themes-04

6. Diary/Notebook

演示 | 下载

free-wordpress-themes-05

7. LightenMag

演示 | 下载

free-wordpress-themes-06

8. Delicate

演示 | 下载

free-wordpress-themes-07

9. Shaken Grid

演示 | 下载

free-wordpress-themes-08

10. Basico Dark

演示 | 下载

free-wordpress-themes-09

11. WordPress Anniversary Theme

演示 | 下载

free-wordpress-themes-10

12. Heliumified Reloaded

演示 | 下载

free-wordpress-themes-11

13. Magasin Uno Reloaded

演示 | 下载

free-wordpress-themes-12

14. Free Magazine Style WP Theme – Agency

演示 | 下载

free-wordpress-themes-13

15. Lucky Guess

演示 | 下载

free-wordpress-themes-14

16. ecoNews

演示 | 下载

free-wordpress-themes-15

17. Simplista WordPress Theme

演示 | 下载

free-wordpress-themes-16

18. Revolt Theme

演示 | 下载

free-wordpress-themes-17

19. Forsy

演示 | 下载

free-wordpress-themes-18

20. Reporter

演示 | 下载

free-wordpress-themes-19

21. WMag – premium magazine theme

演示 | 下载

wmag-premium-theme

22. Corporattica

演示 | 下载

free-wordpress-themes-21

23. Pengbo’s Inspiration

演示 | 下载

free-wordpress-themes-22

24. Owesome WordPress Theme

演示 | 下载

free-wordpress-themes-23

25. Pretty Face Theme

演示 | 下载

free-wordpress-themes-24

26. Framed Redux

演示 | 下载

free-wordpress-themes-20

27. Suburbia

演示 | 下载

free-wordpress-themes-26

28. Obscure

演示 | 下载

free-wordpress-themes-27

29. Casual

演示 | 下载

free-wordpress-themes-28

30. Bright Sky

演示 | 下载

free-wordpress-themes-29

31. Define

演示 | 下载

free-wordpress-themes-30

 

原文:http://www.cnblogs.com/lhb25/archive/2012/06/13/30-best-free-wordpress-themes-2011.html

 

php程序设计标准

介绍

标准化的重要性

如果在某些层面的标准造成了每个人的困扰,标准化可以让他们有个共同的游戏规则。
这份文件历经了许多专桉、公司的验证,正确的说法应该是经过了数週的争执。
这份文件避免了特殊的个人风格而且可以随时视情况调整。
正确的观点

当一个专桉尝试着遵守公用的标准时,会有以下好处:
程式设计人员可以瞭解任何程式码,弄清楚程式的状况
新人可以很快的进入状况
防止新接触php的人基于节省时间创造出一套自己的风格终其一生
防止新接触php的人一次次的犯同样的错误
在一致的环境下,人们可以减少犯错的机会
程式设计人员有了共同的敌人 🙂
错误的观点

现在轮到错误的观点了:
标准通常很愚蠢,因为它是不懂PHP的人所制定的
标准通常很愚蠢,因为它跟我做的不一样
标准降低了创造力
标准在长期互相合作的人群中是没有必要的
标准强调了太多结构
总之人们忽视标准
讨论

从许多专桉的经验中得知,採用程式设计标准可以让专桉进行的顺利些。
不过标准是成功的必要条件吗?当然不是!
但他们是有帮助的,我们需要任何可以取得的帮助!
老实说,大部分对于特定标准的争执多来自于自负不已的人。
在合理的标准中很少有所谓的技术缺陷,只是习惯的问题罢了。
所以脑子活一点,控制那样的自负思想,并且记得任何专桉都是基于一个团队的努力。

解释

惯例

在本文档中使用“要”字所指的是使用本规范的所有专桉需要遵守规定的标准。
使用“应该”一词的作用是引导个别专桉标准的组成,请依照词义适当的包含、排除或组合需求。

“也许”一词相近于“应该”,通常指的是次要的需求。

标准的执行

首先应该在开发小组的内部找出所有的最重要的元素,也许标准对您的状况还不够恰当。它可能已经概括了重要的问题,也可能还有人对其中的某些问题表示强烈的反对。 🙂
无论如何,只要最后顺利的话,人们将成熟的明白这个标准是合理的,然后其他的程式设计人员也会发现它的合理性,并觉得带着一些疑问去遵循这个标准是值得的。

如果没有配合的意愿,可以把这个标准改为要求,所有的程式码都必须基于这个编准做检验。

如果没有经过检验,唯一的解决方桉会困扰不断。
认同观点

不可能
也许可能,但是相当的薄弱与无趣
这是事实,我也已经告诉过你了
这是我先想到的
本来就应该这样
如果您带着否定的成见而来看待事物的话,请您保持开放的思想。
你仍可以做出它是废话的结论,但是做 出结论的方法就是你必须要能够接受不同的思想。请您给自己一点时间去做到它。
命名规则

合适的命名

命名是程式规划的核心。古人相信只要知道一个人真正的名字就会获得凌驾于那个人之上不可思议的力量。
只要你为事物想到正确的名字,将会为你自己以及后来的人带来比程式码更强的力量。别笑!

一个名称是事物在它所处的生态环境中一个长久而深远的结果,只有了解系统的程式设计人员知道如何建立”适合”这个系统的名称。如果名称恰当,许多事情就自然而然结合在一起,关係因此明确,意义因此容易传达,可以预期一般人心中所推论的结果。

如果您发现自己所有的命名都是东西与命令,您也许需要重新检视自己的设计。

物件名称

命名前记得确定它的用途,如果您无法想出它的用途,这表示您在这个设计中考虑的还不够
名称如果使用超过三个英文单字以上的组合字,这表示在您的系统中使用了令人困惑的变数元件。请重新检视您的设计,试着用一个CRC连线来确认您的物件是否比它们应该有的可信度更高。
避免被诱导为物件带来包含来源物件名称的命名,物件应该是独立的,不管它来自于哪裡。后置字元(Suffixes)在这种情况是非常有用的。例如,如果您的系统使用了 agents 这个词,能够换成像是 DownloadAgent 之类的词将会传达更多确定的资讯。
方法和函数命名

通常每个方法与函数都会执行一个动作,所以名称应该清楚的表达它会做什麽:用 CheckForErrors() 取代 ErrorCheck(), DumpDataToFile() 取代 DataFile()。这也会让函数与资料物件更容易辨别。
后置字元在下面情况是很好用的:
Max – 用来表示某件事物可以使用的最大值
Cnt – 用来计算数值的变数目前的数字
Key – 关键值
例如: RetryMax表示最大重试次数, RetryCnt 表示目前重试次数

前置字元在下面情况是很好用的:
Is – 询问一个关于某事物的问题,这样一来其他人看到Is 就会知道这是个问题
Get – 取得一个数值
Set – 设定一个数值
例如: IsHitRetryLimit.
缩写词不要全部使用大写字母

当遇到使用全部大写的英文单字比使用大小写溷用的单字更能够表达意义时,别理它!

使用: GetHtmlStatistic.
而不是: GetHTMLStatistic.
解释

当名称中包含缩写字时人们似乎有着非常不一样的直觉,最好只选定一个策略来让名称完全在人们的预料之中。
例如 NetworkABCKey ,要分辨C是来自于 ABC 而且 K 是来自于 key 容易造成困扰。有些人不在意,而其他人则非常讨厌这麽命名,所以您将会发现在不同的程式码中有着不同的规则,您将会因此永远不知道如何称呼某个事物。
范例

class FluidOz // 不要用 FluidOZ
class GetHtmlStatistic // 不要用 GetHTMLStatistic
物件(Class)命名

使用首字大写的单字来区隔组合字,单字的其他字母则为小写
名称的第一个字是大写
不要使用底线 (‘_’)
解释

在所有不同的命名策略中,许多人发现这样子可以让大部分人妥协
范例

class NameOneTwo
class Name
物件库(Class Library)命名

现在名称空间变成广为使用的工具,名称空间用来避免物件在不同的厂商与团体间发生名称冲突的情形
当您未使用名称空间时,通常在物件名称前会加上唯一的前置字元,两个字元就够了,更长的也可
范例

John Johnson的完整资料结构库可以使用前置字元JJ ,所以物件变成:
class JjLinkList
{
}
方法(Method)命名

使用与物件一样的规则
解释

在所有不同的命名策略中,许多人发现这样子可以让大部分人妥协
范例

class NameOneTwo
{
function DoIt() {};
function HandleError() {};
}
物件属性(Class Attribute)命名

物件成员属性名称应该以’m’开头
在’m’之后使用与物件一样的命名规则
‘m’ 通常出现在任何前置字元之前,像是代表参照的 ‘r’
解释

开头加个 ‘m’ 可以避免与方法的名称冲突,方法与属性的名称经常很相近,特别是对于存取者
范例

class NameOneTwo
{
function VarAbc() {};
function ErrorNumber() {};
var $mVarAbc;
var $mErrorNumber;
var $mrName;
}
方法参数(Method Argument)命名

第一个字元必须用小写
在第一个字元后的所有单字应该像物件名称一样使用首字大写
解释

您可以轻易的辨识出哪个变数在变数之间传递
范例

class NameOneTwo
{
function StartYourEngines(&$someEngine, &$anotherEngine) {
$this->mSomeEngine = $someEngine;
$this->mAnotherEngine = $anotherEngine;
}

var $mSomeEngine;
var $mAnotherEngine;
}
变数(Variable)命名

全部使用小写字母
使用底线 ‘_’ 区隔不同的单字
解释

这样一来程式码中的变数将清楚明瞭
所有的变数看起来都不一样且在程式码中可以辨识
范例

function HandleError($errorNumber)
{
$error = new OsError;
$time_of_error = $error->GetTimeOfError();
$error_processor = $error->GetErrorProcessor();
}
阵列元件(Array Element)

阵列元件名称依循变数的规则

使用底线 ‘_’ 区隔不同的单字
不要使用减号 ‘-‘ 做为单字的区隔
解释

如果使用减号 ‘-‘ 做为单字区隔,程式会产生使用跳脱字元的警告讯息
范例

$myarr[‘foo_bar’] = ‘Hello’;
print “$myarr[foo_bar] world”; // 将会输出: Hello world
$myarr[‘foo-bar’] = ‘Hello’;
print “$myarr[foo-bar] world”; // 警告讯息
单引号或双引号

使用单引号或双引号来存取阵列的元件
不要使用包含跳脱字元的引号
解释

除了神奇引号外,如果阵列没有使用引号,一些 PHP 的设定会输出警告讯息
范例

$myarr[‘foo_bar’] = ‘Hello’;
$element_name = ‘foo_bar’;
print “$myarr[foo_bar] world”; // 将会输出: Hello world
print “$myarr[$element_name] world”; // 将会输出: Hello world
print “$myarr[‘$element_name’] world”; // 语法错误
print “$myarr[“$element_name”] world”; // 语法错误
参照变数(Reference Variables)与函数传回参照( Functions Returning References)

参照应该以字元’r’开头.
解释

这样一来在变数种类之中容易区分
它可以确定哪个方法返回可更改物件,哪个方法返回不可更改物件
范例

class Test
{
var $mrStatus;
function DoSomething(&$rStatus) {};
function &rStatus() {};
}
全域变数(Global Variables)

全域变数应该使用前置字元 ‘g’
解释

知道变数的作用范围是很重要的
范例

global $gLog;
global &$grLog;
定义(Define)命名与全域常数( Global Constants)

全域常数应该使用全部大写的组合字,并且用底线 ‘_’ 区隔
解释

全域常数一直以来都是用这个方式命名,您必须要小心避免与系统预设常数冲突
范例
define(“A_GLOBAL_CONSTANT”, “Hello world!”);
静态变数

静态变数也许可以用前置字元 ‘s’
解释

知道变数的作用范围是很重要的
范例

function test()
{
static $msStatus = 0;
}
函数(Function)命名

在C GNU大会上讨论的结果,PHP的函数命名全部使用小写字母且以底线 ‘_’ 做为区隔
解释

这样一来函数就会跟物件相关名称有很大的差异
范例

function some_bloody_function()
{
}
错误返回检测规则

检查所有系统呼叫传回的错误讯息,除非您要忽略错误。
每个系统错误讯息都包含系统错误文字
大括弧 {} 规则

在三种主要的大括弧配置策略中,有两种是比较被接受的,而下面的第一种通常是比较多人採用的:
将开始的大括弧放在关键字的下一行,而结束的大括弧放在最后且独立的一行中:
if ($condition) while ($condition)
{ {
… …
} }
传统的UNIX程式码会把开始的大括弧与关键字放在同一行,而结束的大括弧放在最后且独立的一行中:
if ($condition) { while ($condition) {
… …
} }
解释

虽然两种格式都可以被接受,但是许多人还是觉得第一种比较舒服;至于为什麽,那就是心理学家研究的范围了
大家宁可选择第一种格式的理由比心理学家还多,如果您使用的文字编辑器(例如 VI)支援大括弧的对称显示,第一种会比较好。理由是,当您想知道一个大区块中程式码结束的位置,您可以移到开始的括弧点一下,编辑器会自动找到结束的括弧。例如:

if ($very_long_condition && $second_very_long_condition)
{

}
else if (…)
{

}
在区块间移动您只需要在开始的括弧点一下,您不需要捲动画面就可以让游标很快的在区块间来回。
缩排/跳位/空格 规则

在每一层用四个空白当缩排
不要使用跳位键( tabs ),使用空白;大部分的编辑器都可以将跳位转换为空白
使用刚好的缩排即可,不要滥用。没有明确的规则限制最多可以使用几层缩排,不过如果缩排的层次大于4或5层,您也许需要将程式码作适当的切割
解释

当其他人使用了不同的跳位键设定,就会因此无法(难以)阅读或列印,因此空白会比跳位键好
大部分的PHP应用程式使用4个空白
大部分的编辑器预设也是4个空白
许多人尝试要去限制最多可以使用的缩排阶层数,但是通常无法落实。我们相信程式设计人员会聪明的选择巢状程式码的深度
范例

function func()
{
if (something bad)
{
if (another thing bad)
{
while (more input)
{
}
}
}
}
小括弧()的关键字与函数规则

不要将小括弧放在关键字的旁边,记得加个空白
将小括弧放在函数名称的旁边
非必要时别在传回值放上小括弧
解释

关键字不是函数,如果将小括弧放在关键字的旁边(不加空白),关键字跟函数会容易造成浑淆
范例

if (condition)
{
}

while (condition)
{
}

strcmp($s, $s1);

return 1;
别在物件架构期做实际的工作

别在物件的建构子中执行实际的工作,建构子应该只有拿来组态变数且/或执行不能够发生错误的工作
例如在完成组态的物件中建立一个方法 Open() 时,Open() 应该在物件完成组态后才去呼叫它

解释

建构子无法传回错误讯息
范例

class Device
{
function Device() { /* initialize and other stuff */ }
function Open() { return FAIL; }
};

$dev = new Device;
if (FAIL == $dev->Open()) exit(1);
让函数重複执行

函数不应该保留静态变数,以避免函数被重覆执行
If Then Else 格式

配置

这是任由程式设计人员决定的,不同的括弧配置看起来只会有些许的差异;通常会像这样:
if (condition) // Comment
{
}
else if (condition) // Comment
{
}
else // Comment
{
}
如果您的程式码有else if ,加个 else 的区块来找到没有处理过的情况,或许可以在此放个记录,即使它不需要任何矫正的动作
条件格式

尽可能将常数放在运算子左边,例如:
if ( 6 == $errorNum ) …

其中一个理由是当您少了一个等号时系统会产生错误讯息;第二个理由是当您希望寻找变数中放了什麽数值时,您可以在开始的地方找到,而不是在结束的地方。这需要一点时间适应,但是这真的很有帮助!

switch 格式

如果一个条件的程式会同时执行下一个条件的程式(注意看范例的第一个case没有break),记得加个备注
default 不管怎麽样都应该保留,如果不应该有预设值记得在裡面放入错误讯息
如果您需要建立变数,将程式码放在区块中
范例

switch (…)
{
case 1:

// FALL THROUGH

case 2:
{
$v = get_week_number();

}
break;

default:
}
continue,break 与?:的使用时机

Continue 与 Break

Continue 与 break 就像是 gotos 一样,所以放在这边
Continue 与 break 跟 goto 一样尽可能不要去用它

使用 continue 有两个比较主要的问题:

它也许会略过测试的条件
它也许会略过增加或减少的程式码
下面这个例子中两个问题都会发生:

while (TRUE)
{

// A lot of code

if (/* some condition */) {
continue;
}

// A lot of code

if ( $i++ > STOP_VALUE) break;
}
注意:要让程式设计人员无法轻易的找出问题 ,”很多的程式码”是必要的
在上面的例子中,我们可以说:在同一个迴圈中同时使用 continue 与 break 必然会是个灾难

?:

这会发生问题的原因在于,人们总是喜欢在? 跟 : 之间塞进大量程式码;下面有几个清楚的规则可以遵循:
在条件的叙述中使用小括弧,藉此与其他程式码产生区隔
测试的动作最好是单纯的函数
不要把 then 与 else 的描述放在同一行,儘管它是可以放在一起
范例

(condition) ? funct1() : func2();

or

(condition)
? long statement
: another long statement;
定义区块的对齐

定义的区块应该要对齐
解释

清楚
相近的变数组态区块应该做同样的对齐
符号 “&” 应该放在靠近变数类型的地方,而不是名称
范例

var $mDate
var& $mrDate
var& $mrName
var $mName

$mDate = 0;
$mrDate = NULL;
$mrName = 0;
$mName = NULL;
一行一个描述

即使描述之间是相当的接近,还是应该将它分成一行一个描述
短方法

方法的程式码应该限制在一个页面(画面)可以看到的数量
解释

因为每个方法代表着完成一个目标所需要的技术
大部分没有使用到的参数最后都会变成 false
实际的函数呼叫会比没有还慢,但是必须要想清楚再决定 (是否要这麽早将程式码最佳化)
放一个空值( Null )的描述

即使迴圈不需要其他描述,在 for 或 while 的描述中记得放上一个空值( Null )的内容,这样才能够清楚的知道程式是刻意这样子做而不是忘记输入
while ($dest++ = $src++)
; // VOID
如果测试值不为零则不要做为 if 的预设值

不要将不为零的测试值当预设值,例如:
if (FAIL != f())
会比下面这样好:
if (f())
即使 FAIL 也等于数值零,会让PHP判断为错误( false )。如果其他人决定要将错误的回传值定义为 -1 而不是 0 时,一个明确的测试值会很有帮助。又即使比较的数值一定不会改变,明确的比较运算还是必要的!例如 if (!($bufsize % strlen($str))) 应该改写为 if (0 == ($bufsize % strlen($str))) 来反应测试值的自然数(不是布林数)。经常发生一个错误是使用 strcmp 来测试字串是否相等,结果就永远不会是预设值。
不为零的测试值经常被当做 if 的预设值,而这样子其他函数或程式就会受到下面这样的限制:

回传值为 0 才是 false,其馀免谈
这样子对于回传值为 true 的情况太过广泛,等于呼叫一个 IsValid(), 而非 CheckValid()
自相矛盾的布林类型

不要用1 (TRUE, YES, etc.)来检查布林数值,将它改为不等于0 (FALSE, NO, etc.)。因为大部分的函数保证会在 false 的情况时传回 0 ,但是true 的状况会传回任何不为零的数值,所以…

if (TRUE == func()) { …
应该要改写为
if (FALSE != func()) { …
避免嵌入式工作

嵌入式工作可以节省时间与空间,但是某些人认为这样子除了让程式码变的庞大且难以阅读外没有更好的优点。
while ($a != ($c = getchar()))
{
process the character
}
++ 与 — 两个运算子是使用指派描述来完成运算,所以在很多情况下执行函式会有些副作用;使用嵌入式指派描述也许会增加执行效能,但是你必须同时考虑加速与不容易维护两种结果,例如:

$a = $b + $c;
$d = $a + $r;
不应该写成
$d = ($a = $b + $c) + $r;
即使后者可以节省一个週期,在长时间的执行中,加速器的成熟会让两者的差异会越来越小;不过后者在维护上会较困难
重複使用您以及其他人努力的成果

如果没有适当的基础架构,在不同的专桉之间重複使用程式码几乎是不可能的;而物件通常也只符合所需的服务,不同的专桉有着不同的服务环境,使得重複使用物件相当困难。
发展一个基础架构可以让设计的工作轻鬆许多,不管怎麽样,在还没开始之前,下面有几个技巧可以用来鼓励重複使用程式码:

别担心函式库太小

重複使用程式码最大的敌人就是人们不习惯将函式库脱离他的程式码,一个可以重複使用的物件也许藏在一个程式的资料夹中而且不易与人分享,因为程式设计人员不会将物件分解或是将物件放入函式库中
其中一个理由是人们不喜欢製作小的函式库,总觉得这样怪怪的;别闹了,电脑不会在乎你使用了多少函式库

如果你有可以重複使用的程式码而且无法放在既有的函式库,麻烦就建立一个新的吧!如果人们真的去思考重複使用的好处,这个函式库不会一直这麽小的!

如果你担心在函式库异动或新增的时候必须去更新 makefiles ,那就不要在 makefiles 中引入(include)函式库,试着去引入想法或是服务 。 基础层级的 makefiles 定义了服务是由一堆函式库所组成,更高层级的 makefiles 指定它们需要的服务,当一个服务的函式库有了异动,你只需要去修改较低层级的 makefiles 。

维持一个资料库

大部分的公司并不知道他们到底有哪些程式码,而且大部分的程式设计人员仍然不会告诉其他人他完成了什麽或是询问其他人什麽已经做好了。而解决的方式就是去维护一个程式资源的资料库。
在理想的状况下,程式设计人员可以从网页浏览或搜寻包装好的函式库清单,并且取得他们需要的部份。如果你能建立这样一个让程式设计人员自愿维护的系统,那就太棒了;甚至如果能够记录重複使用的状况更好。

另外一个方法就是自动从程式码中产生一个资料库,这是基于使用通用的物件、函数、函式库与子系统标头,这样子同时可以完成说明页面与资料库。

注解中的注解

注解应该像是说个故事

让你的注解像是描述这个系统的一个故事,预期你的注解会被自动程式从程式码中取出然后格式化成说明页面;而物件的注解就是这个故事的一部分,函式注解、函式参数与函式的配置则是故事的另外一个部份。所有的内容应该编织在一起,并且在另一个时间点告诉某人你做了些什麽以及为什麽这麽做
写下为什麽这麽做

注解应该说明你的决定,在任何一个你必须做出决定的地方留下注解说明你做了什麽决定以及为什麽,考古学家会从裡面找到最有用的资讯
使用标头( Headers)

使用像是 ccdoc 的文件抽离系统,文件中的其他部分说明如何使用 ccdoc 来完成一个物件与函式的文件。
这些标头使用同样的规则结构化,这样一来它们可以被分析与分离。他们不像是一般的标头,所以花点时间去完成填写。如果你一次作对,你就不需要另外製作文件了!

注解配置

专桉的每个部份都该有个特别的注解配置方式
明确的抓住重点

明确的对以下事情加以注解:在正常的控制流程之外所发生的变数变化; 在维护时很可能会被弄坏的程式码。使用内嵌关键字来指出程式要点与潜在问题。 想像有一个自动程式,它会剖析您的注解以寻找关键字,然后取出关键字所指的 内容,再製作出一份报告,好让大家在需要解决的地方予以特别处理。
搜寻关键字﹝Gotcha Keywords﹞
:TODO: 主题
表示这裡还有工作尚待完成,不要忘记了。
:BUG: [bugid] 主题
表示这裡有一个已知的臭虫,并加以解释,或许再给一个臭虫编号。
:KLUDGE:
当您很笨拙的完成某件事情时,就明白的说出来,并说明您下次想採取 怎样不同的方法去做,如果您还有时间的话。
:TRICKY:
告诉别人以下的程式码是非常有技巧的,请不要不加思索的修改它。
:WARNING:
要注意某件事情。
:PARSER:
偶尔您必须设法解决程式语言剖析器所产生的问题。请加以注明。这个剖析器的 问题终会被修正。
:ATTRIBUTE: value
这是个一般格式,说明该注解所内含的属性。您可以创造您自己的属性,它们 也会被析取出来。
搜寻格式﹝Gotcha Formatting﹞

将搜寻关键字放在注解的最前面,亦即第一个符号。
注解也许会包含好几行,然而第一行必须是独立而有意义的简要说明。
作者的名字与注解的日期也应该写在注解裡面。这两项资讯虽然也可以 在原始码的仓储装置中找到,但是这或许需要一段时间才能查明这段注解 到底是谁、在什麽时后所加上去的。通常这会浪费许多时间去搜寻。 将日期资讯写在注解裡面,可以让其他程式设计师在做决定时有所依据。 将作者资讯写在注解裡面,可以让我们知道应该找谁问问题。
范例

// :TODO: 年月日 960810: 执行效率问题
// 其实我们应该在这裡使用杂凑表,但是现在先使用线性搜寻。

// :KLUDGE: 年月日 960810: 不安全的强制转型
// 这裡我们需要作一个强制转型,以回复原本的衍生型别。或许我们应该
// 使用一个 virtual method、或是使用 template。

相关资讯

请参考介面文件与实作文件来了解文件格式的细节。
介面文件与实作文件

文件主要是为两种人製作的:
Class 使用者。
Class 实作者。
只要在撰写程式时事先考虑到文件的製作,我们就可以从原始程式码中直接 取出上述的两种文件。
Class 使用者
Class 使用者需要类别介面的资讯,如果标头档的结构正确,这些介面资讯可以直接 从标头档中取得。当您在档桉表头的注解区块中,为某个 class 撰写注解时,要记得 使用该 class 的程式设计师只需要知道如何去使用该 class。不要在注解中深入讨论 实作上的演算法细节,除非这是该 class 的使用者应该要知道的。把标头档中的注解 当作是以后要加入说明书的一部份。
Class 实作者
Class 实作者需要知道该 class 如何实作的深入细节。这些资讯可以在在原始码档桉中 的注解找到。不要担心介面的问题。原始码档桉的表头注解区块中,应该涵盖演算法议题, 与其他设计上的决定。在 method 实作的注解区块裡,应该有更详细的讨论。
目录文件

每个目录裡面都应该一个 README 档桉,其内容包括:
建立这个目录的目的,以及这个目录裡面包含些什麽。
档桉列表,每个档桉都应该有一行说明。这行说明通常是取自该档桉表头的 NAME 属性。
建置与安装的指导。
将大家引导到相关的资源:
原始码的目录。
线上文件。
纸张文件。
设计文件。
其他有帮助的东西。
假设有某个专桉,每位开发成员都离开了,六个月后,有新人进来。这位孤独害怕的 探索者,就可以藉着遍历原始码的目录树,阅读每个 README 档桉、Makefiles、与 原始码档桉的表头,来拼凑出该专桉的面貌。
开放/封闭原则 ﹝Open/Closed Principle﹞

Software entities should be open for extension, but closed for modification. (Bertrand Meyer)

开放/封闭原则的意思是,一个 class 在扩充方面应该是开放的,而在修改方面是封闭的:
所谓的开放,意即我们可以对一个 class 加以扩充。
所谓的封闭,意即我们只能对 class 予以扩充,而不能加以修改。其想法是,一旦某个 class 已经被证明是可用的,而已经进入程式码检讨、单元测试、与其他品管程序,您就不可以 对它进行修改,而只能扩充它。
开放/封闭原则所高唱的是稳定性。扩充一个系统的方法,应该是加入新的程式码, 而不是对已经可以使用的程式码加以修改。程式设计师通常不是很喜欢去修改旧的 程式码,因为它们没有问题!这个原则只是给您一个学术上的依据,让您可以安心 🙂
在实际上,开放/封闭原则就是要我们好好利用抽象化﹝abstraction﹞与多型 ﹝polymorphism﹞这两个老朋友。使用抽象化来釐出通用的过程与想法。 使用继承来建立出衍生类别必须遵守的程式介面。

伺服器设定

本节包含某些 PHP/Apache 组态的指导原则。
HTTP_*_VARS

HTTP_*_VARS可能是开启或关闭的。当开启时,所有变数都必须以$HTTP_*_VARS[key] 的方式来存取。当关闭时,所有变数则可以直接使用 key 的名称来存取。
使用HTTP_*_VARS来存取变数。
在PHP组态中,将HTTP_*_VARS设为开启。
解释

每个PHP组态都会有HTTP_*_VARS。
使用HTTP_*_VARS来存取变数不会与程式码中的变数名称相抵触。
使用者无法以给值的方式来更改变数的值。
PHP档桉副档名

PHP档桉有许多不同的副档名﹝.html,.php,.php3,.php4,.phtml, .inc,.class…﹞。
永远使用 .php 这个副档名。
永远使用 .php 这个副档名来命名您的类别与函式库档桉。
解释

使用 .php 可以让我们对其它不以 .php 做副档名的档桉开启快取。
使用 .inc 与 .class 可能会产生安全性的问题。在大多数伺服器的设定中, 这些副档名并不是可执行的。因此,当远端的使用者存取这些档桉时,这些档桉 不会被送给剖析器去执行,而是原原本本的显示在浏览器中。
其他

本节要说明哪些是可以做的、哪些是不能做的。
在需要整数的地方,请不要使用浮点数。拿浮点数当作迴圈计数器,等于是拿一把枪 来射自己的脚。在比较浮点数的大小时,请使用 <= 或 >=,绝对不要用刚好等于 或不等于的比较运算子﹝== 或 !=﹞。
不要倚赖自动化的程式码美化工具。使用良好的程式风格,获益最大的还是程式设计师自己。 特别是在设计阶段早期,使用手写方式来撰写演算法或虚拟码的时候,更需要好的程式风格。 美化程式码的自动工具只能适用于已撰写完毕、而且语法正确的程式,它不能使用在还需要 对空白字元与缩排字元加以注意的撰写阶段。谨慎的程式设计师都会对程式细节加以注意, 因此,他们为函式或档桉所编排出的格式会更为清楚﹝换句话说,谨慎的程式设计师不会只 依循语法来编排程式码,它们会在需要注意的地方,刻意编排出突显的格式,以便在阅读时 能一目了然,自动美化工具无法知道程式设计师的心思,它会把用心编排出来的格式破坏殆尽。﹞ 草率的程式设计师应该学习如何去当一位谨慎的程式设计师,而不是倚赖自动美化工具来使 他们的程式码好读一些。最后要说的是,自动美化工具并不是很简单的程式,它必须对原始码 进行剖析,特别设计这麽一个複杂的程式来美化程式码,实在是不怎麽值得。程式码美化工具 的最佳用途,是将程式码产生器所产生的如野草般杂乱的程式码予以美化。
程式设计师偶尔会在逻辑比较运算子中少打一个 “=”,这也是一个问题。 下面的程式码是很令人困惑的,而且也常会出错。
if ($abool= $bbool) { … }
这位程式设计师真的是要写一个指定式吗?很可能是,但是通常不是。解决这种问题的方法, 就是不要这样写。将指定式与逻辑比较式分开来写,不要将两者溷在一起。建议的格式是, 先执行指定式,再执行逻辑比较:
$abool= $bbool;
if ($abool) { … }
使用 if (0) 来注解程式码区块

有时候,您需要将很大的程式码区块注解起来,以便测试。最好用的方法 是使用 if(0) 区块:
function example()
{
一堆程式码

if (0) {
许多程式码
}

更多程式码
}
您不能使用 /**/ 的方式来注解一大块程式码,因为注解裡面不能再包含 注解,而且很肯定的,一大块程式码裡面一定会包含有注解,不是吗?

不同的存取函式风格

实作存取函式

存取函式的建立有两种主要风格。
Get/Set

class X
{
function GetAge() { return $this->mAge; }
function SetAge($age) { $this->mAge = $age; }
var $mAge;
};
个人并不欣赏Get/Set风格。它会让程式码裡面充斥了一堆 Get 与 Set。
但是它有一个好处,在处理网路讯息时,我们可以在 Set 函式裡面将本机的 位元组顺序﹝byte order﹞转换成网路的位元组顺序。

属性物件﹝Attributes as Objects﹞

class X
{
function Age() { return $this->mAge; }
function Name() { return $this->mName; }

var $mAge;
var $mName;
}

$x = new X;

// 范例 1
$age = $x->Age();
$r_age = &$x->Age(); // 属性的参考﹝Reference﹞

// 范例 2
$name = $x->Name();
$r_name = &$x->Name(); // 属性的参考﹝Reference﹞
从函式名称来看,属性物件的函式名称很简洁。请儘可能使用这种方式来存取属性。
阶层

阶层式设计是减低系统複杂度的主要技术。一个系统应该被分割成数个阶层。 某个阶层可以使用定义良好的介面来与邻近阶层进行沟通。如果一个阶层可以 接触到非邻近阶层时,就违背了阶层设计的原则,称之为「阶层违背」。
「阶层违背」的发生,就表示有两个阶层之间的互依关係,不是经由良好定义的介面来产生的。 当其中一个阶层有所改变时,程式码可能会无法运作。我们不希望程式码无法正常运作,所以 要求每个阶层只能与邻近阶层进行沟通。

有时候,为了改善执行效率,我们需要跳过几个阶层。这没有问题,但是我们 应该要知道自己正在违背阶层原则,并应该在文件中加以说明。

程式码检讨﹝Code Review﹞

如果您能够对程式码进行一次正式的检讨会议,我向您脱帽致敬。程式码检讨是非常有帮助的。 不幸的是,它们总是会转变成吹毛求疵的会议,无止境的在愚蠢的事情上互相争论。 它们也总是会佔据许多人的时间,而无法产生预期的效果。
天阿,这个人在质疑程式码检讨的必要性,他一定不是工程师!

也不尽然,我所要质疑的,只是程式码检讨的会议形式,以及在延期又溷乱 的专桉中进行程式码检讨的效果。

首先,程式码检讨只能在专桉后期举行,它来得太迟了,无法产生任何帮助。 真正需要检讨的,是需求规格与设计规格。这才是您可以获得更大成效的地方。

将相关人员集合在一个房间。把他们锁在裡面。完整的审视程式介面设计,以及需求 规格,直到前者的设计令人满意,后者的需求也都达成。将所有相关人员集中在一个 房间裡面,可以让这个过程产生良好的效益,因为问题可以被立即回答,观点可以被 立即探讨。通常,这种会议只要举行两三次就很够了。

如果上述的过程圆满达成,程式码撰写工作就不会有什麽问题。如果您在程式码检讨 中发现问题,而这个问题是某人花了许多时间与精神不停测试所发现的,您最好回去将 程式码重新写过一遍。

您仍然会想要做程式码检讨,那只要在一旁进行就好了。找几位您信得过的人, 阅读可能有问题的程式码,并将建议直接告诉程式设计师。如此,程式设计师与审查者 就可以讨论各种观点,并将它们实行出来。电子邮件与快速犀利的讨论是很好的方式。 这种方式符合检讨的目的,也不会一次用掉六个人的时间。

提早且不是经常建立原始码控制系统

在专桉生命週期中,应该安装一个共用的建置系统与原始码控制系统,愈早安装愈好, 最好是在开始撰写程式码之前就安装完毕。原始码控制系统是让专桉结构保持完整的 黏着剂。如果程式设计师不能轻易的使用他人的成果,您就永远无法製造出可以重覆 生产的建置版本,也会浪费大家许多时间。将一个失控的建置环境改建成标准系统, 也是很糟糕的事情。每个专桉都有权利去建立它自己的客製环境,这个道理似乎是对的, 但是该客製环境却总是无法运作得那麽对。
某些要点必须牢记在心:

一般来说,像 CVS 这种共享原始码环境,最适用于极大型专桉。
如果您要使用 CVS,请使用 参考建置树﹝reference tree﹞ 的方式。这种方式会将各个建置版本储存在一个主建置树﹝master build tree﹞中。 程式设计师只从工作中的建置版本中取出原始码,而且只取出欠缺的部份, 因为 make 系统会使用该建置版本来找出本机上所没有的档桉。 使用-I 与 -L旗标让这个系统在设定上容易一些。 先在本机上搜寻档桉与程式库,然后再到参考建置﹝reference build﹞中搜寻。 这个方式可以节省磁碟空间与建置时间。
磁碟空间愈大愈好。现在的磁碟机又大又便宜,实在没有理由不去保存数份建置版本。
让简单的事情更简单。在文件中说明如何进行下列事项,应该是非常简单的事情:
如何取出模组来建置。
如何更改档桉。
如何将新的模组加入系统中。
如何删除模组与档桉。
如何将所做的更改存入系统中。
可以用的函式库与引入档有哪些。
如何取得建置环境,包含所有的编译器与其它工具。
製作一个网页、文件、或是其他类似的东西。不要让新到的程式设计师 到处要求老手透露一下建置的秘诀。

每次存入﹝checkin﹞时都做一次日志注解是很有用的。这些注解应该每晚蒐集起来, 并传送给相关单位。
相关资讯

如果您的钱够多,许多专桉发现 Clear Case 是个好系统。也有许多完全可以运作的系统是建立在 GNU 的 make 与 CVS 上面。CVS 是一个建立在 RCS 上面的 freeware 建置系统。它与 RCS 之间的 主要差异是,它为建置中的软体提供了一个共享档桉模式。
提早且不是经常建立错误追踪系统

愈早习惯使用臭虫追踪系统愈好。如果您在专桉进度3/4的时候才安装臭虫追踪系统, 没有人会去使用它。您必须早一点安装臭虫追踪系统,让大家去使用。
程式设计师通常很不喜欢去追踪臭虫,然而一旦使用正确,它会对专桉有很大的帮助:

问题不会被丢下不管。
问题会被自动转到负责人手中。
问题的生命週期会有追踪记录,让大家有足够的资讯可以互相讨论。
经理可以依据该系统中的臭虫数量与类型,来拟定重要的进度表与幕僚决策。
组态管理﹝configuration management﹞有希望与修补问题的补丁保持一致。
QA﹝问答集﹞与技术支援和开发人员之间有一个沟通的媒介。
以上各点,虽然不是什麽迷人的事情,但是它们让专桉有良好扎实的进步。
原始程式码的版本控制应该连结到臭虫追踪系统上面来。当专桉进行到释出软体前的 程式码冻结阶段时,版本控制系统应该只接受带有合法臭虫ID的存入动作﹝checkin﹞。 当程式码的臭虫被修正完毕后,该臭虫的ID也应该包含在checkin的注解中。

遵守责任区分

软体模组的责任是有所区分的。模组的维护可能是某人的责任,或是大家共同的责任。 请遵守这样的责任区分。不要去修改不属于您负责的模组。否则,只会引起 错误与不愉快的经验。
请面对这样的事实,如果某段程式码不属于您维护,就请放弃自己去修改它的念头。 程式码的来龙去脉是很複杂的,您认为相当合理的事情,可能到头来完全是错误的。 如果您需要修改某个地方,只要请负责该程式码的人去修改就好了。或是在您进行 修改之前,先询问他们是否可以做这样那样的改变。如果他们说好,那就可以去改, 否则就请不要动您的编辑器。

每个规则都有例外的情形。如果在清晨三点钟,您需要做一个修改,以释出一个 可以使用的版本,那麽您就必须改下去。如果负责人正在休假,而且该模组没有 指定代理人,您也必须改下去。当您修改别人所撰写的程式码时,请试着使用他们 所採用的程式码风格。

某些特别敏感的程式码在修改之后会对其他地方造成影响,负责的程式设计师必须在这些程式码 中加入注解。如果修改某个地方的程式码,也必须对另一地方的程式码进行修改,那就 要在注解中加以说明。如果资料格式的改变会与储存的资料产生冲突、或是与送至远端电脑的讯息 不一致,也要在注解中加以说明。如果您试着减少记忆体的使用量,或是想达成某种目标, 也请在注解中说明。不会有人聪明到可以猜出您心中的想法。

最不可原谅的是,把整个系统的程式码全部改过一遍,以符合您个人的程式风格。 请保持礼貌。如果某人没有按照标准来撰写程式码,就请他们修正,或是 请您的经理来要求他们。

如果模组是由大家一起维护的,就要特别小心。坚持不做剧烈的修改,以免产生难以解决的 版本冲突。在程式档中加入注解,说明这个程式档的扩增方法,好让每个人都遵循这个规则。 试着在共用的程式档中使用相同的程式结构,免得其他人必须摸索着去寻找所要的 程式码,找到以后也不知道如何去修改它。每次修改完程式码,立即将新版程式码 储存进版本控制软体中,以避免版本冲突的发生。

另外一提,追踪臭虫也是一种必须指定的模组责任。

PHP程式码标籤

PHP 标籤﹝Tags﹞是用来标示出夹杂在 html 中的 PHP 程式码。有许多标示方法可以使用。 , , , <% %>,以及。某些方法可能在您的 PHP 设定 中被关掉了。
使用
解释

在任何的系统与安装过程中都是可以使用的
范例

// 会列印出 “Hello world”

// 会列印出 “Hello world”

// 会列印出 “Hello world”

<% print “Hello world”; %> // 会列印出 “Hello world”

// 会列印出 $street 这个变数的值
避免使用不可思议的数字

不可思议的数字﹝magic number﹞,就是光熘熘的出现在原始程式码中的数字。 它们之所以不可思议,是因为没有人知道这些数字的意思是什麽,甚至连原始作者 也会在三个月后完全忘记它们的意思。例如:
if (22 == $foo) { start_thermo_nuclear_war(); }
else if (19 == $foo) { refund_lotso_money(); }
else if (16 == $foo) { infinite_loop(); }
else { cry_cause_im_lost(); }
在上面的例子中,22 与 19 的意思是什麽?您又怎麽能够知道,这些数字曾经被修改过, 或是这些数字根本就是错误的?

频繁的使用不可思议的数字,表示该位程式设计师只不过是业馀的。这样的程式设计师 可能从未在开发团队的环境中工作过,否则,如果他们需要去维护程式码,那他们铁定不会 这样做。

请绝对不要在程式码中写下不可思议的数字,改用有意义的名称来代表它们。您应该使用 define()。例如:

define(“PRESIDENT_WENT_CRAZY”, “22”);
define(“WE_GOOFED”, “19”);
define(“THEY_DIDNT_PAY”, “16”);

if (PRESIDENT_WENT_CRAZY == $foo) { start_thermo_nuclear_war(); }
else if (WE_GOOFED == $foo) { refund_lotso_money(); }
else if (THEY_DIDNT_PAY == $foo) { infinite_loop(); }
else { happy_days_i_know_why_im_here(); }
这样不是好多了吗?
轻巧相对于庞大的物件介面

一个物件应该有多少method?正确的答桉当然是刚刚好,我们称之为「歌蒂拉克程度」 ﹝Goldilocks level,程度适中的意思﹞。但是「歌蒂拉克程度」是什麽样子?答桉是, 它不存在。您必须依据实际情形来拿捏method的数量,这就是为什麽我们需要程式设计师 🙂

两种极端的设计是,轻巧类别﹝thin classes﹞与庞大类别﹝thick classes﹞。轻巧类别 是最低限度的类别,它所拥有的method愈少愈好。一般来说,使用者会继承轻巧类别来衍生 出他们自己的类别,并在衍生类别中加入所需要的method。

轻巧类别或许看起来很「乾淨」,但是实际上并非如此。轻巧类别没有多大的用途,它的 主要目的只是为了建立起一个型别。正因为轻巧类别没什麽实际功用,所以在同一个专桉 中的每位程式设计师,都会衍生出他们自己的类别,而且他们在衍生类别中所加入的method, 基本上都是一样的。这就造成了程式码重複开发的问题,而违背了当初採用物件的方法来 开发程式的目的─让同一份程式码可以重覆使用。解决这个问题的方法,就是把新增的method 往上放到基底类别中。如果往上放的method很多,基底类别就会变成庞大类别。

庞大类别有很多method。您想在它裡面加入多少method都可以。这会产生什麽问题吗?也许不会。 如果要加入的 method 与该类别有直接的关连,那把它们放在该类别裡面就不会有什麽问题。 真正的问题是,有些人会开始懒惰,把有些应该放到别的类别的method,即使与该类别只有一点点关连, 也一併新增到该类别裡面。在这裡,我们需要再次做出正确的判断。

庞大类别还有其他的问题。愈庞大的类别,愈不容易了解,程式码之间的互动更不可预期, 因此也更难除错。而且,如果有一个您从不使用、也从不关心的method被修改了,您还是得 整个类别重新测试,再重新释出这个类别。