"。 使用四个空格代替制表符TAB,保证跨客户端编程器软件的灵活性【编辑器设置】。 每行代码若超出了屏幕宽度,需要手动强制换行,增加可读性。&"/> "。 使用四个空格代替制表符TAB,保证跨客户端编程器软件的灵活性【编辑器设置】。 每行代码若超出了屏幕宽度,需要手动强制换行,增加可读性。&">
php开发规范
文件格式
对于只含有 php 代码的文件,我们将在文件结尾处忽略掉 "?>"。
使用四个空格代替制表符TAB,保证跨客户端编程器软件的灵活性【编辑器设置】。
每行代码若超出了屏幕宽度,需要手动强制换行,增加可读性。
每行结尾不允许有多余的空格,删除文件末尾空格,但是末尾应该空一行【编辑器设置】。
请将编辑器设置对所有程序使用UNIX格式保存。
命名约定
1. 常量定义全部为大写,可使用_连接符
例如:
define('TEST', 'Hello World!');
const TEST = 'Hello World!';
2. 变量使用小写字母+下划线组成,其中private和protected变量要使用_前缀
例如:
public $per_page = 10;
protected $_user = null;
private $_db = null;
3. 函数名使用小写字母+下划线组成
例如:function get_client_ip();
4. 类名和方法名采用“驼峰法命名”,首字母小写,其后每个单词首字母大写,不允许使用下划线,并且加上特定的修饰符,名字采用“动词+宾语”的形式,不允许出现拼音,长度不宜超过5个单词,尽量描述清楚方法的作用
例如:
public function getUserInfo();
get(动词)UserInfo(宾语)
5. 参数名采用“驼峰法命名”,参数个数不宜超过5个,其他的请使用数组形式
6. 注释采用PHPDoc形式,明确方法用途和参数含义
例如:
/**
* addData
* 添加数据
*
* @param integer $uid 用户ID
* @param array $data 分享内容
* @return boolean
*/
代码规范
1. 当一个字符串是纯文本组成的时候(即不含有变量),以单引号(')作为定界符。
2. 变量替换中的变量只允许用 {$+变量名} 的形式
例如:$greeting = "Hello {$name}, welcome back!";
3. 连接符“.”,“=”和其他运算符中间使用空格,增加可读性
例如:
包括,在比较运算符(>、=、、!==)、赋值运算符(=)、数学运算符(+、-、*、/、%)、位运算符(&、|、^、~、>>、问号(?)、字符串连接运算符(.)、字符串连接赋值运算符(.=)前后,以及左括号(()前(函数调用例外)、逗号(,)后请使用空格进行间隔。
echo 'My name is' . $name;
$name = 'bosnzt';
$num ++;
4. 方法和函数中的参数使用逗号+空格“, ”方式隔开,()与{中间要有空格,与方法名之间不能有空格,{和方法名保持在同一行,方法与方法之间也要空一行
例如:
public function addData($uid, $data = array()) {
// TODO
}
5. array 类型使用逗号+空格“, ”方式隔开,关联数组尽量分成多个行,并且保证每行的键与值的对齐,以保持美观,“=>”两边要有空格
例如:
$data = array(1, 2, 3);
$data = array(
'name' => 'bosnzt',
'uid' => '100000',
);
6. 无论是if、for、foreach、while、do while 等等,都必须使用{},并且不能在同一行,}结束之后都要空一行,里面的条件使用逗号+空格“, ”方式隔开,且保持缩进
例如:
if (!$uid) {
// TODO
}
for ($i; $i // TODO
}
foreach ($data as $key => $val) {
// TODO
}
7. "switch" 语句的内容必须以四个空格缩进,"case" 条件控制的内容必须再加四个空格进行缩进
例如:
switch ($indentedSpaces) {
case 2:
echo "错误";
break;
case 4:
echo "正确";
break;
default:
break;
}
8. 单行注释//和文字要用空格隔开,和代码头部对齐,并且和上行代码空一行,多行注释*和文字用空格隔开
例如:
/*
* 1、多行注释尽量用来描述逻辑,防止以后忘记了一些重要逻辑
* 2、或者在开发过程中有些逻辑很复杂,在自己很难理清楚的情况之下,先将逻辑写在多行注释里,有助于在开发的时候不会乱
*/
$name = $web_id ? '网页' : '个人';
// 重新赋值,与上行代码保持空行
if (!$uid) {
$name = 'Tom';
}
9. SQL关键词语大写,其他使用小写
SELECT field1 AS something, field2, field3
FROM table a, table b
WHERE (this=that) AND (this2=that2)
10. if/foreach/for嵌套尽量不要超过4层,超过4层嵌套,可读性非常的差,绝大多数情况都是可以优化的
11. 方法中的代码行数控制在80行之内,多出的请尽量拆分成多个子方法
PHP 5.3
新特性
1.添加了命名空间的支持.
2.添加了静态晚绑定支持.
3.添加了跳标签支持.
goto a;
echo 'Foo';
a:
echo 'Bar';
?>
4.添加了原生的闭包(Lambda/匿名函数)支持.
array_map(function closure($arg) use ($var,....) {}, $array);
5.新增了两个魔术方法, __callStatic(动态访问静态方法变为可能.) 和 __invoke(对象可以被执行).
class MethodTest {
public function __call($name, $arguments) {
// Note: value of $name is case sensitive.
echo "Calling object method '$name' "
. implode(', ', $arguments) . "\n";
}
/** As of PHP 5.3.0 */
public static function __callStatic($name, $arguments) {
// Note: value of $name is case sensitive.
echo "Calling static method '$name' "
. implode(', ', $arguments) . "\n";
}
}
$obj = new MethodTest;
$obj->runTest('in object context');
MethodTest::runTest('in static context'); // As of PHP 5.3.0
?>
6.添加了 Nowdoc 语法支持, 类似于 Heredoc 语法, 但是包含单引号.
7.使用 Heredoc 来初始化静态变量和类属性/常量变为可能.
8.可使用双引号声明 Heredoc, 补充了 Nowdoc 语法.
9.可在类外部使用 const 关键词声明 常量.
10.三元运算操作符有了简写形式: ?:.
$value = $planA ?: $planB;
11.异常可以被内嵌.
12.新增了循环引用的垃圾回收器并且默认是开启的.
void gc_enable ( void )
设置 zend.enable_gc 为 1, 激活循环引用收集器。
不向下兼容之处
尽管大多数现有的 PHP 5 代码无需改变就可以工作,但是请注意一些不向下兼容的变化:
在 PHP 5.3.x 的所有绑定扩展中应用了新的内部参数解析API, 当给函数传递了不兼容的参数时将返回 NULL. 但有一些例外,比如函数 get_class() 在出现错误时将会返回 FALSE.
clearstatcache() 默认不再清除缓存的 realpath.
realpath() 现在是完全与平台无关的. 结果是非法的相对路径比如 __FILE__ . "/../x" 将不会工作.
call_user_func() 系列函数即使被调用者是一个父类也使用 $this.
数组函数 natsort(), natcasesort(), usort(), uasort(), uksort(), array_flip(), 和 array_unique() 将不再接受对象作为参数. 在将这些函数应用于对象时, 请首先将对象转换为数组.
按引用传递参数的函数在被按值传递调用时行为发生改变. 此前函数将接受按值传递的参数, 现在将抛出致命错误. 之前任何期待传递引用但是在调用时传递了常量或者字面值 的函数, 需要在调用前改为将该值赋给一个变量。
新的 mysqlnd 库需要使用 MySQL 4.1 新的 41 字节密码格式。继续使用旧的 16 字节密码将导致 mysql_connect() 和其它类似函数 抛出 "mysqlnd cannot connect to MySQL 4.1+ using old authentication." 错误.
新的 mysqlnd 库将不再读取 MySQL 配置文件(my.cnf/my.ini), 这与旧版本的 libmysql 库不同. 如果你的代码依赖于这些配置 文件, 你可以使用 mysqli_options() 显式地加载它. 注意, 这意味着如果 PDO 中的 MySQL 支持使用了 mysqlnd 进行编译,PDO 特有常量 PDO::MYSQL_ATTR_READ_DEFAULT_FILE 和 PDO::MYSQL_ATTR_READ_DEFAULT_GROUP 将是未定义的.
SplFileInfo 及其相关目录类会移除末尾的 /.
__toString 魔术方法不再接受参数.
魔术方法 __get, __set, __isset, __unset, and __call 应该总是公共的(public)且不能是静态的(static). 方法签名是必须的.
现在 __call 魔术方法在访问私有的(private)和被保护的(protected)方法时被调用.
函数内 include 或者 require 一个文件时,文件内 将不能使用 func_get_arg(), func_get_args() 和 func_num_args() 函数。
新增了一个包裹在 MHASH 扩展外面的仿真层。但是并非所有的算法都涉及到了,值得注意的是 s2k 哈希算法。这意味着 s2k 哈希算法在 PHP 5.3.0 中不再可用。
以下关键词被保留,将不能被用作函数名, 类名等。
goto
namespace
PHPDOC
请查看PHPDOC
MySql技巧
1、索引
对简单的SQL语句建立合适的索引有效调高效率,查询条件多的情况建立复合索引。比如 index a_b_c(a,b,c)则有(a,b,c)、(a,b)、(a)三索引。
顺序需要按照需求来设置。有集中方式会对索引产生影响
1、如果有条件范围判断,因为B-tree算法导致 存储引擎无法优化第一个条件范围右边的列,也就是后面的索引失效。
eg: SELECT * FROM t1 WHERE a=a1 AND b>b1 AND c=c1;那么就是索引(a,b)生效而不是(a,b,c)这个时候如果改为index a_c_b (a,c,b)那么效果就会优于前面。
2、避免过度索引。如果索引 id的取值 只有1,2,3三个值 那么索引是没什么效果的。
3、含有null的索引会失效。
4、使用短索引(设置索引长度范围)提高查询速度减少磁盘I/O。
5、使用和NOT IN索引失效,全表扫描。
6、不要在列上运算。eg:select * from user where YEAR(data)>2012;导致索引失效,全表扫描。
2、多表联合查询优化
对多表联合查询请使用explain来进行分析。并用profile来查看性能情况。explain会对sql语句提出优化建议,profile可以看出各步操作的耗时。
explain使用过程重点查看 type,key,extra几个字段的值。
type从最好到最差的排序:system、const、eq_reg、ref、rang、index和ALL
extra几个需要优化:Using filesort、Using temporary。(如果必须使用temporary请注意profile里面如果有Copying to tmp table on disk,则需要加大tmp_table_size防止写磁盘。)
key:如果为NULL则说明未使用到索引。这时候就要优化sql。
rows:根据id知道子句的执行顺序,先大后小,大小一样则先上后下。这样应该rows小的先执行,并依此优化语句。
3、其他
没有银弹,只有取舍。
空间换时间永远是最有效果也是最简单的。不要过度追求数据库范式,适当冗余更有益健康。
里大外小使用in,里小外大使用exists.
对分页总数,写入memcache避免全表扫描。