日历

« 2008-07-26  
  12345
6789101112
13141516171819
20212223242526
2728293031  

我的好友

统计信息

  • 访问量: 303
  • 日志数: 8
  • 建立时间: 2008-02-27
  • 更新时间: 2008-06-30

RSS订阅

我的最新日志

  • Windows 2000

    2008-6-30

    Windows XP是基于Windows 2000代码的产品,同时拥有一个新的用户图形界面(叫做月神Luna)。
    Windows XP拥有一个叫做“月神”Luna的豪华亮丽的用户图形界面。Windows XP的视窗标志也改为较清晰亮丽的四色视窗标志。Windows XP带有用户图形的登陆界面;全新的XP亮丽桌面,用户若怀旧以前桌面可以换成传统桌面。此外,
    Windows XP还引入了一个“选择任务”的用户界面,使得工具条可以访问任务的具体细节。然而,批评家认为这个基于任务的设计指示增加了视觉上的混乱,因为它除了提供比其它操作系统更简单的工具栏以外并没有添加新的特性。而额外进程的耗费又是可见的。 它包括了简化了的Windows 2000的用户安全特性,并整合了防火墙,以用来确保长期以来以着困扰微软的安全问题。 由于微软把很多以前是由第三方提供的软件整合到操作系统中,XP受到了猛烈的批评。这些软件包括防火墙、媒体播放器(Windows Media Player),即时通讯软件(Windows Messenger),以及它与Microsoft Passport网络服务的紧密结合,这都被很多计算机专家认为是安全风险以及对个人隐私的潜在威胁。这些特性的增加被认为是微软继续其传统的垄断行为的持续。
    另外受到强烈批评的是它的产品激活技术。这使得主机的部件受到监听,并在软件可以永久使用前(每30天一个激活周期)在微软的记录上添加一个唯一的参考序列号(reference number)。在其它计算机上安装系统,将因为硬件的不同而无法激活。如果是在同一台计算机上更换了太多硬件,则会因为硬件改动太大而导致需要重新激活。
    低价的入门版
    为了压制东南亚区高盗版率所带来的威胁,微软将在东南亚地区国家如马来西亚,印尼,泰国发布了相关语言的入门版的Windows XP,即Windows XP Starter Edition。该版本将以非常低的价格来吸引一些买不起高价的Windows XP(专业版与家庭版)的家庭用户或一些学校,政府机构。不过入门版的Windows XP有功能上限制,如只支持最高256MB内存,只能同时运行3个程序,最高800x600解析度等等。

    嵌入式系统市场
    为了在嵌入式系统市场的占有率,微软继前两代的嵌入式操作系统Windows NT Embedded与Windows 2000 SAK之后,发布了Windows XP嵌入式版本,即Windows XP Embedded。比较前两代的微软的嵌入式操作系统,Windows XP Embedded在功能上有很大的加强。

    Windows XP的64位版
    微软在2003年3月28日发布了64位的Windows XP。
    64位的Windows XP称Windows XP 64-Bit Edition。其实就是64位版本的Windows XP Professional。根据不同的微处理器架构,它分为两个不同版本:

    IA-64版的Windows XP
    针对英特尔(Intel)的IA-64架构的安腾2(Itanium2)纯64位微处理器的Windows XP 64-Bit Edition Version 2003 for Itanium-based Systems。它是拥有64位寻址能力的强大的操作系统,主要面向顶级的高端IA-64架构的工作站,用在高端的科学运算,石油探测工艺,立体绘图,复杂的动画制作等等,是一种用在高效能运算(High Performance Computing)的强大的操作系统。估计它可能会改名为Windows XP Professional Itanium-based Edition。支持双处理器;最低支持1GB的内存,最高支持16GB的内存。

    x86-64版的Windows XP
    针对超微(AMD)的x86-64架构的Opteron与Athlon 64所属的64位扩展微处理器的Windows XP 64-Bit Edition for 64-Bit Extended Systems。由于英特尔也发布了x86-64架构的EM64T技术的Xeon与Pentium 4的64位扩展微处理器,故微软将该版本的的Windows XP 64-Bit Edition改为Windows XP Professional x64 Edition,它支持AMD与Intel的x86-64架构。可以使用在一般x86-64架构的工作站,桌面电脑以及笔记本电脑,用途与32位Windows XP Professional一样,但具有64位寻址能力。支持双处理器;最低支持256MB的内存,最高支持16GB的内存。
    微软提供Windows XP Professional x64 Edition的预览版免费下载,试用期为一年,下载者的电脑必须配备有AMD的Opteron/Athlon64或Intel的Xeon(EM64T)/Pentium 4(EM64T)才能安装使用Windows XP Professional x64 Edition
  • 诛仙

    2008-6-30

    超声波探伤仪完美世界国际版》、《诛仙》这两个是3d游戏。确实都好看!在我看来两个游戏内容差不多,都可以有自己的宝石,就像宠物一样,可以成长,然后能升级技能,好像都是搜狐的。但升级我觉得有点慢。
    其次向你推荐《天龙八部》。是3d的。可养宠物,刚开始升级很快后来就不了。人物技能特多。
    最后向你推荐《魔域》,刚开始我也不看好这2d游戏,但是他升级超快!可以用变态(BT)来形容。几乎你站在那里不动都会升级,是我玩过的游戏中升级最快的。任务当然没有3d游戏那么拽,好看还是算得上的!
    还有他可养幻宠(类似宠物)可以养十几个!升级也是超BT。技能特强!按官方现在的活动,此游戏一星期从1升级到100不是太困难!最值得推荐的是,这游戏能帮你赚钱!你的幻兽级别高,可以买。你的打怪拾取装备好也可以卖。
    其他的譬如《神泣》、《梦幻国度》、《奇迹世界SUM》等

    奇迹世界
    幻想大陆
    光之国度
    惊天动地
    激战
    神泣
    机战
    DJMAX
    布鲁布鲁卡卡
    天龙八部

  • php规范4

    2008-2-27

    预定义关键字

    关键字 含义
    Purpose 表示类、属**、方法要做些什么或者什么含义。
    Package Name 类名
    Author 作者
    Modifications 修改记录(编号规则为“No”+日期+“-”+序号)
    See 参考
    Method Name 方法名
    Parameter 参数名(包括类型)
    Return 返回值(包括类型)
    Attribute/Variable Name 属**/变量名
    Type 属**/变量类型

    5.3.2. 类的注释

    /**
    * @ Purpose:
    * 访问数据库的类,以ODBC作为通用访问接口
    * @Package Name: Database
    * @Author: Forrest Gump gump@crtvu.edu.cn
    * @Modifications:
    * No20020523-100:
    * odbc_fetch_into()参数位置第二和第三个位置调换
    * John Johnson John@crtvu.edu.cn
    * @See: (参照)
    */
    class Database
    {
    ……
    }

    5.3.3. 方法注释

    /**
    * @Purpose:
    * 执行一次查询
    * @Method Name: Query()
    * @Parameter: string $queryStr SQL查询字符串
    * @Return: mixed 查询返回值(结果集对象)
    */
    function($queryStr){……}

    5.3.4. 属**或变量注释

    /**
    * @Purpose:
    * 数据库连接用户名
    * @Attribute/Variable Name: mDbUserName
    * @Type: string
    */
    var mDbUserName;

    5.3.5. if (0)来注释外部代码块

    有时需要注释大段的测试代码,最简单的方法就是使用if (0)块:
    function example()
    {
    great looking code

    if (0) {
    lots of code
    }

    more code
    }
    你不能使用/**/,因为注释内部不能包含注释,而大段的程序中可以包含注释。

    5.3.6. 目录文档

    所有的目录下都需要具有README文档,其中包括:
    · 该目录的功能及其包含内容
    · 一个对每一文件的在线说明(带有link),每一个说明通常还应该提取文件标头的一些属**名字。
    · 包括设置、使用说明
    · 指导人们如何连接相关资源:
    o 源文件索引
    o 在线文档
    o 纸文档
    o 设计文档
    · 其他对读者有帮助的东西
    考虑一下,当每个原有的工程人员走了,在6个月之内来的一个新人,那个孤独受惊吓的探险者通过整个工程的源代码目录树,阅读说明文件,源文件的标头说明等等做为地图,他应该有能力穿越整个工程。

    6. 其他


    · 采用面向对象的设计方法;

    理由
    毫无疑问这是最接近人们自然思维的方法,可能前期会觉得没有直接书写来得快,能否试着保留自己的看法?好戏在后头!

    · 类的定义采用一个文件一个类,并且类名和文件名相同;

    理由
    o 越来越多的人接受了这种做法
    o 事实证明这种方法使得项目的逻辑结构更清晰

    · 类定义文件中,定义体之外不得出现诸如echo、print等输出语句;

    理由
    出现这样的语句,应该当做出现bug来看。

    · 输出网页的页面不出现SQL语句

    理由
    这是n层结构的编程思想所致,每层的任务不同,虽然可以越权行使,可能这样很快捷,但我们不赞成这么干。

    · 进行SQL执行的数据必须进行有效**检测

    特殊符号:
    对于MS SQL Server,’%_[ ] 这些符号都是在书写SQL语句中的特殊含义字符,在SQL执行前需要对这些字符进行处理。
    脚本符号:
    对于PHP脚本标记,如<??><%%><?php?><scrīpt lang<scrīpt language="php"></scrīpt>,在进入数据库前需要检测处理。
    理由
    这是数据库编程的一个约定,很多参考书上也是这么说,这里需要强调一下。

    · 在HTML网页中尽量不要穿插PHP代码

    循环代码和纯粹变量输出(类似于<?=$UserName?>)除外。
    理由
    o 需要说明的是我们工作的上游,页面设计者的工作,假如在页面中穿插代码,将破坏结构,这应当是我们需要避免的。
    o 在这里的PHP代码只负责显示,多余的代码显然是不应该的。

    · 没有含义的数字

    一个在源代码中使用了的赤裸裸的数字是不可思议的数字,因为包括作者,在三个月内,没人它的含义。例如:
    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(); }
    现在不是变得更好了么?


    7. PHP文件扩展名


    常见的PHP文件的扩展名有:html, .php, .php3, .php4, .phtml, .inc, .class...
    这里我们约定:

    · 所有浏览者可见页面使用.html
    · 所有类、函数库文件使用.php

    理由

    · 扩展名描述的是那种数据是用户将会收到的。PHP是解释为HTML的。

    8. PHP代码标记

    统一使用<?php ?>,只输出变量时<?=$username?>

  • php规范3

    2008-2-27

    $dev = new Device;
    if (FAIL == $dev->Open()) exit(1);

    3.5. If Then Else 格式

    布局
    这由程序员决定。不同的花括号样汽车租赁式会产生些微不同的样观。一个通用方式是:
    if (条件1) // 注释
    {
    }
    else if (条件2) // 注释
    {
    }
    else // 注释
    {
    }
    如果你有用到else if 语句的话,通常最好有一个else块以用于处理未处理到的其他情况。可以的话放一个记录信息注释在else处,即使在else没有任何的动作。
    条件格式
    总是将恒量放在等号/不等号的左边,例如:
    if ( 6 == $errorNum ) ...
    一个原因是假如你在等式中漏了一个等号,语法检查器会为你报错。第二个原因是你能立刻找到数值而不是在你的表达式的末端找到它。需要一点时间来习惯这个格式,但是它确实很有用。

    3.6. switch 格式

    · 当一个case块处理后,直接转到下一个case块处理,在这个case块的最后应该加上注释。
    · default case总应该存在,它应该不被到达,然而如果到达了就会触发一个错误。
    · 如果你要创立一个变量,那就把所有的代码放在块中。
    例如
    switch (...)
    {
    case 1:
    ...
    // FALL THROUGH
    case 2:
    {
    $v = get_week_number();
    ...
    }
    break;

    default:
    }

    3.7. continue,break 和 ? 的使用

    3.7.1. Continue 和 Break
    Continue 和 break 其实是变相的隐蔽的 goto方法。
    Continue 和 break 像 goto 一样,它们在代码中是有魔力的,所以要节俭(尽可能少)的使用它们。使用了这一简单的魔法,由于一些未公开的原因,读者将会被定向到只有上帝才知道的地方去。
    Continue有两个主要的问题:
    · 它可以绕过测试条件。
    · 它可以绕过等/不等表达式。
    看看下面的例子,考虑一下问题都在哪儿发生:
    while (TRUE)
    {
    ...
    // A lot of code
    ...
    if (/* some condition */) {
    continue;
    }
    ...
    // A lot of code
    ...
    if ( $i++ > STOP_VALUE) break;
    }
    注意:"A lot of code"是必须的,这是为了让程序员们不能那么容易的找出错误。
    通过以上的例子,我们可以得出更进一步的规则:continue 和 break 混合使用是引起灾难的正确方法。
    3.7.2. ?:
    麻烦在于人们往往试着在 ? 和 : 之间塞满了许多的代码。以下的是一些清晰的连接规则:
    · 把条件放在括号内以使它和其他的代码相分离。
    · 如果可能的话,动作可以用简单的函数。
    · 把所做的动作,“?”,“:”放在不同的行,除非他们可以清楚的放在同一行。
    例如
    (condition) ? funct1() : func2();

    or

    (condition)
    ? long statement
    : another long statement;

    3.8. 声明块的定位

    · 声明代码块需要对齐。
    理由
    · 清晰。
    · 变量初始化的类似代码块应该列表。
    · &应靠近类型,而不是变量名。
    例如
    var $mDate
    var& $mrDate
    var& $mrName
    var $mName

    $mDate = 0;
    $mrDate = NULL;
    $mrName = 0;
    $mName = NULL;

    3.9. 每行一个语句

    除非这些语句有很密切的联系,否则每行只写一个语句。

    3.10. 短方法

    方法代码要限制在一页内。

    3.11. 记录所有的空语句

    总是记录下for或者是while的空块语句,以便清楚的知道该段代码是漏掉了,还是故意不写的。

    while ($dest++ = $src++)
    ; // VOID

    3.12. 不要采用缺省方法测试非零值

    不要采用缺省值测试非零值,也就是使用:

    if (FAIL != f())
    比下面的方法好:

    if (f())

    即使 FAIL 可以含有 0 值 ,也就是PHP认为false的表示。在某人决定用-1代替0作为失败返回值的时候,一个显式的测试就可以帮助你了。就算是比较值不会变化也应该使用显式的比较;例如:if (!($bufsize % strlen($str)))应该写成:if (($bufsize % strlen($str)) == 0)以表示测试的数值(不是布尔)型。一个经常出问题的地方就是使用strcmp来测试一个字符等式,结果永远也不会等于缺省值。
    非零测试采用基于缺省值的做法,那么其他函数或表达式就会受到以下的限制:
    · 只能返回0表示失败,不能为/有其他的值。
    · 命名以便让一个真(true)的返回值是绝对显然的,调用函数IsValid()而不是Checkvalid()。

    3.13. 布尔逻辑类型

    大部分函数在FALSE的时候返回0,但是发挥非0值就代表TRUE,因而不要用1(TRUE,YES,诸如此类)等式检测一个布尔值,应该用0(FALSE,NO,诸如此类)的不等式来代替:

    if (TRUE == func()) { ...
    应该写成:

    if (FALSE != func()) { ...

    3.14. 通常避免嵌入式的赋值

    有时候在某些地方我们可以看到嵌入式赋值的语句,那些结构不是一个比较好的少冗余,可读**强的方法。

    while ($a != ($c = getchar()))
    {
    process the character
    }
    ++和--操作符类似于赋值语句。因此,出于许多的目的,在使用函数的时候会产生副作用。使用嵌入式赋值提高运行时**能是可能的。无论怎样,程序员在使用嵌入式赋值语句时需要考虑在增长的速度和减少的可维护**两者间加以权衡。例如:

    a = b + c;
    d = a + r;
    不要写成:

    d = (a = b + c) + r;

    虽然后者可以节省一个周期。但在长远来看,随着程序的维护费用渐渐增长,程序的编写者对代码渐渐遗忘,就会减少在成熟期的最优化所得。

    4. 帮助与共享

    4.1. 重用您和其他人的艰苦工作

    跨工程的重用在没有一个通用结构的情况下几乎是不可能的。对象符合他们现有的服务需求,不同的过程有着不同的服务需求环境,这使对象重用变得很困难。
    开发一个通用结构需要预先花费许多的努力来设计。当努力不成功的时候,无论出于什么原因,有几种办法推荐使用:

    4.2. 请教!给群组发Email求助

    这个简单的方法很少被使用。因为有些程序员们觉得如果他向其他人求助,会显得自己水平低,这多傻啊!做新的有趣的工作,不要一遍又一遍的做别人已经做过的东西。
    如果你需要某些事项的源代码,如果已经有某人做过的话,就向群组发email求助。结果会很惊喜哦!
    在许多大的群组中,个人往往不知道其他人在干什么。你甚至可以发现某人在找一些东西做,并且自愿为你写代码,如果人们在一起工作,外面就总有一个金矿。

    4.3. 告诉!当你在做事的时候,把它告诉所有人

    如果你做了什么可重用的东西的话,让其他人知道。别害羞,也不要为了保护自豪感而把你的工作成果藏起来。一旦养成共享工作成果的习惯,每个人都会获得更多。

    4.4. 小型代码库

    对于代码重用,一个常见的问题就是人们不从他们做过的代码中做库。一个可重用的类可能正隐蔽在一个程序目录并且决不会有被分享的激动,因为程序员不会把类分拆出来加入库中。
    这样的其中一个原因就是人们不喜欢做一个小库,对小库有一些不正确感觉。把这样的感觉克服掉吧,电脑才不关心你有多少个库呢。
    如果你有一些代码可以重用,而且不能放入一个已经存在的库中,那么就做一个新的库吧。如果人们真的考虑重用的话,库不会在很长的一段时间里保持那么小的。

    4.5. 知识库

    很多公司不清楚现有什么代码可用,而且大多数程序员仍然没有通过沟通他们已经做过了什么,或者一直在询问现存什么代码可用。解决这个的方法是有一个可用的知识库。
    理想的情况是,程序员可以到一个WEB页,浏览或者查询打包的知识库列表,找到他们所要的。建立一个程序员可以自动维护的知识库系统,是一个很不错的做法。如果有一个专门的管理员来负责维护这个知识库,那当然更好。
    另一种方法是自动的从代码中产生知识库的做法。把通用的类、方法和标头(subsystem headers)作为手册或者是知识库的一个条目。


    5. 书写注释


    5.1. 讲一个故事

    把你的注释当作描述系统的一个故事。并且使得你的注释能被机器解析后,以固定的格式放到手册中去。类的注释是故事的一部分,方法的名称、方法的注释、方法的实现也是故事一部分。所有的这些部分编织在一起,使得人们在以后的时间里能够准确的知道你干了什么,为什么这么做。

    5.2. 归档注释

    注释的要归档才有意义,否则,假如在一个地方放一条注释描述你做了什么选择和你为什么这么做,只有考古学家才能发现这是最有用的信息。(如何归档另行规范)

    5.3. 注释结构

    工程的每部分都有特定的注释结构。 程序中的注释,这里给出示例作为规范,注释中以 * @ 为关键字的开始,以:为注释关键字结尾。

  • php规范

    2008-2-27

    变量命名

    · 所有字母都使用小写
    · 使用'_'作为每个词的分界。
    理由
    · 通过这一途径,代码中变量的作用域是清晰的。
    · 所有的变量在代码中都看起来不同,容易辨认。
    例如
    function HandleError($errorNumber)
    {
    $error = OsErr($errorNumber);
    $time_of_error = OsErr->GetTimeOfError();
    $error_processor = OsErr->GetErrorProcessor();
    }

    2.11. 引用变量和函数返回引用

    · 引用必须带‘r’前缀
    理由
    · 使得类型不同的变量容易辨认
    · 它可以确定哪个方法返回可更改对象,哪个方法返回不可更改对象。
    例如
    class Test
    {
    var mrStatus;
    function DoSomething(&$rStatus) {};
    function &rStatus() {};
    }

    2.12. 全局变量

    · 全局变量应该带前缀‘g’。
    理由
    · 防静电地板知道一个变量的作用域是非常重要的。
    例如
    global $gLog;
    global &$grLog;

    2.13. 定义命名 / 全局常量

    · 全局常量用'_'分隔每个单词。
    理由
    这是命名全局常量的传统。你要注意不要与其它的定义相冲突。
    例如
    define("A_GLOBAL_CONSTANT", "Hello world!");

    2.14. 静态变量

    · 静态变量应该带前缀‘s’。
    理由
    · 知道一个变量的作用域是非常重要的。
    例如
    function test()
    {
    static $msStatus = 0;
    }

    2.15. 函数命名

    · 函数名字采用C GNU的惯例,所有的字母使用小写字母,使用'_'分割单词。
    理由
    · 这样可以更易于区分相关联的类名。
    例如
    function some_bloody_function()
    {
    }

    2.16. 错误返回检测规则

    · 检查所有的防静电地板系统调用的错误信息,除非你要忽略错误。
    · 为每条系统错误消息定义好系统错误文本以便include。

    3. 书写规则


    3.1. 大括号 {} 规则

    在三种主要的大括号放置规则中,有两种是可以接受的,如下的第一种是最好的:
    · 将大括号放置在关键词下方的同列处:
    if ($condition) while ($condition)
    { {
    ... ...
    } }
    · 传统的UNIX的括号规则是,首括号与关键词同行,尾括号与关键字同列:
    if ($condition) { while ($condition) {
    ... ...
    } }
    理由
    · 引起剧烈争论的非原则的问题可通过折衷的办法解决,两种方法任意一种都是可以接受的,然而对于大多数人来说更喜欢第一种。原因就是心理研究学习范畴的东西了。
    对于更喜欢第一种还有着更多的原因。如果您使用的字符编辑器支持括号匹配功能的话(例如vi),最重要的就是有一个好的样式。为什么?我们说当你有一大块的程序而且想知道这一大块程序是在哪儿结束的话。你先移到开始的括号,按下按钮编辑器就会找到与之对应的结束括号,例如:
    if ($very_long_condition && $second_very_long_condition)
    {
    ...
    }
    else if (...)
    {
    ...
    }
    从一个程序块移动到另一个程序块只需要用光标和你的括号匹配键就可以了,不需找匹配的括号。

    3.2. 缩进/制表符/空格 规则

    · 使用制表符缩进。
    · 使用三到四个空格为每层次缩进。
    · 不再使用只要一有需要就缩排的方法。对于最大缩进层数,并没有一个固定的规矩,假如缩进层数大于四或者五层的时候,你可以考虑着将代码因数分解(factoring out code)。
    理由
    · 许多编程者支持制表符。
    · 当人们使用差异太大的制表符标准的话,会使阅读代码变得很费力。
    · 如此多的人愿意限定最大的缩进层数,它通常从未被看作是一件工作。我们相信程序员们会明智的选择嵌套的深度。
    例如
    function func()
    {
    if (something bad)
    {
    if (another thing bad)
    {
    while (more input)
    {
    }
    }
    }
    }

    3.3. 小括号、关键词和函数 规则

    · 不要把小括号和关键词紧贴在一起,北京广告公司要用空格隔开它们。
    · 不要把小括号和函数名紧贴在一起。
    · 除非必要,不要在Return返回语句中使用小括号。
    理由
    · 关键字不是函数。如果小括号紧贴着函数名和关键字,二者很容易被看成是一体的。
    例如
    if (condition)
    {
    }

    while (condition)
    {
    }

    strcmp($s, $s1);

    return 1;

    3.4. 别在对象架构函数中做实际的工作

    别在对象架构构造函数中做实际的工作, 构造函数应该包含变量的初始化和(或)不会发生失败的操作。
    理由
    · 构造不能返回错误 。
    例如
    class Device
    {
    function Device() { /* initialize and other stuff */ }
    function Open() { return FAIL; }
    };

  • 规范

    2008-2-27

    1. 介绍
    1.1. 标准化的重要**
    标准化问题在某些方面上让每个人头痛,让人人都觉得大家处于同样的境地。这有助于让这些建议在许多的项目中不断演进,许多公司花费了许多星期逐子字逐句的进行争论。标准化不是特殊的个人风格,它对本地改良是完全开放的。
    1.2. 优点
    当一个项目尝试着遵守公用的标准时,会有以下好处:
    · 程序员可以了解任何代码,弄清程序的状况
    · 新人可以很快的适应环境
    · 防止新接触php的人出于节省时间的需要,自创一套风格并养成终生的习惯
    · 防止新接触php的人一次次的犯同样的错误
    · 在一致的环境下,人们可以减少犯错的机会
    · 程序员们有了一致的敌人
    1.3. 缺点
    · 因为标准由一些不懂得php的人所制定,所以标准通常看上去很傻
    · 因为标准跟我做的不一样,所以标准通常看上去很傻
    · 标准降低了创造力
    · 标准在长期互相合作的人群中是没有必要的
    · 标准强迫太多的格式
    1.4. 讨论
    许多项目的经验能得出这样的结论:采用编程标准可以使项目更加顺利地完成。标准是成功的关键么?当然不。但它们可以帮助我们,而且我们需要我们能得到的所有的帮助!老实说,对一个细节标准的大部分争论主要是源自自负思想。对一个合理的标准的很少决定能被说为是缺乏技术**的话,那只是口味的原因罢了。所以,要灵活的控制自负思想,记住,任何项目都取决于团队合作的努力。
    1.5. 解释
    1.5.1. 标准实施
    首先应该在开发小组的内部找出所有的最重要的元素,也许标准对你的状况还不够恰当。它可能已经概括了 重要的问题,也可能还有人对其中的某些问题表示强烈的反对。无论卷帘门在什么情况下,只要最后顺利的话,人们将成熟的明白到这个标准是合理的,然后其他的程序员们也会发现它的合理**,并觉得带着一些保留去遵循这一标准是值得的。如果没有自愿的合作,可以制定需求:标准一定要经过代码的检验。如果没有检验的话,这个解决方案仅仅是一个建立在不精确的基础上的一大群可笑的人。
    1.5.2. 认同观点
    1. 这行不通;
    2. 也许可行吧,但是它既不实用又无聊;
    3. 这是真的,而且我也告诉过你啊;
    4. 这个是我先想到的;
    5. 本来就应该这样。
    如果您带着否定的成见而来看待事物的话,请您保持开放的思想。你仍可以做出它是废话的结论,但是做出结论的方法就是你必须要能够接受不同的思想。请您给自己一点时间去做到它。
    1.5.3. 项目的四个阶段
    1. 数据库结构
    2. 设计
    3. 数据层
    4. HTML层

    2. 命名规则

    2.1. 合适的命名

    命名是程序规划的核心。古人相信只要知道一个人真正的名字就会获得凌驾于那个人之上的不可思议的力量。只要你给事物想到正确的名字,就会给你以及后来的人带来比代码更强的力量。别笑!
    名字就是事物在它所处的生态环境中一个长久而深远的结果。总的来说,只有了解系统的程序员才能为系统取出最合适的名字。如果所有的命名都与其自然相适合,则关系清晰,含义可以推导得出,一般人的推想也能在意料之中。
    如果你发觉你的命名只有少量能和其对应事物相匹配的话, 最好还是重新好好再看看你的设计吧。

    2.2. 类命名

    · 在为类(class )命名前首先要知道它是什么。如果通过类名的提供的线索,你还是想不起这个类是什么的话,那么你的设计就还做的不够好。
    · 超过伸缩门三个词组成的混合名是容易造成系统各个实体间的混淆,再看看你的设计,尝试使用(CRC Session card)看看该命名所对应的实体是否有着那么多的功用。
    · 对于派生类的命名应该避免带其父类名的诱惑,一个类的名字只与它自身有关,和它的父类叫什么无关。
    · 有时后缀名是有用的,例如:如果你的系统使用了代理(agent ),那么就把某个部件命名为“下载代理”(DownloadAgent)用以真正的传送信息。

    2.3. 方法和函数命名

    · 通常每个方法和函数都是执行一个动作的,所以对它们的命名应该清楚的说明它们是做什么的:用CheckForErrors()代替ErrorCheck(),用DumpDataToFile()代替DataFile()。这么做也可以使功能和数据成为更可区分的物体。
    · 有时后缀名是有用的:
    o Max - 含义为某实体所能赋予的最大值。
    o Cnt - 一个运行中的计数变量的当前值。
    o Key - 键值。
    例如:RetryMax 表示最多重试次数,RetryCnt 表示当前重试次数。
    · 有时前缀名是有用的:
    o Is - 含义为问一个关于某样事物的问题。无论何时,当人们看到Is就会知道这是一个问题。
    o Get - 含义为取得一个数值。
    o Set - 含义为设定一个数值
    例如:IsHitRetryLimit。

    2.4. 缩写词不要全部使用大写字母

    · 无论如何,当遇到以下情况,你可以用首字母大写其余字母小写来代替全部使用大写字母的方法来表示缩写词。
    使用: GetHtmlStatistic.
    不使用: GetHTMLStatistic.
    理由
    · 当命名含有缩略词时,人们似乎有着非常不同的直觉。统一规定是最好,这样一来,北京铁艺命名的含义就完全可以预知了。
    举个NetworkABCKey的例子,注意C是应该是ABC里面的C还是key里面的C,这个是很令人费解的。有些人不在意这些,其他人却很讨厌这样。所以你会在不同的代码里看到不同的规则,使得你不知道怎么去叫它。
    例如
    class FluidOz // 不要写成 FluidOZ
    class GetHtmlStatistic // 不要写成 GetHTMLStatistic

    2.5. 类命名

    · 使用大写字母作为词的分隔,其他的字母均使用小写
    · 名字的首字母使用大写
    · 不要使用下划线('_')
    理由
    · 根据很多的命名方式,大部分人认为这样是最好的方式。
    例如
    class NameOneTwo
    class Name

    2.6. 类库命名

    · 目前命名空间正在越来越广泛的被采用,以避免不同厂商和团体类库间的类名冲突。
    · 当尚未采用命名空间的时候,为了避免类名冲突,一般的做法是在类名前加上独特的前缀,两个字符就可以了,当然多用一些会更好。
    例如
    John Johnson的数据结构类库可以用Jj做为前缀,如下:
    class JjLinkList
    {
    }
    另一种折中方式是建立包含类库目录(事实上Java也是这么做的),以不通的目录代表不同的命名空间。
    例如
    Microsoft的数据库相关类库可以在:
    /classes/com/Microsoft/ Database/DbConn.php
    Apache的数据库相关类库可在:
    /classes/org/apache/Database/DbConn.php

    2.7. 方法命名

    · 采用与类命名一致的规则
    理由
    · 使用所有不同规则的大部分人发现这是最好的折衷办法。
    例如
    class NameOneTwo
    {
    function DoIt() {};
    function HandleError() {};
    }

    2.8. 类属**命名

    · 属**命名应该以字符‘m’为前缀。
    · 前缀‘m’后采用于类命名一致的规则。
    · ‘m’总是在名字的开头起修饰作用,就像以‘r’开头表示引用一样理由
    · 前缀'm'防止类属**和方法名发生任何冲突。你的方法名和属**名经常会很类似,特别是存取元素。
    例如
    class NameOneTwo
    {
    function VarAbc() {};
    function ErrorNumber() {};
    var $mVarAbc;
    var $mErrorNumber;
    var $mrName;
    }

    2.9. 方法中参数命名

    · 第一个字符使用小写字母。
    · 在首字符后的所有字都按照类命名规则首字符大写。
    理由
    · 可以区分方法中的一般变量。
    · 你可以使用与类名相似的名称而不至于产生重名冲突。
    例如
    class NameOneTwo
    {
    function StartYourEngines(
    &$rSomeEngine,
    &$rAnotherEngine);
    }

  • 表A

    2008-2-27

    表A

    这段简单的代码必须做三件事情:

    • 使用PHP include()函数来包含
      <!-- display.php 这个Web页面的风格由一个配置文件决定 --> 
      <html> 
      <head> 
      <title>Mood Page</title>
      </head> 
      <?php
       include("displayconf.php");
       $required_file = $display.".php";
       require $required_file;
      ?>
      <br><br>
      <center>This is the best "mood page" ever!</center>
      </font>
      </body>
      </html>
      
      Displayconf.php中的变量并对它们进行求值。
    • 创建一个表示用户请求的文件名的变量。在我们这个例子中,Displayconf.php文件里定义的变量$display被求值,然后加上.php后缀。(这是由我们的逻辑完成的。)
    • 使用PHP的require()函数显示正确的包含文件里的内容。

    你应该注意到在我们的伸缩门例子中,PHP require()函数和include()函数是完全可以互换的。这两个函数之间主要的区别在于目标文件处理的方式不同。一个require()语句将会由它所调用的文件替换。这意味着在一个循环当中,远程的文件只会被调用一次。而另一方面,在每次遇到include()函数的时候,它都会被重新求值。这意味着在一个循环的过程中,文件将在每一次循环过程中都被访问一次,而且在包括文件中设置的变量每次都会更新。

    在这个例子中,我试图讲清楚什么时候使用什么函数合适。对于文件Displayconf.php,很有可能它里面的变量值已经改变。毕竟,这是一个配置文件。因此,我选择了include()函数。而另一方面,$required文件在交互的过程中很有可能不会改变。如果用户请求的是不同的文件体,那么我们有可能会创建一个新的文件再把它包括进来,所以我使用require()函数。

    高级用户可能希望看看PHP的手册来了解更多的关于函数require_once() 和 include_once() 的信息以便能够对文件处理和配置文件变量的管理进行更好的控制。

    表B 显示了我们的配置文件,Displayconf.php。(为了简单化的目的,我们将把所有的文件放在和Web服务器相同的目录下。)我们在这里要做的就是将$display变量设置成一个可选的值。

    表B

    <?php
    # displayconf.php # display.php 的配置文件 # ------------------------------------------------- # 将变量 $display 设置成下列值之一: # happy, sad, 或者 generic $display = "happy"; ?>

    最后我们需要一些内容文件--对应配置文件中的每一个选项。因为这些内容都是静态的HTML,所以我们不需要在文件里加上PHP脚标。当你在PHP里使用include()或者require()函数的时候,被调用的文件在处理过程开始的时候被跳过然后在处理结束的时候被加进来。

    "happy"文件内容(happy.php)
    <body bgcolor=pink text=yellow>
    <font size="+5">

    "Sad" 文件内容 (sad.php)
    <body bgcolor=blue text=white>
    <font face="arial, helvetica" size="+5">

    "Generic" 文件内容 (generic.php)
    <body bgcolor=white text=black>
    <font face="courier" size="+5">

    当你单击页面Display.php的时候,这个页面的外观和感受将会根据你在配置文件中输入的值而改变。卷帘门总结

    在本文中,我们讨论了动态信息的基础知识并使用一个脚本来创建由文件驱动的动态内容。特别的是,我们使用include() 和 require() PHP函数来提取和发送我们的数据。

    下面是一些最后的话。虽然我相信你一定熟悉WAI Web编程指南,但是你也许还应该看看W3C对于动态内容所说的支配以及用户对它的访问能力。你可能还要看看PHP手册中的这一章“使用远程文件”来学习如何使用FTP来提取配置数据。

  • php页面设计

    2008-2-27

    Web站点费尽心思想要为用户提供他们从未体验过的东西。除了友好的界面,细致的服务,实用的信息以外,为用户定制的动态的网页内容也能够提高Web站点的用处并加强访问的针对性,这使得用户更有可能在以后再次访问你的网站。在这篇文章里,我们将从对动态信息的一个概述开始。然后我们将解释如何使用PHP来在Web页面里创建动态的内容并察看一个演示的例子。

    动态信息理论

    Merriam-Webster Online地解释,动态一词的意思是网页的内容由“通常是连续的和实时生成的活动或者改变的信息组成。”因此当我们谈论动态数据的时候,我们也就是在谈论作为Web页面发送给用户的信息是由不同的源数据组合而成的。这与静态网页的概念是相对的,静态网页的内容并不依赖用户输入的数据而改变而且通常是直接解析给用户。Web页面上的动态信息有三种主要的类型:

    • 动态数据--在一个Web页面里产生的变量。
    • 动态Web页面--整个Web页面都是动态生成的。
    • 动态内容--Web页面的一部分是动态生成的。

    铁艺你如果希望对动态内容产生的过程进行细微的控制,就象动态数据的那种类型一样,那么数据处理的过程就会复杂一些。而如果你想生成大范围的信息,就象动态Web页面的生成那样,那么程序的逻辑就会变得复杂。动态内容的生成是这两种方式的折衷,它能够让我们使用两个很有用的PHP函数,include()和require()。

    要记住,你在后端加入的逻辑越多,那么你的Web站点的性能将会损失得越严重。幸运的是,PHP能够很流畅的进行预处理过程,所以当我在处理动态内容和数据的时候都尽可能多的使用PHP的功能。

    数据源和PHP功能

    所有的动态内容都有一个共同点:它们从一个原始页面以外的数据源而来。图A列出了一些常见的数据源以及用来处理它们的相应的PHP函数。

    Figure A

    数据源
    PHP 函数
    注释
    User
    $HTTP_POST_VARS
    $HTTP_GET_VARS

    这些函数处理由用户通过Web表单直接输入的数据。
    Database (local or remote)

    <dbtype>_connect()
    <dbtype>_pconnect()
    <dbtype>_close()
    <dbtype>_<function>()
    example:
    mysql_fetch_array()

    这些都只是PHP许多数据库访问函数中的一部分,许多函数是为每个不同的数据库特别编写的。你能够在PHP函数参考手册里找到这些函数的完整列表。
    Remote file
    fopen(), fclose()
    fgets(), fputs()

    这些函数处理一个远程服务器上文件中的数据,这个文件可以通过FTP访问。
    Local file
    include(), require()
    fopen(), fclose()

    这些函数处理位于本地服务器上的文件中的数据,比方说配置文件。
    常见的数据源和处理它们的PHP函数

    在这篇文章“教程:PHP起步中,”我们观看了一个演示的脚本,这个脚本要求用户输入他们最喜欢的数字。根据用户输入的结果,我们在Web页面上显示一条消息。这就是一个由用户驱动的动态Web内容的例子。从Web表单返回的结果将决定显示的内容。一个更复杂的例子是“点击流程”应用程序,这个程序能够根据一个用户在Web站点上访问过的页面来决定向他或者她发送什么广告。

    一旦数据已经输入,不管它是由用户或者其它的方式输入的,将会被保存在一个中并在以后重新使用。如果它被用来决定显示的内容,那么这些内容将可以被认为是“由数据库驱动的动态内容。”我们将在下一篇文章中更仔细的看看这种类型的动态信息。 目前,让我们先察看一个由文件驱动的动态内容的简单的PHP脚本的例子。我们将使用基于一个配置文件的逻辑来决定在Web页面上应该显示什么样的页面风格和字体。我们选择的页面风格将会在用户请求Web页面的时候显示出来。超声波探伤仪(这里我想就包括文件的例子给你提个醒:你真的应该在这个例子中为完成要求的功能而使用风格页。)

    例子程序:Display.php

    Display脚本使用一个独立的配置文件来包含变量值和几个含有HTML的变量部分的包括文件。虽然这看起来不是特别动态,但是你能够轻易的要求用户使用Web表单来创建一个配置文件并使用一定的逻辑来判断应该加载哪一个配置文件,等等。(我们在“理解PHP的函数和类”这篇文章中所作的讨论将帮助你完成这个工作。)

    由于本文的目的所限,我们将跳过这方面的处理过程并尽量使它简化。表A展示了我们的主页面,以及你通过浏览器调用的页面,Display.php。

Open Toolbar