Null coalescing operator trong php

Ngoài các toán tử như toán tử quan hệ, toán tử luận lý mà PHP đang hỗ trợ thì PHP7 đã bổ sung thêm một số toán tử rất hay giúp việc xử lý dữ liệu nhanh hơn. Trong bài viết mình chỉ giới thiệu những toán tử mà mình biết thôi nhé, sau này tìm ra thêm mình sẽ bổ sung.

Null coalescing operator trong php

Null coalescing operator trong php

Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

1. Toán tử ?? Null Coalescing Operator

Trong PHP7 có giới thiệu toán tử ??, đây là toán tử dùng để thay thế cho hàm isset khi ta gán dữ liệu. Ví dụ khi bạn lấy dữ liệu từ phương thức GET thì thông thường ta sử dụng thêm hàm isset để kiểm tra như sau:

if (isset($_GET['id'])){
    $id = $_GET['id'];
}

Hoặc kết hợp với toán tử ba ngôi:

$id = isset($_GET['id']) ? $_GET['id'] : '';

Bài viết này được đăng tại [free tuts .net]

Tuy nhiên nếu sử dụng toán tử ?? thì ta viết đơn giản nhu sau:

Như vậy cú pháp sẽ như sau:

$id = ($is_null) ?? 'ok';

Giải thích: Nếu biểu thức $is_null có giá trị khác null thì biến $id sẽ có giá trị là $is_null, ngược lại biến $id sẽ có giá trị là ok.

2. Toán tử <=> Spaceship Operator

Đây là toán tử thường dùng với kiểu số (INT), nếu bạn sử dụng với kiểu chuỗi thì hệ thống sẽ dựa vào mã ASCII để lấy ra số của chuỗi đó.

Toán tử này có cú pháp như sau:

Ta sẽ có ba trường hợp xảy ra:

  • Nếu $a > $b thì $result sẽ có giá trị là 1
  • Nếu $a = $b thì $result sẽ có giá trị là 0
  • Nếu $a < $b thì $result sẽ có giá trị là -1

Ví dụ:

$a = 12;
$b = 20;

$result = $a <=> $b;

echo $result; // kết quả -1

3. Lời kết

Hiện tại thì mình mới tìm thấy hai toán tử trên thôi, sau này nếu tìm thấy thêm thì mình sẽ bổ sung cho bài viết. Hoặc nếu bạn biết toán tử nào thì hãy comment để mình bổ sung vào bài viết nhé.

answer

422

Null coalescing operator trong php

Khi đối số đầu tiên của bạn là null, về cơ bản chúng giống nhau ngoại trừ việc liên kết null sẽ không xuất ra E_NOTICEkhi bạn có một biến không xác định. Tài liệu di chuyển PHP 7.0 có điều này để nói:

Toán tử liên kết null (??) đã được thêm vào dưới dạng đường cú pháp cho trường hợp phổ biến là cần sử dụng một số ba kết hợp với Isset (). Nó trả về toán hạng đầu tiên nếu nó tồn tại và không phải là NULL; nếu không nó trả về toán hạng thứ hai của nó.

Dưới đây là một số mã ví dụ để chứng minh điều này:

 null);

print $b['a'] ?? 'd'; // d
print "\n";

print $b['a'] ?: 'd'; // d
print "\n";

print $b['c'] ?? 'e'; // e
print "\n";

print $b['c'] ?: 'e'; // Notice: Undefined index: c in /in/apAIb on line 33
print "\n";

Các dòng có thông báo là những dòng mà tôi đang sử dụng toán tử bậc ba viết tắt thay vì toán tử liên kết null. Tuy nhiên, ngay cả khi có thông báo, PHP sẽ đưa ra phản hồi tương tự.

Thực thi mã: https://3v4l.org/McavC

Tất nhiên, điều này luôn luôn giả định đối số đầu tiên là null. Một khi nó không còn null nữa, thì bạn sẽ có sự khác biệt ở chỗ ??toán tử sẽ luôn trả về đối số đầu tiên trong khi tốc ?:ký chỉ trả về đối số đầu tiên là đúng và điều đó phụ thuộc vào cách PHP sẽ nhập mọi thứ thành boolean .

Vì thế:

$a = false ?? 'f'; // false
$b = false ?: 'g'; // 'g'

sau đó sẽ có $abằng false$bbằng 'g'.

422 hữu ích 5 bình luận chia sẻ

answer

149

Null coalescing operator trong php

Chạy bên dưới trên chế độ tương tác php ( php -atrên thiết bị đầu cuối). Nhận xét trên mỗi dòng hiển thị kết quả.

var_export (false ?? 'value2');   // false
var_export (true  ?? 'value2');   // true
var_export (null  ?? 'value2');   // value2
var_export (''    ?? 'value2');   // ""
var_export (0     ?? 'value2');   // 0

var_export (false ?: 'value2');   // value2
var_export (true  ?: 'value2');   // true
var_export (null  ?: 'value2');   // value2
var_export (''    ?: 'value2');   // value2
var_export (0     ?: 'value2');   // value2

Nhà điều hành Null Coalescing ??

  • ??giống như một "cổng" chỉ cho phép NULL đi qua .
  • Vì vậy, nó luôn trả về tham số đầu tiên , trừ khi tham số đầu tiên xảy raNULL .
  • Điều này có nghĩa ??là giống như( !isset() || is_null() )

Sử dụng ??

  • rút ngắn !isset() || is_null() kiểm tra
  • ví dụ $object = $object ?? new objClassName();

Nhà điều hành Stacking Null Coalese

        $v = $x ?? $y ?? $z; 

        // This is a sequence of "SET && NOT NULL"s:

        if( $x  &&  !is_null($x) ){ 
            return $x; 
        } else if( $y && !is_null($y) ){ 
            return $y; 
        } else { 
            return $z; 
        }

Nhà khai thác bậc ba ?:

  • ?:giống như một cánh cổng cho phép anything falsyđi qua - bao gồmNULL
  • Bất cứ điều gì falsy: 0, empty string, NULL, false, !isset(),empty()
  • Giống như toán tử bậc ba cũ: X ? Y : Z
  • Lưu ý: ?:sẽ ném PHP NOTICEvào các biến không xác định ( unsethoặc !isset())

Sử dụng ?:

  • kiểm tra empty(), !isset(), is_null()vv
  • rút ngắn hoạt động bậc ba như !empty($x) ? $x : $y thành$x ?: $y
  • rút ngắn if(!$x) { echo $x; } else { echo $y; }thànhecho $x ?: $y

Toán tử bậc ba xếp chồng

        echo 0 ?: 1 ?: 2 ?: 3; //1
        echo 1 ?: 0 ?: 3 ?: 2; //1
        echo 2 ?: 1 ?: 0 ?: 3; //2
        echo 3 ?: 2 ?: 1 ?: 0; //3
    
        echo 0 ?: 1 ?: 2 ?: 3; //1
        echo 0 ?: 0 ?: 2 ?: 3; //2
        echo 0 ?: 0 ?: 0 ?: 3; //3

    
        // Source & Credit: http://php.net/manual/en/language.operators.comparison.php#95997
   
        // This is basically a sequence of:

 
        if( truthy ) {}
        else if(truthy ) {}
        else if(truthy ) {}
        ..
        else {}

Xếp chồng cả hai, chúng ta có thể rút ngắn điều này:

        if( isset($_GET['name']) && !is_null($_GET['name'])) {
            $name = $_GET['name'];
        } else if( !empty($user_name) ) {
             $name = $user_name; 
        } else {
            $name = 'anonymous';
        }

Về điều này:

        $name = $_GET['name'] ?? $user_name ?: 'anonymous';

Tuyệt, phải không? :-)

149 hữu ích 4 bình luận chia sẻ

answer

74

Null coalescing operator trong php

Nếu bạn sử dụng toán tử bậc ba phím tắt như thế này, nó sẽ gây ra thông báo nếu $_GET['username']không được đặt:

$val = $_GET['username'] ?: 'default';

Vì vậy, thay vào đó bạn phải làm điều gì đó như sau:

$val = isset($_GET['username']) ? $_GET['username'] : 'default';

Các nhà khai thác vô coalescing tương đương với tuyên bố trên, và sẽ trở lại 'mặc định' nếu $_GET['username']không được thiết lập hoặc là null:

$val = $_GET['username'] ?? 'default';

Lưu ý rằng nó không kiểm tra độ tin cậy . Nó chỉ kiểm tra nếu nó được đặt và không phải null.

Bạn cũng có thể làm điều này và giá trị được xác định đầu tiên (đặt và không null) sẽ được trả về:

$val = $input1 ?? $input2 ?? $input3 ?? 'default';

Bây giờ đó là một nhà điều hành liên kết thích hợp.

74 hữu ích 0 bình luận chia sẻ

answer

45

Null coalescing operator trong php

Sự khác biệt chính là

  1. Ternary hành biểu hiện expr1 ?: expr3lợi nhuận expr1nếu expr1đánh giá lại để TRUEnhưng mặt khác Null coalescing hành biểu hiện (expr1) ?? (expr2) đánh giá lại để expr1nếu expr1không NULL

  2. Toán tử bậc ba expr1 ?: expr3 phát ra thông báo nếu giá trị bên trái (expr1) không tồn tại nhưng mặt khác Toán tử Null Coalescing (expr1) ?? (expr2) Đặc biệt, không phát ra thông báo nếu giá trị bên trái (expr1) không tồn tại, giống như isset().

  3. TernaryOperator được kết hợp trái

    ((true ? 'true' : false) ? 't' : 'f');
    

    Null Coalescing Operator là liên kết phù hợp

    ($a ?? ($b ?? $c));
    

Bây giờ, hãy giải thích sự khác biệt giữa bằng ví dụ:

Nhà điều hành bậc ba (?:)

$x='';
$value=($x)?:'default';
var_dump($value);

// The above is identical to this if/else statement
if($x){
  $value=$x;
}
else{
  $value='default';
}
var_dump($value);

Nhà điều hành Null Coalescing (??)

$value=($x)??'default';
var_dump($value);

// The above is identical to this if/else statement
if(isset($x)){
  $value=$x;
}
else{
  $value='default';
}
var_dump($value);

Đây là bảng giải thích sự khác biệt và giống nhau giữa '??'?:

Null coalescing operator trong php

Lưu ý đặc biệt: toán tử liên kết null và toán tử bậc ba là một biểu thức và nó không đánh giá một biến mà là kết quả của một biểu thức. Điều quan trọng là phải biết nếu bạn muốn trả về một biến bằng tham chiếu. Câu lệnh return $ foo ?? $ thanh; và trả về $ var == 42? $ a: $ b; trong một hàm trả về theo tham chiếu do đó sẽ không hoạt động và một cảnh báo được đưa ra.

45 hữu ích 0 bình luận chia sẻ

answer

17

Null coalescing operator trong php

Cả hai đều hoạt động khác nhau khi nói đến xử lý dữ liệu động.

Nếu biến trống ('') thì liên kết rỗng sẽ coi biến là đúng nhưng toán tử bậc ba viết tắt thì không. Và đó là điều cần phải ghi nhớ.

$a = NULL;
$c = '';

print $a ?? '1b';
print "\n";

print $a ?: '2b';
print "\n";

print $c ?? '1d';
print "\n";

print $c ?: '2d';
print "\n";

print $e ?? '1f';
print "\n";

print $e ?: '2f';

Và đầu ra:

1b
2b

2d
1f

Notice: Undefined variable: e in /in/ZBAa1 on line 21
2f

Liên kết: https://3v4l.org/ZBAa1

17 hữu ích 1 bình luận chia sẻ

answer

16

Null coalescing operator trong php

Cả hai đều là viết tắt của các biểu thức dài hơn.

?:là viết tắt của $a ? $a : $b. Biểu thức này sẽ đánh giá thành $ a nếu $ a đánh giá là TRUE .

??là viết tắt của isset($a) ? $a : $b. Biểu thức này sẽ đánh giá thành $ a nếu $ a được đặt và không rỗng.

Các trường hợp sử dụng của chúng trùng lặp khi $ a là không xác định hoặc null. Khi $ a không được xác định ??sẽ không tạo ra E_NOTICE, nhưng kết quả vẫn giống nhau. Khi $ a là null, kết quả giống nhau.

16 hữu ích 0 bình luận chia sẻ

answer

6

Null coalescing operator trong php

Đối với người mới bắt đầu:

Toán tử liên kết rỗng (??)

Mọi thứ đều đúng ngoại trừ nullcác giá trị và không xác định (biến / chỉ số mảng / thuộc tính đối tượng)

Ví dụ:

$array = [];
$object = new stdClass();

var_export (false ?? 'second');                           # false
var_export (true  ?? 'second');                           # true
var_export (null  ?? 'second');                           # 'second'
var_export (''    ?? 'second');                           # ""
var_export ('some text'    ?? 'second');                  # "some text"
var_export (0     ?? 'second');                           # 0
var_export ($undefinedVarible ?? 'second');               # "second"
var_export ($array['undefined_index'] ?? 'second');       # "second"
var_export ($object->undefinedAttribute ?? 'second');     # "second"

Điều này về cơ bản là kiểm tra biến (chỉ số mảng, thuộc tính đối tượng, v.v.) có tồn tại hay không null. tương tự như issetchức năng

Viết tắt toán tử bậc ba (? :)

mỗi điều sai ( false, null, 0, chuỗi rỗng) đều được đến như sai, nhưng nếu đó là không xác định nó cũng đi kèm như sai nhưng Noticesẽ ném

Ví dụ

$array = [];
$object = new stdClass();

var_export (false ?: 'second');                           # "second"
var_export (true  ?: 'second');                           # true
var_export (null  ?: 'second');                           # "second"
var_export (''    ?: 'second');                           # "second"
var_export ('some text'    ?? 'second');                  # "some text"
var_export (0     ?: 'second');                           # "second"
var_export ($undefinedVarible ?: 'second');               # "second" Notice: Undefined variable: ..
var_export ($array['undefined_index'] ?: 'second');       # "second" Notice: Undefined index: ..
var_export ($object->undefinedAttribute ?: 'second');     # "Notice: Undefined index: ..

Hi vọng điêu nay co ich

6 hữu ích 0 bình luận chia sẻ

answer

4

Null coalescing operator trong php

Cuộn xuống liên kết này và xem phần, nó cung cấp cho bạn một ví dụ so sánh như bên dưới:


Tuy nhiên, không nên xâu chuỗi các toán tử vì nó khiến việc đọc mã sau này trở nên khó hiểu hơn.

Toán tử liên kết null (??) đã được thêm vào dưới dạng đường cú pháp cho trường hợp phổ biến là cần sử dụng một số ba kết hợp với Isset (). Nó trả về toán hạng đầu tiên nếu nó tồn tại và không phải là NULL; nếu không nó trả về toán hạng thứ hai của nó.

Về cơ bản, sử dụng toán tử liên hợp sẽ làm cho nó tự động kiểm tra null không giống như toán tử bậc ba.

4 hữu ích 5 bình luận chia sẻ

answer

3

Null coalescing operator trong php

Các câu trả lời khác đi sâu và đưa ra những lời giải thích tuyệt vời. Đối với những người tìm kiếm câu trả lời nhanh,

$a ?: 'fallback'$a ? $a : 'fallback'

trong khi

$a ?? 'fallback'$a = isset($a) ? $a : 'fallback'


Sự khác biệt chính sẽ là khi toán tử bên trái là:

  • Một giá trị falsy đó không phải là null ( 0, '', false, [], ...)
  • Một biến không xác định

3 hữu ích 1 bình luận chia sẻ

answer

2

Null coalescing operator trong php

Có vẻ như có những ưu và khuyết điểm khi sử dụng ??hoặc ?:. Ưu điểm của việc sử dụng ?:là nó đánh giá false và null và "" giống nhau. Vấn đề là nó báo cáo một E_NOTICE nếu đối số trước đó là rỗng. Với ??người chuyên nghiệp là không có E_NOTICE, nhưng điều khó khăn là nó không đánh giá false và null như nhau. Theo kinh nghiệm của tôi, tôi đã thấy mọi người bắt đầu sử dụng null và false thay thế cho nhau nhưng sau đó họ cuối cùng sử dụng cách sửa đổi mã của họ để phù hợp với việc sử dụng null hoặc false, nhưng không phải cả hai. Một cách khác là tạo ra một tình trạng ternary phức tạp hơn: (isset($something) or !$something) ? $something : $something_else.

Sau đây là một ví dụ về sự khác biệt của việc sử dụng ??toán tử sử dụng cả null và false:

$false = null;
$var = $false ?? "true";
echo $var . "---
";//returns: true--- $false = false; $var = $false ?? "true"; echo $var . "---
"; //returns: ---

Tuy nhiên, bằng cách giải thích kỹ lưỡng toán tử bậc ba, chúng ta có thể làm cho một chuỗi sai hoặc chuỗi rỗng "" hoạt động như thể nó là một chuỗi rỗng mà không cần ném e_notice:

$false = null;
$var = (isset($false) or !$false) ? $false : "true";
echo $var . "---
";//returns: --- $false = false; $var = (isset($false) or !$false) ? $false : "true"; echo $var . "---
";//returns: --- $false = ""; $var = (isset($false) or !$false) ? $false : "true"; echo $var . "---
";//returns: --- $false = true; $var = (isset($false) or !$false) ? $false : "true"; echo $var . "---
";//returns: 1---

Cá nhân tôi nghĩ sẽ thực sự tuyệt vời nếu một phiên bản PHP trong tương lai bao gồm một toán tử mới khác: :?thay thế cú pháp trên. tức là: // $var = $false :? "true";Cú pháp đó sẽ đánh giá null, false và "" như nhau và không ném ra một E_NOTICE ...

2 hữu ích 2 bình luận chia sẻ

answer

1

Null coalescing operator trong php

class a
{
    public $a = 'aaa';
}

$a = new a();

echo $a->a;  // Writes 'aaa'
echo $a->b;  // Notice: Undefined property: a::$b

echo $a->a ?? '$a->a does not exists';  // Writes 'aaa'

// Does not throw an error although $a->b does not exist.
echo $a->b ?? '$a->b does not exist.';  // Writes $a->b does not exist.

// Does not throw an error although $a->b and also $a->b->c does not exist.
echo $a->b->c ?? '$a->b->c does not exist.';  // Writes $a->b->c does not exist.

1 hữu ích 0 bình luận chia sẻ

answer

0

Null coalescing operator trong php

Null Coalescing operatorchỉ thực hiện hai nhiệm vụ: nó kiểm tra whether the variable is setwhether it is null. Hãy xem ví dụ sau:

Ví dụ mã ở trên nói rằng Null Coalescing operatorxử lý một biến không tồn tại và một biến được đặt thành NULLtheo cùng một cách.

Null Coalescing operatorlà một cải tiến so với ternary operator. Hãy xem đoạn mã sau so sánh hai đoạn mã:

Vì vậy, sự khác biệt giữa hai là Null Coalescing operatortoán tử được thiết kế để xử lý các biến không xác định tốt hơn ternary operator. Trong khi, the ternary operatorlà viết tắt của if-else.

Null Coalescing operatorkhông có nghĩa là để thay thế ternary operator, nhưng trong một số trường hợp sử dụng như trong ví dụ trên, nó cho phép bạn viết mã sạch với ít rắc rối hơn.

Tín dụng: http://dwellupper.io/post/6/php7-null-coalescing-operator-usage-and-examples

0 hữu ích 1 bình luận chia sẻ

answer

0

Null coalescing operator trong php

Khi sử dụng các superglobals như $ _GET hoặc $ _REQUEST, bạn nên biết rằng chúng có thể là một chuỗi rỗng. Trong trường hợp cụ thể này, ví dụ này

$username = $_GET['user'] ?? 'nobody';

sẽ không thành công vì giá trị của $ username bây giờ là một chuỗi trống.

Vì vậy, khi sử dụng $ _GET hoặc thậm chí $ _REQUEST, bạn nên sử dụng toán tử bậc ba thay thế như sau:

$username = (!empty($_GET['user'])?$_GET['user']:'nobody';

Bây giờ giá trị của tên người dùng $ là 'không ai cả' như mong đợi.

0 hữu ích 1 bình luận chia sẻ