精华内容
下载资源
问答
  • PHP文本换行控制
    2021-04-21 06:21:53

    header("content-type:text/html;charset=utf-8");

    $username=$_POST["username"];

    $password=$_POST["password"];

    $allinfo='usename:' .$username .'pass:'. $password .'\r\n';

    $myfile = fopen("password.txt", "a+");

    fwrite($myfile, $allinfo);

    fclose($myfile);

    ?>

    测试以上根本不会通过\r\n进行换行,因为:

    代码里面不要用单引号, 因为PHP里面的单引号是不对内容里面的东西进行替换的;所以用双引号,因为双引号PHP是检查里面的东西的!

    修改如下即可,代码规范是个问题…

    header("content-type:text/html;charset=utf-8");

    $username=$_POST["username"];

    $password=$_POST["password"];

    $allinfo="usename:" .$username ."pass:"'. $password .'\r\n';

    $myfile = fopen("password.txt", "a+");

    fwrite($myfile, $allinfo);

    fclose($myfile);

    ?>

    本文标题:PHP文本换行控制

    本文链接:

    (转载请附上本文链接)http://vulsee.com/archives/vulsee_2019/0527_7758.html

    更多相关内容
  • php编码规范

    2021-05-03 08:11:59
    [TOC]# 前言如果您已经决定向加入`山西创泰`并贡献代码,请详细...# PHP编码规范与原则文件编码及编辑器格式请在开始编辑山西创泰代码之前调整你的编辑器设置。本条规范同样适用于 `PHP`、`HTML`、`CSS`、`JavaScri...

    [TOC]

    # 前言

    如果您已经决定向加入`山西创泰`并贡献代码,请详细阅读以下规范,并严格遵守。本规范由编程原则组成,融合并提炼了开发人员长时间积累下来的成熟经验,意在帮助开发者养成良好一致的编程风格。如果有需要,本文档会不定期更新。

    # PHP编码规范与原则

    文件编码及编辑器格式

    请在开始编辑山西创泰代码之前调整你的编辑器设置。

    本条规范同样适用于 `PHP`、`HTML`、`CSS`、`JavaScript`

    ## 编码

    请调整您的编辑器文件编码为 `UTF-8`,并关闭 `UTF-8 BOM((Byte Order Mark))`的功能。我们要求使用`PHPStome` 等集成化的`IDE`。最好使用`PHPSTROM`。

    切记请不要使用windows自带的记事本编辑项目文件。

    注意:请确认你的编辑器不会有意或无意的保存文件为 `UTF-8 BOM` 格式, 否则可能造成山西创泰系统通信不正常。

    ## 缩进

    每个缩进的单位约定是一个`Tab`(禁止设置为空格替代,Tab宽度应表示为4个空白字符宽度),需每个参与项目的开发人员在编辑器(`PHPSTROM`)中进行强制设定,以防在编写代码时遗忘而造成格式上的不规范。

    ## 换行

    山西创泰项目中使用`Unix`风格的换行符,即只有换行( `LF` 或 `“\n”` )没有回车( `CR` 或 `“\r”` ),请在你的编辑器内调整

    ## 代码标记

    PHP程序需使用 `<?php ?>` 来界定 `PHP` 代码,在`HTML`页面中嵌入纯变量时,可以使用 `<?php echo $variablename;?>` 这样的形式。

    注意:为了使代码规范化和标准化,山西创泰开发中禁止使用 ` ?>` 和 `=$variablename?>` 这种速记形式。

    ## 注释

    注释是对于那些容易忘记作用的代码添加简短的介绍性内容。请使用`“/* */”`和`“//”`。

    尽量使用变量名,整体逻辑结构来表达程序中的意图,对于特别难懂的逻辑或是算法可以添加注释以便于其他人员更方便理解意图,注释应该是解释 “为什么这么做” 而不是 “这是什么东西” 。

    代码中不得包含任何调试性的代码(注释后也不可以),如果有一些未完成或是待完善的功能必须添加统一的注释标记“//debug”并后跟完整的注释信息

    例如:

    ```

    /**

    * 多行注释请用这种格式

    * @param string $memo 备注

    * @return array

    */

    $num = 1;

    $flag = TRUE; //debug 这里不能确定是否需要对$flag进行赋值

    if(empty($flag)) {

    //Statements

    }

    ```

    # 书写规则

    ## 大括号{}、if和switch

    首括号与关键词同行,尾括号与关键字同列;

    `if` 结构中,`if`、`else` 和 `elseif` 与前后两个大括号同行,左右各一个空格。另外,即便 `if` 后只有一行语句,仍然需要加入大括号,以保证结构清晰;

    `switch` 结构中,通常当一个 `case` 块处理后,将跳过之后的 `case` 块处理,因此大多数情况下需要添加 `break`。`break` 的位置视程序逻辑,与 `case` 同在一行,或新起一行均可,但同一 `switch` 体中,`break` 的位置格式应当保持一致。

    以下是符合上述规范的例子:

    ```

    if ($condition) {

    //Statements

    } else {

    switch ($str) {

    case 'abc':

    $result = 'abc';

    break;

    default:

    $result = 'unknown';

    break;

    }

    }

    ```

    ## 运算符、小括号、空格、关键词和函数

    每个运算符与两边参与运算的值或表达式中间要有一个空格;

    左括号“(” 应和函数关键词紧贴在一起,除此以外应当使用空格将“(”同前面内容分开;

    右括号“)”除后面是“)”,其他一律用空格隔开它们;

    除字符串中特意需要,一般情况下,在程序以及HTML中不出现两个连续的空格;

    任何情况下,PHP程序中不能出现空白的带有TAB或空格的行,即:这类空白行应当不包含任何TAB或空格。同时,任何程序行尾也不能出现多余的TAB或空格;

    每段较大的程序体,上、下应当加入空白行,两个程序块之间只使用1个空行,禁止使用多行。

    程序块划分尽量合理,过大或者过小的分割都会影响他人对代码的阅读和理解。一般可以以较大函数定义、逻辑结构、功能结构来进行划分。少于15行的程序块,可不加上下空白行;

    说明或显示部分中,内容如含有中文、数字、英文单词混杂,应当在数字或者英文单词的前后加入空格。

    根据上述原则,以下举例说明正确的书写格式:

    ```

    $result = (($a + 1) * 3 / 2 + $num)) . 'Test';

    $condition ? func1($var) : func2($var);

    $condition ? $long_statement : $another_long_statement;

    if ($flag) {

    //Statements

    //More than 15 lines

    }

    showmessage('请使用 restore.php 工具恢复数据。');

    ```

    ## 函数定义

    参数的名字和变量的命名规范一致;

    函数定义中的左小括号,与函数名紧挨,中间无需空格;

    开始的左大括号与函数定义为同一行,中间加一个空格,不要另起一行;

    具有默认值的参数应该位于参数列表的后面;

    函数调用与定义的时候参数与参数之间加入一个空格;

    必须仔细检查并切实杜绝函数起始缩进位置与结束缩进位置不同的现象;

    例如,符合标准的定义:

    ```

    function message($string, $operation, $key = '') {

    if ($flag) {

    //Statement

    }

    //函数体

    }

    ```

    不符合标准的定义:

    ```

    function authcode($string,$operation,$key = '') {

    //函数体

    }

    ```

    ## 引号

    由于PHP中单引号和双引号具有不同的含义,因此在使用时有如下原则:

    在能使用单引号的情况下,禁止使用双引号。

    字符串为固定值,不包含换号、制表等特殊转义时,需使用单引号。

    字符串作为数据索引时,需使用单引号。

    字符串不需要带入变量,需使用单引号。

    数据库SQL语句中,所有数据必须加单引号,无论数值还是字串,以避免可能的注入漏洞和SQL错误。

    ```

    $sql = "UPDATE " . tablename('members') . " SET adminid='1' WHERE AND adminid='2'";

    ```

    ## 数据库操作

    为保证数据操作安全,数据库操作有以下处理及书写原则:

    所有数据库查询时,尽量使用封装的 `pdo_getXXX` 系列函数,如果无法满足再考虑书写`SQL`语句使用 `pdo_fetchXXX` 系列函数

    所有`SQL查询`关键字大写,方便代码审查

    所有`SQL对象`(表名,字段名,索引名等)必须用反引号包括

    所有编码参数查询,必须使用PDO的参数绑定机制处理

    不能绑定参数处理的查询,必须处理好变量检测及字符串转义

    这是一个完整的数据库操作示例:

    ```

    //pdo_getXXX 系列函数,推荐使用

    $trades = pdo_getall('trades', array('username' => $_GPC['username'], 'tid' => $_GPC['select']));

    //直接书写SQL,需要自行处理参数转义等问题

    $tids = array();

    if(!empty($_GPC['select'])) {

    foreach($_GPC['select'] as $t) {

    $tids[] = intval($t); //---- 必须将输入参数转换为无安全隐患的格式,数字列必须转换为数字列,字符串列必须使用 addslashes

    }

    }

    if(!empty($tids)) {

    $sql = 'SELECT * FROM ' . tablename('trades') . ' WHERE `username`=:username AND `tid` IN (' . implode($tids) . ')';

    $pars = array();

    $pars[':username'] = $_GPC['username'];

    $trades = pdo_fetchall($sql, $pars);

    }

    ```

    # 命名原则

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

    名字就是事物在它所处的生态环境中一个长久而深远的结果。总的来说,只有了解系统的程序员才能为系统取出最合适的名字。如果所有的命名都与其自然相适合,则关系清晰,含义可以推导得出,一般人的推想也能在意料之中。

    就一般约定而言,类、函数和变量的名字应该总是能够描述让代码阅读者能够容易的知道这些代码的作用。形式越简单、越有规则,就越容易让人感知和理解。应该避免使用模棱两可,晦涩不标准的命名。

    ## 变量、函数名

    变量、函数名一律为`小写格式`;

    变量与函数命名时一切使用单数形式。如果需要表达“多”的概念,可以使用 $goods_list 等数量词

    以标准计算机英文为蓝本,杜绝一切拼音、或拼音英文混杂的命名方式;

    ## 变量名命名方式

    变量名要完全、准确地描述出该变量所代表的事物。这种名字很容易阅读,没有晦涩的缩写,同时也没有歧义。

    一个好记的名字反映的通常都是问题,而不是解决方案。一个好的名字通常表达的是“什么”,而不是“如何”。

    比如:文章推荐列表应该命名成 `$article_recommend_list` 而且 `$data_list`

    ## 单词分隔

    在函数中一定是使用下划线 `_` 分隔多个词

    变量中比较短少的词组合尽量使用分隔符,比如:`商品id`可以直接写成 `$goods_id`,`$multi_id`,`$create_time`

    变量中一些较长的,或是有两个以上含义的用下划线`_`分隔,比如:`$default_groupid`,`$today_recharge`,`$yestday_recharge`

    ## 循环中变量定义

    循环内的局部变量也应该避免使用无意义的`$i`、`$j`等变量,比如循环商品 `$goods as $i => $goods_row`,如果键值不是存放着自增索引,也可以使用 `$goods as $goods_id => $goods_row`,比如循环文件 `$files as $i => $filename`。

    ## 常用缩写列表

    除下方列表外,一切缩写皆不可使用

    ```

    Argument -> arg

    Command -> cmd

    Configuration -> config

    Identification -> id

    Previous -> prev

    Synchronize -> sync

    Initialize -> init

    Minimum -> min

    Maximum -> max

    ```

    ## 类和接口名

    类和接口的命名采用混合大小写字母的Pascal命名法

    接口的命名与类相似,但需要以大写字母“I”开头,以作区分。

    对象成员的命名则采用混合大小写字母的Camel命名法

    ```

    class Loader {

    function func($function_name) {

    }

    function fileCache() {

    }

    }

    ```

    ## JavaScript代码

    `JavaScript`中类和全局对象应使用混合大小写字母的`Pascal`命名法

    `JavaScript`中变量、函数名应采用混合大小写字母的`Camel`命名法。

    `JavaScript`中与 `PHP` 类中书写规范一致

    ## 常量

    常量是增强代码语义重要的一个手段,大多数我们在保存类型或是其它数据时会采用`int`数字来表示,这些数字是没有意义的,这时候我们可以用常量的方式来处理这些数据。

    常量应该总是全部使用`大写字母`命名,必要的情况下,可使用划线来分隔单词;

    `PHP` 的内建值 `true`、`false` 和`null`必须全部采用小写字母书写。

    # 封装

    增加语义上的理解,使结构更清晰。

    增加复用,减少冗余,方便更改。

    封装功能并不是简单的把代码复制到函数里,要进行功能的抽象和拆解,比如:上传微信图文素材和本地图文素材转换成微信素材,这两个功能中“将某些数据保存至微信”是他们两个共有的功能,则会封装 `material_local_news_upload()` ,封装的时候,尽量的不太过多的参与到业务中,外部是负责把数据结构拼接好,函数内部只要处理自己的功能就好,而且要遵循“单一原则”规则。写好函数后,自己思考一下,这个函数如果脱离这个业务是否还可以在其它地方使用?

    ## 封装时机

    获取整体信息时

    获取目标对象的信息时,一定要考虑是否还关联着其它信息。比如获取公众号时,公众号除主体信息外,还会关联着可用模块、所有者、权限等数据,在获取时应该一并获取出来。

    ## 重复使用的代码

    如果相同的代码在不同位置出现两次及以上,就要考虑封装。封装时要把公共的功能抽象出来进行封装,而不是单纯的复制+粘帖。比如:切换公众号和切换小程序,会将`uni_account_save_switch()`和 `uni_account_last_switch()`进行封装

    ## 晦涩难理解的代码

    在写代码时提倡优雅的书写代码,实现功能。但是某些时候可能还是会有一些难以理解的代码,就要考虑封装,封装时一定要注意函数的命名。

    ## 大段的功能操作

    一个功能如果需要大量的代码,比如添加公众号,需要先处理主体信息,还要根据不同的类型处理不同的表,还要处理用户权限,模块等等,此时就要考虑封装。

    ## 其它功能可能会用到

    功能相互间不可能是独立的,总是会在一些功能里用到额外的一些功能或是数据。我们在书写功能时,要长远的考虑一下,比如一些基本信息,基本的操作外部可能会调用,就要考虑封装。比如,会员数据的获取,更新等等

    # 参数传递

    无论是在功能函数中还是控制中,我们都需要接收外部传来的某一些参数来实现功能,我们可以理解成这些参数是我们内部提供给外部的一些访问接口。

    外部提供过来的数据是不可靠也不可信的,外部过来的数据我们必须要进行验证,传递的数据越多,要验证的数据就越多,代码也就越复杂。

    通常我们要尽量减少外部传递的参数,以最小设计(最小传递)来做,能传一个不传两个,更多的值通过内部来获取

    # 变量的初始化与逻辑检查

    任何变量在进行累加、直接显示或存储前必需进行初使化 ,例如:

    ```

    $number = 0; // 数值型初始化

    $string = ''; // 字符串初始化

    $array = array(); // 数组初始化

    ```

    判断一个无法确定(不知道是否已被赋值)的变量时,可用 `empty()` 或 `isset()`,而不要直接使用`if($switch)`的形式。

    `empty()`和`isset()`的区别为:请参阅`PHP手册`。

    如果已经使用 `unset()` 释放了一个变量之后,它将不再是 `isset()`。若使用 `isset()` 测试一个被设置成 `NULL` 的变量,将返回 `FALSE`。同时要注意的是一个 `NULL` 字节 `"\0"` 并不等同于 `PHP` 的 `NULL` 常数。

    判断一个变量是否为数组,请使用`is_array()`,这种判断尤其适用于对数组进行遍历的操作,例如`foreach()`,因为如果不事先判断,`foreach()`会对非数组类型的变量报错;

    判断一个数组元素是否存在,可使用`isset($array['key'])`,也可使用`empty()`。

    # 安全性

    PHP中的变量不并不像C语言那样需要事先声明,解释器会在第一次使用时自动创建他们,同样类型也不需要指定,解释器会根据上下文环境自动确定。从开发人员的角度来看,这无疑是一种极其方便的处理方法。

    一个变量被创建了,就可以在程序中的任何地方使用。这导致的结果就是开发人员工经常不注意初始化变量。因此,为了提高程序的安全性,我们不能相信任何没有明确定义的变量。所有的变量在定义使用前要初使化以防止恶意构造提交的变量覆盖程序中使用的变量。

    不要相信任何客户端提交的数据是安全的。(包括:`$_GET`、`$_POST`、`$_COOKIE`、`$_FILES`、`$_SERVER`、`$_REQUEST`),获取数据时必须使用安全相关函数获取值,请查看

    # 其他细节问题

    山西创泰中每个文件的结构如下,必须严格按照此规范

    ```

    /**

    * 当前文件功能说明

    * [WeEngine System] Copyright (c) 2013 - 2017 WE7.CC

    */

    define('IN_SYS', true); //入口常量定义

    require '../framework/bootstrap.inc.php'; //加载引导文件

    require IA_ROOT . '/web/common/bootstrap.sys.inc.php';

    load()->web('common'); //各种载加函数

    load()->func('communication');

    load()->model('cloud');

    load()->classs('coupon');

    $dos = array('post', 'delete', 'display'); //文件中操作访问控制

    $do = in_array($do, $dos) ? $do : 'post';

    $_W['page']['title'] = '页面标题'; //页面标题及一些公共代码

    $id = intval($_GPC['id']);

    if ($do == 'post') { //各分支代码

    } elseif ($do == 'delete') {

    }

    ```

    # 其他注意要点

    正则表达式操作请使用`perl`兼容正则表达式,即 `preg_` 系列的函数。以提升效率。

    尽量使用高版本的函数。

    本项目不使用命名空间,因此需要按照传统的方式使用文件名和文件夹来规划代码结构。

    展开全文
  • PHP编程代码规范

    2021-04-23 13:17:48
    PHP编程代码规范2018-07-29175编码规范PHP代码文件必须以

    PHP编程代码规范

    2018-07-29

    175

    编码规范PHP代码文件必须以 <?php 标签开始。<?php //开头

    // 不结尾PHP代码文件必须以不带BOM的UTF-8编码。例sublime, setting增加,"show_encoding" : true每行的字符数不超过 80 个字符例,sublime

    "word_wrap": "true",

    "wrap_width": 80,tap键4个空格例,sublime

    "tab_size": 4,PHP代码中应该只定义类(trait)/函数/常量/其他会产生副作用的操作(如:生成文件输出以及修改 .ini 配置文件等),只能选其一。例,

    a.php

    class A

    {

    }

    b.php

    function demo()

    {

    }

    c.php

    define('A', value);

    d.php

    ini_set('some_vars', value);类/trait/Interface的命名必须遵循 StudlyCaps 大写开头的驼峰命名规范。class StudlyCaps

    {

    }

    trait StudlyCaps

    {

    }

    Interface StudlyCaps

    {

    }类中的常量所有字母都必须大写,单词间用下划线分隔。define('FOO_BAR', 'something more');

    const FOO_BAR = value;方法(类/trait中)名称必须符合 camelCase 式的小写开头驼峰命名规范。class StudlyCaps

    {

    public function studlyCaps()

    {

    // coding...

    }

    }函数名称必须符合 snake_case 式的下划线式命名规范。function snake_case()

    {

    // coding...

    }私有的(private)方法(类/trait中)名称必须符合 _camelCase 式的前置下划线小写开头驼峰命名规范。class StudlyCaps

    {

    private function _studlyCaps()

    {

    // coding...

    }

    }方法名称 第一个单词 为动词。class StudlyCaps

    {

    public function doSomething()

    {

    // coding...

    }

    }变量 必须符合 camelCase 式的小写开头驼峰命名规范。class StudlyCaps

    {

    public function doSomething()

    {

    $someVariable = 'demo';

    // coding...

    }

    }方法/函数 多参数时,之间要有1个空格class StudlyCaps

    {

    public function doSomething($variableOne, $variableTwo)

    {

    // coding...

    }

    }运算符/表达式 要有一个空格$a = $b + $c;

    $a = $b . $c;每个 namespace 命名空间声明语句块 和 use 声明语句块后面,必须 插入一个空白行。namespace Standard;

    // 空一行

    use Test\TestClass;//use引入类

    // 空一行类的开始花括号 “{ “必须 写在函数声明后自成一行,结束花括号”}”也必须写在函数主体后自成一行。class StudlyCaps

    {

    }方法/函数的开始花括号 { 必须 写在函数声明后自成一行,结束花括号 }也 必须 写在函数主体后自成一行。class StudlyCaps

    {

    public function studlyCaps()

    {

    // coding...

    }

    }

    function snake_case()

    {

    // coding...

    }类的属性和方法 必须 添加访问修饰符(private、protected 以及 public),abstract 以及 final 必须 声明在访问修饰符之前,而 static 必须 声明在访问修饰符之后。abstract class StudlyCaps

    {

    abstract public function studlyCaps();

    final public static function studlyCapsOne()

    {

    }

    }控制结构的关键字后 必须 要有一个空格符,而调用方法或函数时则 一定不可 有。if ($valueOne === $valueTwo) {

    // code...

    }

    switch ($valueThree) {

    case 'value':

    // code...

    break;

    default:

    // code...

    break;

    }

    do {

    // code...

    } while ($valueFour <= 10);

    while ($valueFive <= 10) {

    // code...

    }

    for ($i = 0; $i 

    // code...

    }

    $demo = new Demo()

    $demo->doSomething();

    do_something();控制结构的开始花括号 { 必须 写在声明的同一行,而结束花括号 } 必须 写在主体后自成一行。if ($valueOne === $valueTwo) {

    // code...

    }

    switch ($valueThree) {

    case 'value':

    // code...

    break;

    default:

    // code...

    break;

    }

    do {

    // code...

    } while ($valueFour <= 10);

    while ($valueFive <= 10) {

    // code...

    }

    for ($i = 0; $i 

    // code...

    }控制结构的开始左括号后和结束右括号前,都一定不可有空格符。if ($valueOne === $valueTwo) {// 控制结构(右边和)左边不加空格

    // code...

    }

    编码建议sql过长// heredoc语法

    $sql = <<

    SELECT delivery_id

    FROM d_test

    WHERE delivery_id

    IN (123,234)

    GROUP BY delivery_id

    HAVING SUM(send_number) <= 0;

    SQL;if等控制结构条件过长if ($a > 0

    && $b > 0

    && $c > 0

    && $d > 0

    && $e > 0) {

    }方法或函数参数大于三个换行public function tooLangFunction(

    $valueOne   = '',

    $valueTwo   = '',

    $valueThree = '',

    $valueFour  = '',

    $valueFive  = '',

    $valueSix   = '')

    {

    //coding...

    }链式操作超过两个$this->nameTest->functionOne()

    ->functionTwo()

    ->functionThree();数组php5.4以后,使用[]$a = [

    'aaa' => 'aaa',

    'bbb' => 'bbb'

    ];单引号多引号字符串中无变量,单引号

    字符串中有变量,双引号$str = 'str';

    $arg = "$str";声明类或者方法或函数添加描述&属性描述&作者/**

    * 类描述

    *

    * desc

    */

    class StandardExample

    {

    /**

    *  常量描述.

    *

    * @var string

    */

    const THIS_IS_A_CONST = '';

    /**

    * 属性描述.

    *

    * @var string

    */

    public $nameTest = '';

    /**

    * 构造函数.

    *

    * 构造函数描述

    * @author name 

    * @param  string $value 形参名称/描述

    * @return 返回值类型        返回值描述

    * 返回值类型:string,array,object,mixed(多种,不确定的),void(无返回值)

    */

    public function __construct($value = '')

    {

    // coding...

    }api方法提供测试样例example/**

    * 成员方法名称.

    *

    * 成员方法描述

    *

    * @param  string $value 形参名称/描述

    *

    * @example domain/api/controller/action?argu1=111&argu2=222

    */

    public function testFunction($value = '')

    {

    // code...

    }使用try…catch…try {

    // coding...

    } catch (\Exception $e) {

    // coding...

    }连续调用多个方法(大于3个)使用foreach// 改写doSome为doSomething

    class StandardExample

    {

    /**

    * 方法列表

    *

    * @var array

    */

    private $_functionList = [];

    public function __construct($functionList = array())

    {

    $this->_functionList = $value;

    }

    public function doSome()

    {

    $this->functionOne();

    $this->functionTwo();

    $this->functionThree();

    $this->functionFour();

    }

    public function doSomething()

    {

    foreach($this->_functionList as $function) {

    $this->$function();

    }

    }

    ...

    }文件顶部进行版权声明// +----------------------------------------------------------------------

    // | Company Name  xx服务

    // +----------------------------------------------------------------------

    // | Copyright (c) 2017 http://domain All rights reserved.

    // +----------------------------------------------------------------------

    // | Author: name 

    // +----------------------------------------------------------------------

    分享到:

    展开全文
  • PHP PSR代码格式规范

    2021-03-23 19:55:46
    PSR是PHP通用性框架小组 (PHP Framework Interop Group) 制定的PHP代码编写格式规范,是PHP开发的事实标准。截止到目前(2015年2月),正式发布过的PHP规范共有5个:PSR 0 自动加载标准(已废弃,被PSR 4取代)PSR 1 ...

    PSR是PHP通用性框架小组 (PHP Framework Interop Group) 制定的PHP代码编写格式规范,是PHP开发的事实标准。

    截止到目前(2015年2月),正式发布过的PHP规范共有5个:

    PSR 0 自动加载标准(已废弃,被PSR 4取代)

    PSR 1 基本代码规范

    PSR 2 代码风格指南

    PSR 3 日志接口

    PSR 4 改进的自动加载

    那么使用、遵循PSR标准有什么必要和好处呢?统一的编码风格,可以让我们轻松愉悦地阅读他人的代码,以及编写让他人的代码。

    就PSR规范本身来说,个人觉得是非常优秀、简洁的实践结晶。遵循这些标准,除了能使我们的代码更加可读之外,还能让我们的程序更加健壮,更能提高开发者的个人素养。

    下面罗列一下PSR 1 ~ PSR 4的主要内容(已废弃的PSR 0不再介绍):

    PSR 1 基本代码规范

    必须把PHP代码放在 <?php ?>或= ?>标签中。不得使用其他PHP标签句法。

    文件编码只使用UTF-8字符集编码,无BOM 格式。

    一个源文件可以用来做声明(类、性状、函数、常量等),或者用来做一些有副作用的操作(如输出信息或处理数据),但不建议同时做这两件事。

    应该避免的例子,既包含声明又有副作用:

    // 副作用:修改了ini配置

    ini_set('error_reporting', E_ALL);

    // 副作用:载入了文件

    include "file.php";

    // 副作用:产生了输出

    echo "\n";

    // 声明

    function foo()

    {

    // 函数体

    }

    提倡的例子,仅包含声明:

    // 声明

    function foo()

    {

    // 函数体

    }

    // 条件式声明不算做是副作用

    if (! function_exists('bar')) {

    function bar()

    {

    // 函数体

    }

    }

    一个源文件中只能有一个类,并且每个类至少要有一级命名空间名,即一个顶级的组织名(vendor name)。类名必须使用骆驼式(StulyCase)写法

    namespace Vendor\Model;

    class StudlyCaps

    {

    // 代码

    }

    类常量必须只由大写字母和下划线(_)组成:

    namespace Vendor\Model;

    class Foo

    {

    const VERSION = '1.0';

    const DATE_APPROVED = '2012-06-01';

    }

    类属性命名依据喜好选择形如 $StulyCaps、$camelCase 或者 $unser_score 的风格,并在一个合理的范围内保持一致。

    方法名必须使用驼峰式(camelCase)风格来声明,也就是首字母是小写的,后续单词的首字母都是大写的。

    PSR 2 代码风格指南

    代码使用4个空格来进行缩进,不使用制表符。

    PHP文件使用Unix LF(换行)作为行结束符,最后要有一个空行,而且不能使用关闭标签?>(避免意料之外的输出错误)。

    PHP关键字都应该使用小写字母,如true、false、null。

    一行代码的长度不建议有硬限制;软限制必须为120个字符,建议每行代码80个字符或者更少。

    在命名空间(namespace)的声明下面必须有一行空行,并且在导入(use)的声明下面也必须有一行空行。

    类(class)的左花括号必须放到其声明下面自成一行,右花括号则必须放到类主体下面自成一行。

    方法(method)的左花括号必须放到其声明下面自成一行,右花括号则必须放到方法主体的下一行。

    所有的属性(property)和方法(method) 必须有可见性声明;抽象(abstract)和终结(final)声明必须在可见性声明之前,而静态(static)声明必须在可见性声明之后。

    控制结构的左花括号必须跟其放在同一行,右花括号必须放在该控制结构代码主体的下一行。

    if ($a === true) {

    echo 'yes';

    } else {

    echo 'no';

    }

    控制结构的左括号之后不可有空格,右括号之前也不可有空格。

    PSR 3 日志接口

    基础

    符合PSR-3推荐规范的PHP日志记录器组件,必须包含一个实现Psr\Log\LoggerInterface接口的PHP类。要实现九个方法:

    namespace Psr\Log;

    interface LoggerInterface

    {

    public function emergency($message, array $content = array());

    public function alert($message, array $content = array());

    public function critical($message, array $content = array());

    public function warning($message, array $content = array());

    public function notice($message, array $content = array());

    public function info($message, array $content = array());

    public function debug($message, $array $content = array());

    public function log($level, $message, array $content = array());

    }

    LoggerInterface 接口对外定义了八个方法,分别用来记录 RFC 5424 中定义的八个等级的日志:debug、 info、 notice、 warning、 error、 critical、 alert 以及 emergency 。

    第九个是log方法,其第一个参数为记录的等级。可使用一个预先定义的等级常量作为参数来调用此方法,必须与直接调用以上八个方法具有相同的效果。如果传入的等级常量参数没有预先定义,则必须抛出 Psr\Log\InvalidArgumentException 类型的异常。在不确定的情况下,使用者不该使用未支持的等级常量来调用此方法。

    消息

    每个方法都接受一个字符串,或者一个有__toString方法的对象作为message参数。实现者可以对传入的对象有特殊的处理。如果没有,实现者 必须将它转换成字符串。

    $message参数中可能包含一些可以被$context参数的数值所替换的占位符。占位符名字必须和$context数组类型参数的键名对应。占位符名字必须使用一对花括号来作为分隔符。在占位符和分隔符之间不能有任何空格。占位符名字应该只能由A-Z、a-z、0-9、_和.组成。其它的字符作为以后占位符规范的保留字。实现者可以使用占位符来实现不同的转义和翻译日志成文。因为用户并不知道上下文数据会是什么,所以不推荐提前转义占位符。

    上下文

    每个方法接受一个数组作为$context参数,用来存储不适合在字符串中填充的信息。数组可以包括任何东西。实现者 必须确保他们尽可能包容的对$context参数进行处理。一个$context参数的给定值不可导致抛出异常,也不可产生任何PHP错误,警告或者提醒。

    如果在$context参数中传入了一个异常对象,它必须以exception作为键名。记录异常轨迹是通用的模式,并且可以在日志系统支持的情况下从异常中提取出整个调用栈。实现者在将exception当做异常对象来使用之前必须去验证它是不是一个异常对象,因为它可能包含着任何东西。

    助手类和接口

    Psr\Log\AbstractLogger类可以让你通过继承它,并通用的log方法来方便的实现LoggerInterface接口。而其他八个方法将会把消息和上下文转发给log方法。

    类似的,使用Psr\Log\LoggerTrait只需要你实现通用的log方法。注意,特性是不能用来实现接口的,所以你依然需要在你的类中implement LoggerInterface。

    Psr\Log\NullLogger是和接口一起提供的。它在没有可用的日志记录器时,可以为使用日志接口的用户们提供一个后备的“黑洞”。但是,当$context参数的构建非常耗时的时候,直接判断是否需要记录日志可能是个更好的选择。

    Psr\Log\LoggerAwareInterface只有一个setLogger(LoggerInterface $logger)方法,它可以在框架中用来随意设置一个日志记录器。

    Psr\Log\LoggerAwareTrait特性可以被用来在各个类中轻松实现相同的接口。通过它可以访问到$this->logger。

    Psr\Log\LogLevel类拥有八个日志等级的常量。

    namespace Psr\Log;

    class LogLevel

    {

    const EMERGENCY = 'emergency';

    const ALERT = 'alert';

    const CRITICAL = 'critical';

    const ERROR = 'error';

    const WARNING = 'warning';

    const NOTICE = 'notice';

    const INFO = 'info';

    const DEBUG = 'debug';

    }

    PSR 4 改进的自动加载

    术语「类」是一个泛称,它包含类、接口、trait 以及其他类似的结构;

    完全限定类名应该类似如下范例:\(\)*\

    完全限定类名必须有一个顶级命名空间(Vendor Name);

    完全限定类名可以有多个子命名空间;

    完全限定类名应该有一个终止类名;

    下划线在完全限定类名中是没有特殊含义的;

    字母在完全限定类名中可以是任何大小写的组合;

    所有类名必须以大小写敏感的方式引用;

    当从完全限定类名载入文件时:

    在完全限定类名中,连续的一个或几个子命名空间构成的命名空间前缀(不包括顶级命名空间的分隔符),至少对应着至少一个基础目录。

    在「命名空间前缀」后的连续子命名空间名称对应一个「基础目录」下的子目录,其中的命名 空间分隔符表示目录分隔符。子目录名称必须和子命名空间名大小写匹配;

    终止类名对应一个以.php 结尾的文件。文件名必须和终止类名大小写匹配;

    自动载入器的实现不可抛出任何异常,不可引发任何等级的错误;也不应返回值;

    参考资料:

    展开全文
  • 本文主要和大家分享PHP代码样式风格规范,希望能帮助到大家。一、基本约定1、源文件(1)、纯PHP代码源文件只使用 ;(2)、源文件中PHP代码的编码格式必须是无BOM的UTF-8格式;(3)、使用 Unix LF(换行符)作为行结束符;...
  • 关于PHP中echo换行问题

    2022-03-07 20:03:08
    但是我发现即使是双引号,\n也没有正常换行 echo "hello \n world"; 首先,PHP没有任何问题,成功将转移换行符\n解析出来,最初还以为PHP不兼容\n这个语法呢。 检查网页源代码后发现: <body>hello world&...
  • php 代码编写规范

    2019-12-11 16:59:15
    为了更好的提高技术部的工作效率,保证开发的有效性和合理性,并可最大程度的提高程序代码的可读性和可重复利用性,指定此规范。开发团队根据自己的实际情况,可以对本规范进行补充或裁减。 2 整体要求 技术部php...
  • 原标题:值得注意的PHP代码样式规范为了减少不同开发者在浏览代码时减少认知的差异。为此列举一组如何格式化PHP代码的共用规则。各个成员项目的共性组成了本文的样式规则。当不同的开发者在不同的项目中合作时,将会...
  • php代码编写规范

    2019-12-05 10:47:15
    为了更好的提高技术部的工作效率,保证开发的有效性和合理性,并可最大程度的提高程序代码的可读性和可重复利用性,指定此规范。开发团队根据自己的实际情况,可以对本规范进行补充或裁减。 2 整体要求 技术部php...
  • 前端代码规范一.编程规约(一) 命名规范1.1.1 项目命名1.1.2 目录命名1.1.3 JS、CSS、SCSS、HTML、PNG 文件命名1.1.4 命名严谨性 (二) HTML 规范 (Vue Template 同样适用)1.2.1 HTML 类型1.2.2 缩进1.2.3 分块...
  • 2、-换行标签br是英文单词“break”的缩写,作用是将文字在一个段落中强行换行,是自封闭标签,规范的写法是。标签和标签都会使文本换行,不同之处就是它们的间距不同,用标签分段的间距比较大,层次更加分明。实例...
  • PHP代码规范

    2018-12-14 10:57:01
    试用PSR2代码规范,细则参考以下链接: PHP PSR-2 代码风格规范 (中文版) ... 执行以下命令检查代码规范: phpcs --standard=psr2 要检查的目录名/ ...若有不规范处,可用以下命令修复空格换行相关的规范phpc...
  • PHP 代码规范简洁之道

    2021-04-30 05:12:40
    统一的编码规范--编码规范往简单说其实就是三个方面:换行空格变量命名放在 PHP 里面,还有一些附加的地方,比如关键字大小写,语法糖的使用(array()与[]等)的问题。之前整理过 PSR 的标准,也找过 php-cs-fixer ...
  • 和 导入(Use)声明2、类(class),属性(property)和方法(method)3、控制结构4、注释5、空格6、空行PSR-4 规范【补充】数组 的书写格式一、基本约定1、源文件(1)、纯PHP代码源文件只使用 ;(2...
  • php代码规范

    2021-04-29 03:01:58
    代码规范1.变量使用下划线命名法。比如:$stu_name2.函数使用下划线命名法。比如:function get_user_info()3.类名使用大驼峰式命名法。比如:class ClassInfo4.私有属性使用下划线命名法,并且以_开头。比如:...
  • 今天爱分享给大家带来PHP 代码规范有哪些【详细讲解】,希望能够帮助到大家。通用约定:代码缩进全部用tab,在编辑器里面设置tab存为制表符,不要存为空格。不要打一堆空格来做缩进。SVN / Git 中新建文件编码类型...
  • php代码规范

    2016-06-19 00:48:35
    为此列举一组如何格式化PHP代码的共用规则。 各个成员项目的共性组成了本文的样式规则。当不同的开发者在不同的项目中合作时,将会在这些不同的项目中使用一个共同的标准。 因此,本指南的好处不在于规则本身,而...
  • php 代码规范简洁

    万次阅读 2017-02-24 14:15:18
    1. 统一的编码规范 编码规范往简单说其实就是三个方面: ...这些都是规范代码的重要手段。有统一的标准,配合上工具的检查,形成统一的编码约束不是什么难题。 没有规范,不同的人甚至同一个人在空格
  • 规范希望通过制定一系列规范PHP代码的规则,以减少在浏览不同作者的代码时,因代 码风格的不同而造成不便。 当多名程序员在多个项目中合作时,就需要一个共同的编码规范, 而本文中的风格规范源自 于多个不同...
  • php开发代码规范

    2018-11-07 14:28:06
    开发哲学 DRY –「Don't Repeat Yourself」... KISS - 「Keep it Simple, Stupid」提倡简单易读的代码,不写高深、晦涩难懂的代码,不过度设计; 主厨精选 - 让有经验的人来为你选择方案,不独创方案; 官方提倡...
  • PHP 代码规范

    2021-05-07 13:04:20
    通用约定:代码缩进全部用tab,在编辑器里面设置tab存为制表符,不要存为空格。不要打一堆空格来做缩进。SVN / Git 中新建文件...行宽:120 字符代码规范// xxx@w3cschool.cc 每个文件必须注明owner的邮箱require...
  • vscode怎么一键规范代码格式

    千次阅读 2020-12-30 12:00:37
    {}在右侧用户设置中可以对当前编辑器默认的进行更改下面的复制到用户设置中, ctrl + s 即可完成对代码规范。{// vscode默认启用了根据文件类型自动设置tabsize的选项"editor.detectIndentation": false,// 重新...
  • 本文可以帮助你解决一下问题:1,GD库添加文字水印无法换行2,GD库添加文本实现居中显示3,stil/gd-text扩展包添加文字为中文时,换行失效GD库是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库...
  • 在很多站长看来,PHP程序员总是被认为是网站开发的低端人员(还好现在有前端工程师了,哈哈哈哈),那么从PHP语法结构、PHP命名规范和预定...很多写程序代码的程序员对代码规范没有明确的写法。它与PHP语言本身的入...
  • 代码规范问题虽然不影响程序的运行,但是却很可以使代码在管理上变得很容易。注释注释是对于那些容易忘记作用的代码添加简短的介绍性内容。请使用 C 样式的注释“/* */”和标准 C++ 注释“//”。类、方法、函数请...
  • PHP 编码规范 3.6 换行

    2013-04-14 09:15:01
    3.6 换行 当一个表达式无法容纳在一行内时,可以依据如下一般规则断开之: - 在一个逗号后面断开 - 在一个操作符前面断开 - 宁可选择较高级别(higher-level)的断开,而非较低级别(lower-level)的断开 - 新的一...
  • 被包围在 pre 元素中的文本通常会保留空格和换行符,但不幸的是,当你在标签里面写代码的时候,如果你没有手动换行,它也会给你保留,而不会自动换行。这时候,你可以使用overflow:auto; (当代码超出容器边界的时候...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,360
精华内容 3,344
关键字:

php 代码换行规范