Php kiểm tra xem stdclass có trống không

Một nguồn gây nhầm lẫn phổ biến với máy khách xoay quanh các mảng và đối tượng JSON và cách chỉ định chúng trong PHP. Đặc biệt, các vấn đề được gây ra bởi các đối tượng trống và mảng các đối tượng. Trang này hiển thị cho bạn một số mẫu phổ biến được sử dụng trong API JSON của Elaticsearch và cách chuyển đổi mẫu đó thành biểu diễn PHP

Đối tượng trốngSửa đổi

API Elaticsearch sử dụng các đối tượng JSON trống ở một số vị trí có thể gây ra sự cố cho PHP. Không giống như các ngôn ngữ khác, PHP không có ký hiệu "viết tắt" cho các đối tượng trống và nhiều nhà phát triển không biết cách chỉ định một đối tượng trống

Cân nhắc thêm điểm nổi bật vào truy vấn

{
    "query" : {
        "match" : {
            "content" : "quick brown fox"
        }
    },
    "highlight" : {
        "fields" : {
            "content" : {} 
        }
    }
}

Đối tượng JSON trống này là nguyên nhân gây ra sự cố

Vấn đề là PHP sẽ tự động chuyển đổi

$params['body'] = [
    'query' => [
        'match' => [
            'content' => 'quick brown fox'
        ]
    ],
    'sort' => [
        ['time' => ['order' => 'desc']],
        ['popularity' => ['order' => 'desc']]
    ]
];
$results = $client->search($params);
8 thành
$params['body'] = [
    'query' => [
        'match' => [
            'content' => 'quick brown fox'
        ]
    ],
    'sort' => [
        ['time' => ['order' => 'desc']],
        ['popularity' => ['order' => 'desc']]
    ]
];
$results = $client->search($params);
9, không còn hiệu lực Elaticsearch DSL. Chúng ta cần nói với PHP rằng đối tượng trống rõ ràng là một đối tượng, không phải là một mảng. Để xác định truy vấn này trong PHP, bạn sẽ làm

$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);

Chúng tôi sử dụng đối tượng stdClass PHP chung để đại diện cho một đối tượng trống. JSON hiện được mã hóa chính xác

Bằng cách sử dụng một đối tượng stdClass rõ ràng, chúng ta có thể buộc trình phân tích cú pháp

class Example {
  public string $name;
  public DateTime $birthday;
}
0 xuất chính xác một đối tượng trống, thay vì một mảng trống. Giải pháp dài dòng này là cách duy nhất để hoàn thành mục tiêu trong PHP…​ không có phiên bản "ngắn" của một đối tượng trống

Mảng đối tượngedit

Một mẫu phổ biến khác trong Elaticsearch DSL là một mảng các đối tượng. Ví dụ: hãy cân nhắc việc thêm một loại vào truy vấn của bạn

{
    "query" : {
        "match" : { "content" : "quick brown fox" }
    },
    "sort" : [  
        {"time" : {"order" : "desc"}},
        {"popularity" : {"order" : "desc"}}
    ]
}

"sắp xếp" chứa một mảng các đối tượng JSON

Sự sắp xếp này rất phổ biến, nhưng việc xây dựng trong PHP có thể phức tạp vì nó yêu cầu các mảng lồng nhau. Độ chi tiết của PHP có xu hướng che khuất những gì đang thực sự diễn ra. Để xây dựng một mảng các đối tượng, bạn thực sự cần một mảng các mảng

$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'sort' => array(    
        array('time' => array('order' => 'desc')),  
        array('popularity' => array('order' => 'desc')) 
    )
);
$results = $client->search($params);

Mảng này mã hóa mảng

$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
0

Mảng này mã hóa đối tượng

$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
1

Mảng này mã hóa đối tượng

$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
2

Nếu bạn đang sử dụng PHP 5. 4+, chúng tôi đặc biệt khuyến khích bạn sử dụng cú pháp mảng ngắn. Nó làm cho các mảng lồng nhau này dễ đọc hơn nhiều

$params['body'] = [
    'query' => [
        'match' => [
            'content' => 'quick brown fox'
        ]
    ],
    'sort' => [
        ['time' => ['order' => 'desc']],
        ['popularity' => ['order' => 'desc']]
    ]
];
$results = $client->search($params);

Mảng đối tượng rỗngSửa đổi

Đôi khi, bạn sẽ gặp DSL yêu cầu cả hai mẫu trước đó. Truy vấn điểm số của hàm là một ví dụ điển hình, đôi khi nó yêu cầu một mảng đối tượng và một số đối tượng đó có thể là đối tượng JSON trống

PHP7. 4 cuối cùng mang thuộc tính gõ. Đây là một tính năng mà tôi đã mong đợi và tôi đã dành thời gian chất lượng để làm việc với các dự án hiện tại của mình để thêm hỗ trợ cho các thuộc tính đã nhập

Với các thuộc tính đã nhập, bạn có thể đặt một loại cho tất cả các thuộc tính của lớp. Khi một loại được đặt, công cụ PHP sẽ ngăn mọi người đặt một loại khác cho thuộc tính lớp

________số 8

Đoạn mã trên sẽ đảm bảo rằng thuộc tính

class Example {
  public $name;
}

$foo = new Example();
var_dump($foo->name === null); // true
7 sẽ luôn là đối tượng
class Example {
  public $name;
}

$foo = new Example();
var_dump($foo->name === null); // true
8. Trước PHP 7. 4, loại mẫu dữ liệu nghiêm ngặt này sẽ yêu cầu phải có các phương thức
class Example {
  public $name;
}

$foo = new Example();
var_dump($foo->name === null); // true
9 và
$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
20 để thực thi tính toàn vẹn của dữ liệu

Các loại thuộc tính được hỗ trợ

Các loại được hỗ trợ cho thuộc tính lớp
  • các loại vô hướng.
    $params['body'] = array(
        'query' => array(
            'match' => array(
                'content' => 'quick brown fox'
            )
        ),
        'highlight' => array(
            'fields' => array(
                'content' => new \stdClass() 
            )
        )
    );
    $results = $client->search($params);
    21,
    $params['body'] = array(
        'query' => array(
            'match' => array(
                'content' => 'quick brown fox'
            )
        ),
        'highlight' => array(
            'fields' => array(
                'content' => new \stdClass() 
            )
        )
    );
    $results = $client->search($params);
    22,
    $params['body'] = array(
        'query' => array(
            'match' => array(
                'content' => 'quick brown fox'
            )
        ),
        'highlight' => array(
            'fields' => array(
                'content' => new \stdClass() 
            )
        )
    );
    $results = $client->search($params);
    23 và
    $params['body'] = array(
        'query' => array(
            'match' => array(
                'content' => 'quick brown fox'
            )
        ),
        'highlight' => array(
            'fields' => array(
                'content' => new \stdClass() 
            )
        )
    );
    $results = $client->search($params);
    24
  • các loại hợp chất.
    $params['body'] = array(
        'query' => array(
            'match' => array(
                'content' => 'quick brown fox'
            )
        ),
        'highlight' => array(
            'fields' => array(
                'content' => new \stdClass() 
            )
        )
    );
    $results = $client->search($params);
    25,
    $params['body'] = array(
        'query' => array(
            'match' => array(
                'content' => 'quick brown fox'
            )
        ),
        'highlight' => array(
            'fields' => array(
                'content' => new \stdClass() 
            )
        )
    );
    $results = $client->search($params);
    26 và
    $params['body'] = array(
        'query' => array(
            'match' => array(
                'content' => 'quick brown fox'
            )
        ),
        'highlight' => array(
            'fields' => array(
                'content' => new \stdClass() 
            )
        )
    );
    $results = $client->search($params);
    27
  • Bất kỳ tên lớp hoặc giao diện nào (chẳng hạn như
    class Example {
      public $name;
    }
    
    $foo = new Example();
    var_dump($foo->name === null); // true
    8,
    $params['body'] = array(
        'query' => array(
            'match' => array(
                'content' => 'quick brown fox'
            )
        ),
        'highlight' => array(
            'fields' => array(
                'content' => new \stdClass() 
            )
        )
    );
    $results = $client->search($params);
    29) và
    {
        "query" : {
            "match" : { "content" : "quick brown fox" }
        },
        "sort" : [  
            {"time" : {"order" : "desc"}},
            {"popularity" : {"order" : "desc"}}
        ]
    }
    20
  • Tham chiếu đến các đối tượng cha mẹ và sở hữu.
    {
        "query" : {
            "match" : { "content" : "quick brown fox" }
        },
        "sort" : [  
            {"time" : {"order" : "desc"}},
            {"popularity" : {"order" : "desc"}}
        ]
    }
    21 và
    {
        "query" : {
            "match" : { "content" : "quick brown fox" }
        },
        "sort" : [  
            {"time" : {"order" : "desc"}},
            {"popularity" : {"order" : "desc"}}
        ]
    }
    22
Các loại không được hỗ trợ cho thuộc tính lớp
  • {
        "query" : {
            "match" : { "content" : "quick brown fox" }
        },
        "sort" : [  
            {"time" : {"order" : "desc"}},
            {"popularity" : {"order" : "desc"}}
        ]
    }
    23. Có một tài sản
    {
        "query" : {
            "match" : { "content" : "quick brown fox" }
        },
        "sort" : [  
            {"time" : {"order" : "desc"}},
            {"popularity" : {"order" : "desc"}}
        ]
    }
    23 sẽ không có ý nghĩa
  • {
        "query" : {
            "match" : { "content" : "quick brown fox" }
        },
        "sort" : [  
            {"time" : {"order" : "desc"}},
            {"popularity" : {"order" : "desc"}}
        ]
    }
    25. Không được hỗ trợ vì hành vi của nó là không thể đoán trước. Hãy xem RFC có thể gọi nhất quán để biết thêm thông tin cơ bản. Về cơ bản, điều này trở nên rắc rối khi các cuộc gọi có thể được khai báo bằng cú pháp mảng, e. g. như
    {
        "query" : {
            "match" : { "content" : "quick brown fox" }
        },
        "sort" : [  
            {"time" : {"order" : "desc"}},
            {"popularity" : {"order" : "desc"}}
        ]
    }
    26

Đây sẽ là nơi hầu hết các hành vi giật tóc có thể xảy ra. Với PHP7. 4 thuộc tính đã nhập, thuộc tính lớp có trạng thái chưa được khởi tạo. Điều này đơn giản có nghĩa là thuộc tính chưa được khởi tạo. Điều này không giống với

{
    "query" : {
        "match" : { "content" : "quick brown fox" }
    },
    "sort" : [  
        {"time" : {"order" : "desc"}},
        {"popularity" : {"order" : "desc"}}
    ]
}
28

Nếu không có loại nào được khai báo, các thuộc tính có giá trị chưa được khởi tạo là

{
    "query" : {
        "match" : { "content" : "quick brown fox" }
    },
    "sort" : [  
        {"time" : {"order" : "desc"}},
        {"popularity" : {"order" : "desc"}}
    ]
}
28

class Example {
  public $name;
}

$foo = new Example();
var_dump($foo->name === null); // true

Khi một loại được khai báo, tất cả các thuộc tính sẽ có trạng thái chưa được khởi tạo. Không được phép truy cập các thuộc tính của lớp trước khi gán giá trị rõ ràng

$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
2

Trong đoạn trích này, thuộc tính

$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'sort' => array(    
        array('time' => array('order' => 'desc')),  
        array('popularity' => array('order' => 'desc')) 
    )
);
$results = $client->search($params);
30 chưa được khởi tạo. Điều này không giống với
{
    "query" : {
        "match" : { "content" : "quick brown fox" }
    },
    "sort" : [  
        {"time" : {"order" : "desc"}},
        {"popularity" : {"order" : "desc"}}
    ]
}
28 và đoạn mã trên sẽ báo lỗi

{
    "query" : {
        "match" : { "content" : "quick brown fox" }
    },
    "sort" : [  
        {"time" : {"order" : "desc"}},
        {"popularity" : {"order" : "desc"}}
    ]
}
2

Kiểm tra trạng thái chưa khởi tạo

Bạn có thể kiểm tra xem thuộc tính lớp có chưa được khởi tạo hay không bằng cách sử dụng

$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'sort' => array(    
        array('time' => array('order' => 'desc')),  
        array('popularity' => array('order' => 'desc')) 
    )
);
$results = $client->search($params);
32. Vì giá trị này không giống với
{
    "query" : {
        "match" : { "content" : "quick brown fox" }
    },
    "sort" : [  
        {"time" : {"order" : "desc"}},
        {"popularity" : {"order" : "desc"}}
    ]
}
28 nên bạn không thể sử dụng
$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'sort' => array(    
        array('time' => array('order' => 'desc')),  
        array('popularity' => array('order' => 'desc')) 
    )
);
$results = $client->search($params);
34 để kiểm tra xem thuộc tính có chưa được khởi tạo hay không

Đặt lại thuộc tính về trạng thái chưa khởi tạo

Để đặt lại một thuộc tính về trạng thái chưa khởi tạo, hãy sử dụng

$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'sort' => array(    
        array('time' => array('order' => 'desc')),  
        array('popularity' => array('order' => 'desc')) 
    )
);
$results = $client->search($params);
35. Sau khi không được đặt, cố gắng truy cập vào thuộc tính mà không gán giá trị cho thuộc tính đó sẽ gây ra lỗi
$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'sort' => array(    
        array('time' => array('order' => 'desc')),  
        array('popularity' => array('order' => 'desc')) 
    )
);
$results = $client->search($params);
36 tương tự

loại nullable

Tương tự với PHP7. 1 loại có thể vô giá trị, các loại thuộc tính cũng có thể được đánh dấu là có thể vô giá trị. Để đánh dấu một thuộc tính có thể là null, hãy đặt trước loại của nó một dấu chấm hỏi, e. g.

$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'sort' => array(    
        array('time' => array('order' => 'desc')),  
        array('popularity' => array('order' => 'desc')) 
    )
);
$results = $client->search($params);
37

$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'sort' => array(    
        array('time' => array('order' => 'desc')),  
        array('popularity' => array('order' => 'desc')) 
    )
);
$results = $client->search($params);
3

Ngay cả khi một thuộc tính được đánh dấu là nullable, thì giá trị chưa được khởi tạo của nó sẽ không phải là

{
    "query" : {
        "match" : { "content" : "quick brown fox" }
    },
    "sort" : [  
        {"time" : {"order" : "desc"}},
        {"popularity" : {"order" : "desc"}}
    ]
}
28. Ví dụ: đoạn mã bên dưới vẫn sẽ báo lỗi

$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
4

Mặc dù điều này có vẻ rườm rà khi làm việc, nhưng điều này cung cấp một tính năng tuyệt vời mà bạn có thể chắc chắn rằng thuộc tính lớp sẽ luôn thuộc loại đó. Nếu giá trị không được khởi tạo, PHP sẽ từ bỏ và đưa ra một lỗi thay vì trả về

{
    "query" : {
        "match" : { "content" : "quick brown fox" }
    },
    "sort" : [  
        {"time" : {"order" : "desc"}},
        {"popularity" : {"order" : "desc"}}
    ]
}
28, giống như đối với các thuộc tính chưa được nhập

loại nghiêm ngặt

Các thuộc tính của lớp cũng hỗ trợ khai báo kiểu nghiêm ngặt với

$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
40 ở đầu khối PHP của tệp. Nếu không có các loại nghiêm ngặt, PHP sẽ chuyển các giá trị thành loại thuộc tính

$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
7

Lưu ý cách chúng tôi đặt

$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
41 cho thuộc tính
$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
22 và cuộc gọi
$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
43 trả về
$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
44 dưới dạng
$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
22. Khi gán giá trị, công cụ sẽ truyền giá trị cho loại đã khai báo

Để giảm thiểu các vấn đề với việc tung hứng kiểu và tận dụng tối đa các thuộc tính được nhập, tôi khuyên bạn nên kiểm tra các lớp của mình với

$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
40. Rất dễ bỏ qua khi PHP hữu ích khi nó chuyển sang một loại cho bạn, nhưng đây có thể là gốc rễ của một số lỗi ở hạ lưu. Dễ dàng gỡ lỗi một lỗi xuất hiện ngay lập tức hơn là một lỗi chỉ xảy ra vào tối thứ Sáu lúc 6 giờ. 28PM, chỉ khi DST có hiệu lực

Thuộc tính tĩnh và tham chiếu

Thuộc tính tĩnh cũng có thể có các loại được khai báo. Điều này có vẻ như là một chi tiết rõ ràng, nhưng các đề xuất trước đây cho các thuộc tính đã nhập không bao gồm các thuộc tính tĩnh. Trong PHP7. 4, bạn cũng có thể khai báo các kiểu cho thuộc tính tĩnh

Hơn nữa, bạn có thể trả lại một tham chiếu đến một thuộc tính đã nhập và các loại sẽ vẫn được vinh danh

$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
4

Điều này sẽ ném một lỗi

$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
5

Giá trị mặc định trong hàm tạo và khai báo thuộc tính

Vì lý do lịch sử, PHP cho phép bạn đặt giá trị mặc định cho các đối số hàm trong phần khai báo của nó ngay cả khi loại không thể rỗng

$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
6

Trong hàm tạo, chúng tôi đánh dấu rõ ràng rằng đối số

$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'sort' => array(    
        array('time' => array('order' => 'desc')),  
        array('popularity' => array('order' => 'desc')) 
    )
);
$results = $client->search($params);
30 không thể rỗng và PHP chấp nhận
{
    "query" : {
        "match" : { "content" : "quick brown fox" }
    },
    "sort" : [  
        {"time" : {"order" : "desc"}},
        {"popularity" : {"order" : "desc"}}
    ]
}
28 làm giá trị mặc định. Hành vi này chỉ áp dụng cho giá trị mặc định của
{
    "query" : {
        "match" : { "content" : "quick brown fox" }
    },
    "sort" : [  
        {"time" : {"order" : "desc"}},
        {"popularity" : {"order" : "desc"}}
    ]
}
28. Mặc dù điều này không hợp lệ về mặt ngữ nghĩa, hành vi này được cho phép vì lý do lịch sử và triển khai

Với các thuộc tính đã nhập, điều này không được phép

class Example {
  public $name;
}

$foo = new Example();
var_dump($foo->name === null); // true
0

Điều này sẽ nhanh chóng đưa ra một lỗi

class Example {
  public $name;
}

$foo = new Example();
var_dump($foo->name === null); // true
1

Loại phương sai

PHP7. 4 đi kèm với phương sai kiểu trả về, có nghĩa là một lớp con có thể trả về một thể hiện cụ thể hơn. Điều này chưa được hỗ trợ cho các loại tài sản. Ví dụ

class Example {
  public $name;
}

$foo = new Example();
var_dump($foo->name === null); // true
2

Mã ở trên sẽ không hoạt động. Mặc dù

$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
70 là tập con của lớp
$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
71 nhưng không được phép thay đổi khai báo kiểu của
$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
72. Bạn vẫn có thể chỉ định một thể hiện của
$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
71 cho
$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
72. Cái này được gọi là
$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
75 và hiện được hỗ trợ cho các loại trả về.
Thử cách trên sẽ báo lỗi như sau.

class Example {
  public $name;
}

$foo = new Example();
var_dump($foo->name === null); // true
3

Đoạn mã sau vẫn còn hiệu lực

class Example {
  public $name;
}

$foo = new Example();
var_dump($foo->name === null); // true
4

Lưu ý cách khai báo thuộc tính trong

$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
76 và
$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
72 là
$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
71, nhưng chúng ta gán một thể hiện
$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() 
        )
    )
);
$results = $client->search($params);
70 cho nó

Để tóm tắt

  • Bạn không thể thay thế một lớp con cho tài sản
  • Bạn không thể thêm các loại vào các lớp con nếu lớp cha không có các loại được thực thi
  • Bạn không thể đánh dấu một loại không nullable là nullable trong một lớp con
  • Bạn không thể đánh dấu một loại nullable là không nullable trong một lớp con

Để hình dung điều này, hãy xem chuỗi thừa kế sau. Không ai trong số những điều sau đây được phép

class Example {
  public $name;
}

$foo = new Example();
var_dump($foo->name === null); // true
5

Ở trên sẽ đưa ra các lỗi sau (không đồng thời)

class Example {
  public $name;
}

$foo = new Example();
var_dump($foo->name === null); // true
6

Tương thích ngược

Khai báo các loại thuộc tính là tùy chọn và tất cả mã hiện tại của bạn sẽ hoạt động. Nếu bạn định nâng cấp một cơ sở mã hiện có thành các thuộc tính đã nhập, hãy để ý đến trạng thái chưa được khởi tạo và kế thừa nơi các quy tắc được thực thi khá nghiêm ngặt. Hơn nữa, các loại thuộc tính không mang hành vi kế thừa là cho phép các giá trị

{
    "query" : {
        "match" : { "content" : "quick brown fox" }
    },
    "sort" : [  
        {"time" : {"order" : "desc"}},
        {"popularity" : {"order" : "desc"}}
    ]
}
28 trong các đối số hàm/phương thức của chúng và điều này có thể gây bất ngờ

Suy nghĩ cuối cùng

Các loại thuộc tính là một tính năng mà cá nhân tôi rất hào hứng và bây giờ nó đã có ở đây, tôi đã dành thời gian để thêm các loại thuộc tính vào các dự án riêng tư hiện tại của mình. PHPStorm 2019. 3 đi kèm với sự hỗ trợ cho tất cả PHP 7. 4 và có một cách khắc phục nhanh để thêm các loại thuộc tính nếu nó có thể được thu thập từ các nhận xét về docblock thuộc tính hoặc từ hàm tạo.
Ngay cả trong các dự án có phạm vi kiểm tra 100%, tôi vẫn phát hiện ra một vài lỗi luôn ở đó, nhưng các loại thuộc tính đưa chúng lên hàng đầu.

Các dự án mã nguồn mở có thể mất chút thời gian để yêu cầu PHP 7. 4 là phiên bản tối thiểu, nhưng điều đó sẽ không ngăn bạn sử dụng chúng trong các dự án riêng tư của mình

Làm cách nào để kiểm tra xem một đối tượng stdClass có trống trong PHP không?

Kiểm tra xem có phải đếm( (array)$yourObject) ) == 0 .

Làm cách nào để kiểm tra xem trường biểu mẫu có trống bằng PHP không?

Hàm PHP empty() . Hàm này trả về false nếu biến tồn tại và không rỗng, ngược lại trả về true. Các giá trị sau ước tính trống. 0.

Làm cách nào để kiểm tra xem đối tượng JSON có trống trong PHP không?

$configuration = json_decode(shop()->setting->whatsapp_configuration, true)->send_message_via; Bây giờ, nếu nó trống như thế này [] , thì tôi nhận được . Nếu không thì hoạt động tốt.

Làm cách nào để kiểm tra xem một mảng có trống trong PHP không?

Sử dụng chức năng đếm. Hàm này đếm tất cả các phần tử trong một mảng. Nếu số phần tử trong mảng bằng 0, thì nó sẽ hiển thị mảng trống. .
Sử dụng hàm sizeof(). Phương pháp này kiểm tra kích thước của mảng. Nếu kích thước của mảng bằng 0 thì mảng trống nếu không thì mảng không trống