"。    使用四个空格代替制表符TAB,保证跨客户端编程器软件的灵活性【编辑器设置】。    每行代码若超出了屏幕宽度,需要手动强制换行,增加可读性。&"/> "。    使用四个空格代替制表符TAB,保证跨客户端编程器软件的灵活性【编辑器设置】。    每行代码若超出了屏幕宽度,需要手动强制换行,增加可读性。&">
Heim > Backend-Entwicklung > PHP-Tutorial > php开发轨范

php开发轨范

WBOY
Freigeben: 2016-06-13 12:56:49
Original
906 Leute haben es durchsucht

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避免全表扫描。

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage