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年薪挑战!

  • 相关阅读:
    ruby 校内相册爬虫
    ruby爬虫高并发方案
    图片爬虫
    eval class_eval usage in rury deep article
    ruby杂
    EventMachine Screencast — EMHTTPRequest
    Scraping with Typhoeus and Nokogiri
    编码转换
    eventmachine tutorial
    Thread: PaperClip: Attach files through script/console
  • 原文地址:https://www.cnblogs.com/a609251438/p/12532500.html
Copyright © 2011-2022 走看看