zoukankan      html  css  js  c++  java
  • 分享几个 PHP 编码的最佳实践

    对于初学者而言,可能很难理解为什么某些做法更安全。

    但是,以下一些技巧可能超出了 PHP 的范围。

     

    始终使用大括号

    让我们看下面的代码:

    if (isset($condition) && true === $condition) 
        echo 'this is a success';
    虽然正确,但是你再看看下面的代码
    
    if (isset($condition) && true === $condition) 
        foreach (range("A", "Z") as $letter)
            echo $letter . PHP_EOL;
            echo 'this is a success';
    

      

    依旧正确,但是 this is a success 最终只 echo 了一次,这可能是一个陷阱。

    等等,我们在来看看将 $condition = false; 写在判断之前会发生什么

    $condition = false;
    if (isset($condition) && true === $condition) 
          foreach (range("A", "Z") as $letter)
            echo $letter . PHP_EOL;
            echo 'this is a success';
    

      

    该程序依旧成功打印 this is a success。

    这显然不是我们想要的结果,你现在知道为什么花括号很重要了吧?

    省略括号通常会导致不良的副作用。此外,阅读代码要困难得多。所以应当将其改写成这样

    $condition = false;
    if (isset($condition) && true === $condition) {
        foreach (range("A", "Z") as $letter) {
            echo $letter . PHP_EOL;
        }
        echo 'this is a success';
    }
    

      

    跳过 else 部分

    在使用任何变量之前,最好对它进行初始化。考虑以下例子:

    if (isset($condition) && true === $condition) {
        $main = 'chocolate';
    } else {
        $main = 'vanilla';
    }
    

      

    如果你认为上面例子 OK 的话,那么试着添加几个 elseif 条件看看

    if ($condition) {
        $main = 'chocolate';
        $time = 2;
    } elseif($otherCondition)) {
        $main = 'strawberry';
        $time = 3;
    } elseif($otherOtherCondition)) {
        $main = 'apple';
        $time = 1;
    } else {
        $main = 'vanilla';
        $time = 9;
    }
    

      

    该代码显得很笨重。当你在 elseif 代码块中添加逻辑时你可能会忘记一些变量。

    试着这样做:

    $main = 'vanilla';
    $time = 9;
    
    if ($condition) {
        $main = 'chocolate';
        $time = 2;
    } elseif($otherCondition)) {
        $main = 'strawberry';
        $time = 3;
    } elseif($otherOtherCondition)) {
        $main = 'apple';
        $time = 1;
    }
    

      

    这种方式,每个人都知道 $main 和 $time 变量在接下来的代码中应该被定义,该代码似乎更具可读性。

    这种方式,每个人都知道 $main 和 $time 变量在接下来的代码中应该被定义,该代码似乎更具可读性。

     

    不要使用 @运算符

     

    在 PHP 中 @是一个错误控制操作符。它用于隐藏错误,但事实上没人希望如此。

    相反,你应当试着捕获这些错误并使用错误日志记录。

    @操作符有着极大的缺点,比如将任何调试变为噩梦或使代码运行更慢!

    对于代码的每次运行,它都会调用 INI 设置以将 error_reporting 设为 0,并在这之后将其设回原始值。

    它是如此耗费资源。我觉得完全不使用它才是更为安全的。

    一些关于三元运算符的想法

    虽然三元运算符可能很方便,但代码有可能更加难以阅读。

    不要过度使用三元运算符

    三元运算可用于简化 if-else 部分:

    $main = ($condition) ? "chocolate" : "vanilla";
    

      

    含义如下:

    if ($condition) {
        $main = "chocolate";
    } else {
        $main = "vanilla";
    }
    

      

    上面的例子是 ok 的,但我已经看到过如下的例子:

    $output = ($condition) ? ($otherCondition) ? 'ok' : 'ko' : 'unknown';
    

      

    不建议链式或嵌套式地使用三元运算。

     

    谨慎使用『Elvis』运算符

    Elvis 运算符是一个特殊的运算符。

    $foo = $bar ?: "baz";

    以上是指:

    $foo = $bar ? $bar : "baz";
    

      

    可以这样写:

    if ($bar) {
        $foo = $bar;
    } else {
        $foo = "baz";
    }
    

      

    信不信由你,正如维基百科所说:

    “Elvis 运算符” 这个名字指的是这样一个事实:当它的符号?: 从侧面看时,就像是 埃尔维斯・普雷斯利 (Elvis Presley) 的一个表情符号和他的卷发。

    请小心使用空合并运算符

    自从 PHP7 起,null 合并运算符 可以用了:

    需要将三元运算符与 isset() 结合使用的常见情况的语法。

    因此:

    $result = isset($_GET['result']) ? $_GET['result'] : "default";
    

      

    可以这样写:

    $result = $_GET['result'] ?? "default";
    

      

    在尝试使用空合并操作符替换 ternaries 和 Elvis 操作符时要格外小心!

    空合并运算符从不检查条件是否为真,而是检查您的 var 是否已设置而不为空 ( isset() 的概念)。

     

    综上

     

    我希望你喜欢这些编程技巧。我想说的最后一件事是:请不要为了简洁而牺牲了清晰度。

    更多内容请访问

    怎么从一名码农成为架构师的必看知识点:目录大全(持续更新)50W年薪挑战!

  • 相关阅读:
    CodeForces 734F Anton and School
    CodeForces 733F Drivers Dissatisfaction
    CodeForces 733C Epidemic in Monstropolis
    ZOJ 3498 Javabeans
    ZOJ 3497 Mistwald
    ZOJ 3495 Lego Bricks
    CodeForces 732F Tourist Reform
    CodeForces 732E Sockets
    CodeForces 731E Funny Game
    CodeForces 731D 80-th Level Archeology
  • 原文地址:https://www.cnblogs.com/a609251438/p/12532500.html
Copyright © 2011-2022 走看看