欢迎大家加入笔记的建设,共同丰富和完善内容!
本人专科应届毕业生,寻求工作中,求介绍~
<?php ?>
来界定PHP
代码,在HTML
页面中嵌入纯变量时,可以使用<?php echo $variablename;?>
这样的形式。C
样式的注释/* */
和标准C++
注释//
。//debug
并后跟完整的注释信息,这样可以方便在程序发布和最终调试前批量检查程序中是否还存在有疑问的代 码。例如:
PHP
、JavaScript
中的函数、类、逻辑结构、循环等。{}
、if
和switch
if
结构中,else
和elseif
与前后两个大 括号同行,左右各一个空格。另外,即便if
后只有一行语句,仍然需要加入大括号,以保证结构清晰;switch
结构中,通常当一个case
块处理后,将跳过之后的case
块处理,因此大多数情况下需要添加break
。break
的位置视程序逻辑,与case同在一行,或新起一行均可,但同一switch
体中,break
的位置格式应当保持一致。
(
应和函数关键词紧贴在一起,除此以外应当使用空格将(
同前面内容分开;)
除后面是)
或者.
以外,其他一律用空格隔开它们;TAB
或空格
的行,即:这类空白行应当不包含任何TAB
或空格
。同时,任何程序行尾也不能出现多余的TAB
或空格
。多数编辑器具有自动去除行尾空格的功能,如果习惯养成不好,可临时使用它,避免多余空格产生;
$var
)、特殊转义字符(如\t
、\r
、\n
等)不会被解析,因此PHP的解析速度更快,转义字符仅仅支持\'
和\
这样对单引号和反斜杠本身的转义;$var
)值会代入字符串中,特殊转义字符也会被解析成特定的单个字符,还有一些专门针对上述两项特性的特殊功能性转义,例如\$
和{$array['key']}
。这样虽然程序编写更加方便,但同时PHP的解析也很慢;$array['key']
,而不是$array[key]
,因为不正确的写法会使PHP解析器认为key
是一个常量,进而先判断常量是否存在,不存在时才以key
作为下标带入表达式中,同时出发错误事件,产生一条Notice
级错误。\t
等特殊转义字符;$array['key']
;$string = 'test';
,而非$string = "test$var";
;preg_
系列函数)中,DzzOffice全部使用双引号,这是为了人工分析和编写的方便,并保持正则表达式的统一,减少不必要的分析混淆。
addslashes()
处理,以免特殊字符未经转义在插入数据库的时候出现错误。DzzOffice中所有通过GET
,POST
,FILE
,取得的变量默认情况下已经使用了addslashes()
进行了转义,不必重复进行。如果数据处理必要(例如用于直接显示),可以使用stripslashes()
恢复,但数据在插入数据库之前必须再次进行转义。缓存文件中,一般对缓存数据的值采用addcslashes($string, '\'\')
进行转义。。
“或者其他标点符号作为结束,文字中的标点符号,应使用全角。但注意:由于中英文模板与语言包问题,功能说明性的语言中,冒号使用半角”:
“,而不使用全角;
。showmessage()
和showTips()
显示的)和使用技巧,当中的标点符号应当遵循中文语法规则,以使用全角中文标点为主,结尾应当加入全角句号。_
”进行分割;$data
而不可使用$data1
、$data2
这样容易产生混淆的形式,应当使用$threaddata
、$postdata
这样一目了然容易理解的形式;$bio($biography)
,$tpp($threadsPerPage)
,前提是英文中有这样既有的缩写形式,或字母符合英文缩写规范;$allow***
或$is***
的形式,前者后面接动词,后者后面接形容词。TRUE
、FALSE
和 NULL
必须全部采用大写字母书写。
empty()
或 isset()
,而不要直接使用if($switch)
的形式,除非你确切的知道此变量一定已经被初始化并赋值。empty()
和isset()
的区别为:bool empty(mixed var)
var
是非空或非零的值,则 empty()
返回 FALSE
。换句话说,""、0、"0"、NULL、FALSE、array()、var $var
; 以及没有任何属性的对象都将被认为是空的,如果 var
为空,则返回 TRUE
。bool isset(mixed var[, mixed var[, ...]])
var
存在则返回 TRUE
,否则返回 FALSE
。unset()
释放了一个变量之后,它将不再是 isset()
。若使用 isset()
测试一个被设置成 NULL
的变量,将返回 FALSE
。同时要注意的是一个 NULL
字节("\0"
)并不等同于 PHP
的 NULL
常数。is_array()
,这种判断尤其适用于对数组进行遍历的操作,例如foreach()
,因为如果不事先判断,foreach()
会对非数组类型的变量报错;isset($array['key'])
,也可使用empty()
,两者异同见上。PHP 5.3
作为最低通过平台,尽量不使用高版本PHP 新增的函数、常数或者常量。如果使用只在高版本才具备的函数,必须对其进行二次封装,自动判断当前PHP版本,并自行编写低版本下的兼容代码;function
或class
中。超过3行,实现相同功能的程序切勿在不同程序中多次出现,这是无法容忍和回避的问题;require_once
,以避免可能的重复包含问题;include_once
或include
。在必要时,可以使用@include_once
或@include
的方式,以忽略错误提示;"./"
或DZZ_ROOT.'./'
开头,应避免直接写程序文件名(例如:require_once 'x.php';
)的做法;./core/class/class_core.php
中定义一个标记性常量IN_DZZ
,来判断程序是否被合法调用。因此,在除了./core/class/class_core.php
以外的任何一个被包含和调用的程序文件中,需要包含以下内容,以使得访问者无法直接通过URL请求该文件:
error_reporting(E_ALL);
作为默认的错误报告级别,此级别最为严格,能够报告程序中所有的错误、警告和提示信息,以帮助开发者检查和核对代码,避免大多数安全性问题和逻辑错误、拼写错误。error_reporting()
可以在config/config.php
中添加一行$_config[‘debug’] = 1;
debug
值可以在0~2之前取值,数值越大报错等级越高。error_reporting(E_ERROR | E_WARNING | E_PARSE);
作为默认的错误报告级别,以利于用户使用并将无谓错误提示信息降至最低。dzz_user
(用户表);存储多项内容的字段,或代表数量的字段,也应当以复数方式命名,例如:params(parameters, vars, ...)
、views(...)
、replies(...)
。 当几个表间的字段有关连时,要注意表与表之间关联字段命名的统一。 代表id
自增量的字段,通常用以下几种形式:id
,或经常在URL中进行调用的,尽量用简写的形式,例如tid、pid、uid
;id
,使用全称的形式,例如 dzzid
;id
,可以使用全称的形式,也可只将其命名为id
。NULL
,非NULL
时才进行值的比对。因此基于效率的考虑,所有字段均不能为空,即全部NOT NULL
;id
、发帖数等,必须设置为UNSIGNED
类型。UNSIGNED
类型比非UNSIGNED
类型所能存储的正整数范围大一倍,因此能获得更大的数值存储空间;tinyint(1)
非UNSIGNED
类型,少数情况也可能使用enum()
结果集的方式。tinyint
作为开关字段时,通常1
为打开;0
为关闭;-1
为特殊数据,例如N/A
(不可用);高于1的为特殊结果或开关二进制数组合(详见DzzOffice中相关代码);MEMORY/HEAP
类型的表中,要尤其注意规划节约使用存储空间,这将节约更多内存。例如 dzz_session
表中,就将IP地址的存储拆分为4个tinyint(3) UNSIGNED
类型的字段,而没有采用 char(15)
的方式;字段类型 | 存储空间(b) | UNSIGNED | 取值范围 |
---|---|---|---|
tinyint | 1 | 否 | -128~127 |
是 | 0~255 | ||
smallint | 2 | 否 | -32768~32767 |
是 | 0~65535 | ||
mediumint | 3 | 否 | -8388608~8388607 |
是 | 0~16777215 | ||
int | 4 | 否 | -2147483648~2147483647 |
是 | 0~4294967295 | ||
bigint | 8 | 否 | -9223372036854775808~9223372036854775807 |
是 | 0~18446744073709551615 |
select * from dzz_user;
是不符合规范的写法。JOIN
、FROM
、ORDER BY
等关键字进行界定。
varchar
、text
等变长字段的数据表,即为变长表,反之则为定长表。OPTIMIZE TABLE
以保持性能。而定长表就没有这个问题;char(n)
类型列的每个值总要占用n 个字节(即使空串也是如此),因为在表中存储时,值的长度不够将在右边补空格;varchar(n)
类型的列所占空间较少,因为只给它们分配存储每个值所需要的空间,每个值再加一个字节用于记录其长度。因此,如果在char
和varchar
类型之间进行选择,需要对时间与空间作出折衷;dzz_user
和dzz_user_field
表等。因此规划数据结构时需要进行全局考虑;emum
类型来获得数值运算的优越性。mediumint
够用,就不要选择bigint
。对于可变长类型,也仍然能够节省空间。一个TEXT
类型的值用2 字节记录值的长度,而一个LONGTEXT
则用4字节记录其值的长度。如果存储的值长度永远不会超过64KB,使用TEXT
将使每个值节省2字节。(SELECT)
多、写(UPDATE/INSERT)
多或读写都多的操作。对常被执行的SQL语句而言,对大表操作需要尤其注意:PRIMARY KEY
、INDEX
、UNIQUE
几种,详情请查阅MySQL文档。通常,在单表数据值不重复的情况下,PRIMARY KEY
和UNIQUE
索引比INDEX
更快,请酌情使用。
a>'0'
还是b<'1'
哪个条件在前,得到的结果都是一样的,但查询速度就大不相同,尤其在对大表进行操作时。ORDER BY
中的条件,只与索引有关,与条件顺序无关。WHERE
条件的先后顺序和ORDER BY
的排序字段的先后顺序而建立的联合索引,就是与这条SQL语句匹配的最优索引结构。字段a | 字段b | 字段c |
---|---|---|
1 | 7 | 11 |
2 | 8 | 10 |
3 | 9 | 13 |
b<'1' AND a>'0'
最优索引:INDEX abc (b, a, c)
原因:b<'1'
作为第一条件可以先过滤掉75%的结果。如果以 a>'0'
作为第一条件,则只能先过滤掉25%的结果EXPLAIN
语句是检测索引和查询能否良好匹配的简便方法。在phpMyAdmin
或其他MySQL客户端中运行EXPLAIN+
查询语句,例如EXPLAIN SELECT * FROM table WHERE a>'0' AND b<'1' ORDER BY c;
这种形式,即使得开发者无需模拟上百万条数据,也可以验证索引是否合理,相关细节请参考MySQL说明。 值得提出的是,Using filesort
是最不应当出现的情况,如果EXPLAIN
得出此结果,说明数据库为这个查询专门建立了一个用以缓存结果的临时表文件,并在查询结束后删除。众所周知,硬盘I/O速度始终是计算机存储的瓶颈,因此,查询中应当尽全力避免高执行频率的SQL语句使用filesort
。尽管,开发者永远都不可能保证产品中的全部SQL语句都不会使用filesort
。 限于篇幅,本文档远远没有涵盖数据库优化的方方面面,例如:联合索引与普通索引的可重用性、JOIN
连接的索引设计、MEMORY/HEAP
表等。数据库优化实际上就是在很多因素和利弊间不断权衡、修改,惟有在成功与失败经验中反复推敲才能得出的经验,这种经验往往就是最难能可贵和价值连城的。{if}
、{loop}
等,必须前后使用HTML注释()
,即类似的形式。事实上,DzzOffice模板编译器是支持不加HTML注释的逻辑体写法的,但加入注释可以使得模板可读性更好,同时方便用户使用DreamWeaver
或VSCODE
等对模板进行修改。 在HTML标记中使用的逻辑体无需使用HTML注释()
,即:<input type="text"{if xxx} value="1"{/if} />
<input type="text" name="test" value="ok" />
,而绝对不能使用<input type=text name=test value=ok />
。 在任何情况下,产品中的模板文件必须采用手写HTML代码的方式,而绝对不能使用DreamWeaver
、VSCODE
等自动网页制作工具进行撰写或修改。非成对标记必须以”/>
”结尾,如:<input …/>
,<input />
标记的属性必须按照以下顺序书写:<input type="" name="" id="" class="" … />
{}
将变量括起来,以免出现模板编译错误,可能的情况如下:$
"、"'
"等),正确的写法为$descriptionnew[{$buddy['buddyid']}];
;{$extcredits[$creditstrans]['title']}
;{lang item}
,其中item
为在lang.php
中定义的语言元素名。
.php
作为扩展名,而不要使用.phtml
、.php3
、.inc
、.class
等作为扩展名。admin.php
、index.php
、avatar.php
,直接使用程序名+.php
的方式命名function_xxxx.php
和class_xxxx.php
的格式命名书写。函数库和类库程序只能被其他程序引用,而不能独立运行。其中不能包含任何流程性的、不属于任何函数或类的程序代码。xxx.php
作为扩展名。只能被其他程序引用,而不能独立运行。其中不能包含任何函数或类代码的程序代码。./core/template/default
或./template
下的其他模板目录下。.tpl.php
作为扩展名,存放于./data/template
目录下。lang_xxxx.php
格式命名,只能存放模板或程序使用的语言包信息。cache_xxx.php
、default_mod.php
、tags.php
等类似形式命名,存放于./data/cache
目录下。./template
、./images
等。index.htm
文件,内容为一个空格。几乎除DzzOffice根目录以外,所有目录都属于这一类型,因此开发者需要在这些目录全部放入空index.htm
文件,以避免当http服务器的目录列表打开时,服务器文件被索引和列表。index.htm
文件,以避免新建目录被索引的问题。