So sánh tốc ký trong PHP – Stitcher.io

  • Post category:lập trình


Có thể bạn đã biết một số toán tử so sánh trong PHP. Những thứ như chim nhạn ?:sự kết hợp vô giá trị ?? và tàu vũ trụ operators.
But do you really know how they work?
Understanding these operators makes you use them more, resulting in a cleaner codebase.

Before looking at each operator in depth, here’s a summary of what each of them does:

# Ternary operator

The ternary operator is a shorthand for the if {} else {} kết cấu. Thay vì viết điều này:

if ($condition) {
    $result = 'foo' 
} else {
    $result = 'bar'
}

Bạn có thể viết điều này:

$result = $condition ? 'foo' : 'bar';

Nếu điều này $condition đánh giá để truetoán hạng bên trái sẽ được gán cho $result. Nếu điều kiện đánh giá là falsetay phải sẽ được sử dụng.

Sự thật thú vị: cái tên toán tử bậc ba thực sự có nghĩa là “một toán tử hoạt động trên ba toán hạng”. MỘT toán hạng là thuật ngữ dùng để biểu thị các phần cần thiết của một biểu thức. Toán tử ba ngôi là toán tử duy nhất trong PHP yêu cầu ba toán hạng: điều kiện, truefalse kết quả. Tương tự, cũng có các toán tử nhị phân và đơn nguyên. Bạn có thể đọc thêm về nó ở đây.

Quay lại toán tử ba ngôi: bạn có biết biểu thức nào đánh giá true, và cái nào không? Hãy nhìn vào boolean cột của bảng này.

Toán tử bậc ba sẽ sử dụng toán hạng bên trái của nó khi điều kiện ước lượng là true. Đây có thể là một chuỗi, một số nguyên, một boolean, v.v. Toán hạng bên phải sẽ được sử dụng cho cái gọi là “giá trị sai”.

Ví dụ sẽ là 0 hoặc '0'một mảng hoặc chuỗi trống, nullmột biến không xác định hoặc chưa được gán, và tất nhiên false chính nó. Tất cả những giá trị này sẽ làm cho toán tử bậc ba sử dụng toán hạng bên phải của nó.

Nhận thấy một tpyo? Bạn có thể gửi PR để sửa nó. Nếu bạn muốn cập nhật về những gì đang diễn ra trên blog này, bạn có thể Theo dõi danh sách gửi thư của tôi: gửi email đến [email protected] và tôi sẽ thêm bạn vào danh sách.

# Toán tử bậc ba viết tắt

Kể từ PHP 5.3, có thể loại bỏ toán hạng bên trái, cho phép các biểu thức thậm chí còn ngắn hơn:

$result = $initial ?: 'default';

Trong trường hợp này, giá trị của $result sẽ là giá trị của $initialTrừ khi $initial đánh giá để falsetrong trường hợp đó chuỗi 'default' Được sử dụng.

Bạn có thể viết biểu thức này theo cách tương tự bằng cách sử dụng toán tử ba ngôi thông thường:

$result = $condition ? $condition : 'default';

Trớ trêu thay, bằng cách loại bỏ toán hạng thứ hai của toán tử bậc ba, nó thực sự trở thành một toán tử nhị phân.

# Xâu chuỗi các toán tử bậc ba

Những điều sau đây, mặc dù có vẻ hợp lý; không hoạt động trong PHP:

$result = $firstCondition
    ? 'truth'
    : $elseCondition
        ? 'elseTrue'
        : 'elseFalse';

Lý do là vì toán tử ba ngôi trong PHP có tính kết hợp trái và do đó được phân tích cú pháp theo một cách rất lạ. Ví dụ trên sẽ luôn đánh giá $elseCondition phần đầu tiên, vì vậy ngay cả khi $firstCondition sẽ là truebạn sẽ không bao giờ thấy đầu ra của nó.

Tôi tin rằng điều đúng đắn cần làm là tránh hoàn toàn các toán tử ternary lồng nhau. Bạn có thể đọc thêm về hành vi kỳ lạ này trong câu trả lời về Stack Overflow này.

Hơn nữa, giống như PHP 7.4, việc sử dụng các chuỗi ternary không có dấu ngoặc không được chấp nhận.

# Toán tử hợp nhất Null

Bạn đã xem bảng so sánh các loại trước đó chưa? Toán tử hợp nhất null có sẵn kể từ PHP 7.0. Nó tương tự như toán tử bậc ba, nhưng sẽ hoạt động như isset trên toán hạng bên trái thay vì chỉ sử dụng giá trị boolean của nó. Điều này làm cho toán tử này đặc biệt hữu ích đối với mảng và gán giá trị mặc định khi một biến không được đặt.

$undefined ?? 'fallback'; 

$unassigned;
$unassigned ?? 'fallback'; 

$assigned = 'foo';
$assigned ?? 'fallback'; 

'' ?? 'fallback'; 
'foo' ?? 'fallback'; 
'0' ?? 'fallback'; 
0 ?? 'fallback'; 
false ?? 'fallback'; 

Toán tử hợp nhất null có hai toán hạng, làm cho nó trở thành một nhị phân nhà điều hành. Nhân tiện, “kết hợp” có nghĩa là “kết hợp với nhau để tạo thành một khối hoặc toàn bộ”. Nó sẽ lấy hai toán hạng và quyết định sử dụng toán hạng nào dựa trên giá trị của toán hạng bên trái.

# Kết hợp null trên mảng

Toán tử này đặc biệt hữu ích khi kết hợp với mảng, vì nó có tác dụng như isset. Điều này có nghĩa là bạn có thể nhanh chóng kiểm tra sự tồn tại của các khóa, thậm chí cả các khóa lồng nhau mà không cần viết các biểu thức dài dòng.

$input = (
    'key' => 'key',
    'nested' => (
        'key' => true
    )
);

$input('key') ?? 'fallback'; 
$input('nested')('key') ?? 'fallback'; 
$input('undefined') ?? 'fallback'; 
$input('nested')('undefined') ?? 'fallback'; 

null ?? 'fallback'; 

Ví dụ đầu tiên cũng có thể được viết bằng toán tử bậc ba:

$output = isset($input('key')) ? $input('key') : 'fallback';

Lưu ý rằng không thể sử dụng toán tử ternary tốc ký khi kiểm tra sự tồn tại của các khóa mảng. Nó sẽ gây ra lỗi hoặc trả về một boolean, thay vì giá trị của toán hạng bên trái thực.


$output = isset($input('key')) ?: 'fallback' 






$output = $input('key') ?: 'fallback';

# Chuỗi liên kết Null

Toán tử hợp nhất null có thể dễ dàng bị xâu chuỗi:

$input = (
    'key' => 'key',
);

$input('undefined') ?? $input('key') ?? 'fallback'; 

# Sự kết hợp lồng nhau

Có thể sử dụng toán tử hợp nhất null trên các thuộc tính đối tượng lồng nhau, ngay cả khi một thuộc tính trong chuỗi null.

$a = (object) (
    'prop' => null,
);

var_dump($a->prop->b ?? 'empty');

# Toán tử gán hợp nhất Null

Trong PHP 7.4, chúng ta có thể mong đợi một cú pháp thậm chí còn ngắn hơn được gọi là “toán tử gán kết hợp null”.



function (array $parameters = ()) {
    $parameters('property') ??= 'default';
}

Trong ví dụ này, $parameters('property') sẽ được đặt thành 'default', trừ khi nó được đặt trong mảng được truyền cho hàm. Điều này sẽ tương đương như sau, sử dụng toán tử hợp nhất null hiện tại:

function (array $parameters = ()) {
    $parameters('property') = $parameters('property') ?? 'default';
}

#Người điều hành tàu vũ trụ

Người điều khiển tàu vũ trụ, mặc dù có một cái tên khá đặc biệt, nhưng có thể rất hữu ích. Đó là một toán tử được sử dụng để so sánh. Nó sẽ luôn trả về một trong ba giá trị: 0, -1 hoặc 1.

0 sẽ được trả về khi cả hai toán hạng đều bằng nhau,
1 khi toán hạng bên trái lớn hơn và -1 khi toán hạng bên phải lớn hơn. Chúng ta hãy xem một ví dụ đơn giản:

1 <=> 2; 

Ví dụ đơn giản này không phải là tất cả, phải không? Tuy nhiên, người điều hành tàu vũ trụ có thể so sánh nhiều hơn những giá trị đơn giản!


'a' <=> 'z'; 


(2, 1) <=> (2, 1); 


((1, 2), (2, 2)) <=> ((1, 2), (1, 2)); 


'Z' <=> 'z'; 

Điều kỳ lạ là khi so sánh cách viết hoa chữ, chữ viết thường được coi là cao nhất. Tuy nhiên, có một lời giải thích đơn giản. So sánh chuỗi được thực hiện bằng cách so sánh ký tự trên mỗi ký tự. Ngay khi một ký tự khác nhau, giá trị ASCII của chúng sẽ được so sánh. Vì các chữ cái viết thường đứng sau các chữ cái viết hoa trong bảng ASCII nên chúng có giá trị cao hơn.

#So sánh các đối tượng

Người điều khiển tàu vũ trụ gần như có thể so sánh mọi thứ, thậm chí cả đồ vật. Cách các đối tượng được so sánh dựa trên loại đối tượng. Các lớp PHP tích hợp có thể xác định sự so sánh của riêng chúng, trong khi các đối tượng vùng người dùng được so sánh dựa trên các thuộc tính và giá trị của chúng.

Khi nào bạn muốn so sánh các đối tượng bạn yêu cầu? Chà, thực ra có một ví dụ rất rõ ràng: ngày tháng.

$dateA = DateTime::createFromFormat('Y-m-d', '2000-02-01');

$dateB = DateTime::createFromFormat('Y-m-d', '2000-01-01');

$dateA <=> $dateB; 

Tất nhiên, so sánh ngày tháng chỉ là một ví dụ nhưng vẫn là một ví dụ rất hữu ích.

# Sắp xếp hàm

Một công dụng tuyệt vời của toán tử này là sắp xếp các mảng. Có khá nhiều cách để sắp xếp một mảng trong PHP và một số phương thức này cho phép hàm sắp xếp do người dùng xác định. Hàm này phải so sánh hai phần tử và trả về 1, 0hoặc -1 dựa trên vị trí của họ.

Một trường hợp sử dụng tuyệt vời cho người điều khiển tàu vũ trụ!

$array = (5, 1, 6, 3);

usort($array, function ($a, $b) {
    return $a <=> $b;
});

Để sắp xếp giảm dần, bạn chỉ cần đảo ngược kết quả so sánh:

usort($array, function ($a, $b) {
    return -($a <=> $b);
});

Xin chào, cảm ơn vì đã đọc! Tôi hy vọng bài đăng trên blog này đã giúp bạn! Nếu bạn muốn liên hệ với tôi, bạn có thể làm như vậy Twitter hoặc qua e-mail. Tôi luôn thích trò chuyện!



Trả lời