Có lý do nào để sử dụng strcmp() để so sánh chuỗi php không?

PHP là một ngôn ngữ được gõ động, giống như Ruby, Python hoặc JavaScript. Điều đó có nghĩa là một biến có thể chứa một giá trị thuộc bất kỳ kiểu nào. Loại biến không được biết cho đến khi chương trình thực sự thực thi

Cách tiếp cận thay thế cho đó là các ngôn ngữ được nhập tĩnh trong đó loại biến được xác định rõ ràng trong mã hoặc được trình biên dịch suy ra trước khi chương trình được thực thi. Bởi vì trong các ngôn ngữ được nhập tĩnh, loại của hầu hết các giá trị đã được biết, chúng có thể thực thi rằng chỉ các hoạt động tương thích mới được thực hiện trên các giá trị đó

Lấy chương trình Java này làm ví dụ

public class TypeDemo 
{
    public static void main (String[] args)
    {
        int i  = 42;
        String s = "derp";

        if (i < s) {
            System.out.println("42 is less than 'derp'.");
        }
    }
}

Phần quan trọng ở đây là

int i  = 42;
String s = "derp";

if (i < s) {
    System.out.println("42 is less than 'derp'.");
}

Trình biên dịch javac sẽ phàn nàn khi chúng tôi cố gắng biên dịch cái này vì nó đã biết rằng

int i  = 42;
String s = "derp";

if (i < s) {
    System.out.println("42 is less than 'derp'.");
}
0 sẽ là một số nguyên và
int i  = 42;
String s = "derp";

if (i < s) {
    System.out.println("42 is less than 'derp'.");
}
1 sẽ là một chuỗi

TypeDemo.java:8: error: bad operand types for binary operator '<'
        if (i < s) {
              ^
  first type:  int
  second type: String
1 error

So sánh một số nguyên với một chuỗi không có ý nghĩa trong Java. Có những lập luận khá mạnh mẽ rằng nó không có ý nghĩa ở bất cứ đâu

Ngay cả một số ngôn ngữ động cũng từ chối thực thi mã như thế này. Đây là ví dụ tương tự trong Ruby

i = 42;
s = "derp";

if i < s
  puts "42 is less than 'derp'"
end

Việc thực hiện điều này dẫn đến một ngoại lệ vì ngay khi Ruby gặp toán tử so sánh và nhận ra rằng các kiểu không khớp, nó sẽ coi đó là một vấn đề

typedemo.rb:4:in `<': comparison of Fixnum with String failed (ArgumentError)
    from typedemo.rb:4:in `'

Hãy làm tương tự trong PHP

$i = 42;
$s = 'derp';

if ($i < $s) {
    echo "42 is less than 'derp'";
}

Khi chúng tôi thực hiện chương trình này, không có đầu ra nào được in. Nhưng tại sao?

PHP không phàn nàn về việc so sánh hai loại không tương thích. Nó đã làm gì đó với giá trị

int i  = 42;
String s = "derp";

if (i < s) {
    System.out.println("42 is less than 'derp'.");
}
2 trong
int i  = 42;
String s = "derp";

if (i < s) {
    System.out.println("42 is less than 'derp'.");
}
3. Khi một giá trị trong PHP được sử dụng trong ngữ cảnh mà nó thường không phù hợp, PHP sẽ cố gắng chuyển đổi giá trị đó thành một loại tương thích với thao tác đã thử. Trong trường hợp này, chúng tôi cố gắng so sánh một chuỗi với một số nguyên. PHP chuyển đổi cả hai giá trị thành số nguyên để có thể so sánh. Vì
int i  = 42;
String s = "derp";

if (i < s) {
    System.out.println("42 is less than 'derp'.");
}
2 không chứa chữ số nào có thể được phân tích cú pháp dưới dạng số, nên PHP chuyển đổi thành
int i  = 42;
String s = "derp";

if (i < s) {
    System.out.println("42 is less than 'derp'.");
}
5

Bây giờ, sự so sánh là

int i  = 42;
String s = "derp";

if (i < s) {
    System.out.println("42 is less than 'derp'.");
}
6 là
int i  = 42;
String s = "derp";

if (i < s) {
    System.out.println("42 is less than 'derp'.");
}
7. Đó là lý do tại sao dòng
int i  = 42;
String s = "derp";

if (i < s) {
    System.out.println("42 is less than 'derp'.");
}
8 không được thực thi

Hành vi này, được gọi là "tung hứng kiểu", "ép buộc kiểu" hoặc "đánh máy ngầm" là một trong những nguồn chính gây ra lỗi, lỗ hổng bảo mật và các vấn đề về khả năng bảo trì mã trong PHP. Nó thường là một ý tưởng tốt để tránh nó

Tránh tung hứng kiểu

Loại bình đẳng an toàn

Hầu hết các toán tử trong PHP có thể gây ra hiện tượng tung hứng kiểu. Ngoại lệ chính là

int i  = 42;
String s = "derp";

if (i < s) {
    System.out.println("42 is less than 'derp'.");
}
9, toán tử đẳng thức an toàn kiểu. Nó trả về
TypeDemo.java:8: error: bad operand types for binary operator '<'
        if (i < s) {
              ^
  first type:  int
  second type: String
1 error
0 nếu cả hai giá trị cùng loại và cùng giá trị và nó không cố chuyển đổi chúng thành bất kỳ thứ gì.
TypeDemo.java:8: error: bad operand types for binary operator '<'
        if (i < s) {
              ^
  first type:  int
  second type: String
1 error
1 chỉ kiểm tra các giá trị bằng nhau SAU KHI truyền kiểu ẩn

Khi kiểm tra hai giá trị phi đối tượng cho sự bằng nhau, luôn sử dụng ____1_______9

Nó không chỉ ngăn chặn hành vi khó dự đoán mà còn cho thấy rõ rằng bạn muốn kiểm tra sự bình đẳng thực sự trong mã của mình

Không có loại an toàn tương đương cho các toán tử so sánh khác, như

TypeDemo.java:8: error: bad operand types for binary operator '<'
        if (i < s) {
              ^
  first type:  int
  second type: String
1 error
3,
TypeDemo.java:8: error: bad operand types for binary operator '<'
        if (i < s) {
              ^
  first type:  int
  second type: String
1 error
4,
TypeDemo.java:8: error: bad operand types for binary operator '<'
        if (i < s) {
              ^
  first type:  int
  second type: String
1 error
5 và
TypeDemo.java:8: error: bad operand types for binary operator '<'
        if (i < s) {
              ^
  first type:  int
  second type: String
1 error
6. Chúng luôn gây ra kiểu truyền ngầm, đôi khi theo những cách không mong muốn. Ví dụ: có thể xảy ra trường hợp hai chuỗi được chuyển thành số nguyên hoặc số float khi so sánh với các toán tử này. Trong hầu hết các trường hợp, chỉ an toàn khi sử dụng chúng với số nguyên. Phao có vấn đề đối với các hoạt động so sánh do tính không chính xác vốn có của chúng

So sánh đối tượng

Đối với các đối tượng, các toán tử so sánh hoạt động khác nhau.

TypeDemo.java:8: error: bad operand types for binary operator '<'
        if (i < s) {
              ^
  first type:  int
  second type: String
1 error
1 sẽ trả về true, nếu cả hai giá trị là đối tượng của cùng một lớp và có cùng giá trị trong thuộc tính của chúng. Các thuộc tính được so sánh bằng cách sử dụng lại
TypeDemo.java:8: error: bad operand types for binary operator '<'
        if (i < s) {
              ^
  first type:  int
  second type: String
1 error
1

Đối với các đối tượng,

int i  = 42;
String s = "derp";

if (i < s) {
    System.out.println("42 is less than 'derp'.");
}
9 sẽ chỉ trả về
TypeDemo.java:8: error: bad operand types for binary operator '<'
        if (i < s) {
              ^
  first type:  int
  second type: String
1 error
0, nếu cả hai giá trị đều là cùng một đối tượng

str = $str;
    }
}

$a = new Foo("42");
$b = new Foo(42);
$c = $a;

var_dump($a === $b); //prints "false", $a and $b contain different objects
var_dump($a == $b);  //prints "true", $a and $b are of the same class and have equal properties
var_dump($a === $c);  //prints "true", $a and $c contain the exact same object

Các toán tử so sánh không bằng nhau,

TypeDemo.java:8: error: bad operand types for binary operator '<'
        if (i < s) {
              ^
  first type:  int
  second type: String
1 error
3,
TypeDemo.java:8: error: bad operand types for binary operator '<'
        if (i < s) {
              ^
  first type:  int
  second type: String
1 error
4,
TypeDemo.java:8: error: bad operand types for binary operator '<'
        if (i < s) {
              ^
  first type:  int
  second type: String
1 error
5 và
TypeDemo.java:8: error: bad operand types for binary operator '<'
        if (i < s) {
              ^
  first type:  int
  second type: String
1 error
6, là

So sánh chuỗi

Khi so sánh các chuỗi, có thể xảy ra trường hợp PHP chuyển đổi cả hai giá trị so sánh thành số nguyên hoặc số float. Để tránh điều đó, hãy sử dụng hàm

i = 42;
s = "derp";

if i < s
  puts "42 is less than 'derp'"
end
5

đánh máy rõ ràng

Một cách khác để cho phép PHP thực hiện đánh máy ngầm là tự mình làm điều đó một cách rõ ràng. Trong PHP, có một cú pháp đặc biệt để chuyển đổi các loại

i = 42;
s = "derp";

if i < s
  puts "42 is less than 'derp'"
end
6 vào chuỗi
i = 42;
s = "derp";

if i < s
  puts "42 is less than 'derp'"
end
7 trước khi so sánh nó với
int i  = 42;
String s = "derp";

if (i < s) {
    System.out.println("42 is less than 'derp'.");
}
2. Thay vì so sánh
i = 42;
s = "derp";

if i < s
  puts "42 is less than 'derp'"
end
9 với
int i  = 42;
String s = "derp";

if (i < s) {
    System.out.println("42 is less than 'derp'.");
}
5 như trước đây, bây giờ chúng ta so sánh hai chuỗi và dưới dạng so sánh chuỗi, kết quả thực sự có ý nghĩa.
typedemo.rb:4:in `<': comparison of Fixnum with String failed (ArgumentError)
    from typedemo.rb:4:in `'
1 đến trước
typedemo.rb:4:in `<': comparison of Fixnum with String failed (ArgumentError)
    from typedemo.rb:4:in `'
2. Vì vậy, nếu bạn đã sử dụng phép so sánh này để sắp xếp danh sách các chuỗi theo thứ tự chữ và số, thì kết quả bây giờ sẽ chính xác

hướng dẫn

  • đối với các giá trị nguyên thủy, sử dụng
    int i  = 42;
    String s = "derp";
    
    if (i < s) {
        System.out.println("42 is less than 'derp'.");
    }
    
    9 để kiểm tra sự bằng nhau và
    typedemo.rb:4:in `<': comparison of Fixnum with String failed (ArgumentError)
        from typedemo.rb:4:in `'
    
    4 cho sự bất bình đẳng
  • sử dụng các chức năng so sánh cụ thể như
    typedemo.rb:4:in `<': comparison of Fixnum with String failed (ArgumentError)
        from typedemo.rb:4:in `'
    
    5, nếu có thể
  • lưu ý truyền kiểu ẩn khi sử dụng bất kỳ toán tử so sánh nào khác
  • đối với các đối tượng,
    int i  = 42;
    String s = "derp";
    
    if (i < s) {
        System.out.println("42 is less than 'derp'.");
    }
    
    9 kiểm tra, nếu hai giá trị là cùng một đối tượng
    • các toán tử khác không hữu ích lắm trên các đối tượng
    • bạn nên triển khai các phương thức cụ thể để so sánh giữa các đối tượng
  • sử dụng truyền kiểu rõ ràng để làm rõ ý định của bạn trong mã của bạn, nếu nó không rõ ràng
  • tham khảo hướng dẫn thường xuyên

Đọc thêm

Đáng buồn thay, không có quy tắc chung, đơn giản nào để xử lý hành vi của các loại trong PHP. Có quá nhiều ngoại lệ và trường hợp bất ngờ. Đó là lý do tại sao điều quan trọng là phải nhận thức được vấn đề này và tham khảo hướng dẫn sử dụng khi nghi ngờ. Hướng dẫn sử dụng PHP có một chương khá chi tiết về sắp xếp kiểu, toán tử so sánh và các bảng mở rộng về cách các giá trị so sánh với nhau. Thật tốt khi nhớ nơi để tìm những thứ này

Tại sao nên sử dụng strcmp trong PHP?

So sánh hai chuỗi là một trong những thao tác chuỗi được sử dụng phổ biến nhất trong thực tiễn lập trình và phát triển web. strcmp() là một hàm có sẵn trong PHP và được sử dụng để so sánh hai chuỗi .

Cách tốt nhất để so sánh hai chuỗi trong PHP là gì?

Hàm PHP strcmp() . strcmp() là một hàm có sẵn trong PHP được sử dụng để so sánh hai chuỗi.

Làm cách nào để so sánh nếu hai chuỗi giống nhau trong PHP?

Trả lời. Sử dụng hàm strcmp() của PHP . Hàm này lấy hai chuỗi str1 và str2 làm tham số. Hàm strcmp() trả về < 0 nếu str1 nhỏ hơn str2 ; .

Cách tốt nhất để so sánh hai chuỗi là gì?

So sánh chuỗi bằng cách sử dụng Đối tượng. phương thức equals() trong Java để so sánh hai chuỗi hoặc được khởi tạo bằng một từ khóa mới hoặc trực tiếp sử dụng dấu ngoặc kép. Phương thức này kiểm tra xem cả hai đối tượng chuỗi có bằng nhau hay không và nếu có thì trả về true. Nó cũng sẽ trả về true nếu cả hai chuỗi đều rỗng.