代码之家  ›  专栏  ›  技术社区  ›  Zeth

PHP-何时使用错误抑制运算符(@($obj->var))以及何时使用空合并运算符(?)

php
  •  0
  • Zeth  · 技术社区  · 4 年前

    $new_var = @( $my_obj->var_value ) ?: '';
    

    $new_var = $my_obj->var_value ?? '';
    

    我认为第一种选择是最安全的选择,因为如果 $my_obj $my_obj->var_value 将抛出运行时错误,尝试访问 var_value 在空对象上。还是怎样

    但我的问题是,什么时候使用它是更好的选择 ?? 单行三值速记 @( $foo->bar ) ?: ''

    0 回复  |  直到 4 年前
        1
  •  2
  •   IMSoP    4 年前

    @ 操作员有时被称为“闭嘴”操作员:它会静音 任何及所有警告和错误

    相比之下 ?? 操作员(以及更新的 ?-> 操作员)手柄 一个具体案例

    这个 效应 意图 ?? 接线员更清楚了。

    更好的方法是在完全不需要这种情况下编写代码——例如,只在构造函数中编写的私有属性总是处于已知状态;然后,返回该值的公共方法可以返回该值,而无需额外的错误抑制。

    因此,不是:

    class MyClass {
        public $var_value;
    }
    $my_obj = new MyClass;
    
    // I might have forgotten to set the property, so coalesce it
    echo $my_obj->var_value ?? '';
    

    你可以写:

    class MyClass {
        private string $var_value;
        public function __construct(string $var_value) {
            $this->var_value = $var_value;
        }
        public function get_var_value() {
            return $this->var_value;
        }
    }
    $my_obj = new MyClass('hello');
    
    // No way for this to error, so no extra handling needed
    echo $my_obj->get_var_value();
    
    推荐文章