Hướng dẫn php call method on null - phương thức gọi php trên null

Tôi có cái này:

$itemCode = $area->pickSpecificItemByType($type)->getItemCode();

Có thể là

$itemCode = (!is_null($area->pickSpecificItemByType($type))) ?
     $area->pickSpecificItemByType($type)->getItemCode() : '';
9 có thể trả lại null. Do đó, gọi
$item = $area->pickSpecificItemByType($type);
$itemCode = ($item) ? $item->getItemCode() : '';
0 sẽ là không thể.

Cách sạch nhất và/hoặc hiệu quả nhất để làm điều này là gì?

Có lựa chọn nào tốt hơn thế này không?

$itemCode = (!is_null($area->pickSpecificItemByType($type))) ?
     $area->pickSpecificItemByType($type)->getItemCode() : '';

Đã hỏi ngày 18 tháng 5 năm 2015 lúc 3:19May 18, 2015 at 3:19

Hướng dẫn php call method on null - phương thức gọi php trên null

2

Thay vì gọi pickspecitemByType () hai lần, bạn có thể làm:

$item = $area->pickSpecificItemByType($type);
$itemCode = ($item) ? $item->getItemCode() : '';

Mặc dù một biến khác được giới thiệu ($ item), bạn đạt được về khả năng đọc.

Đã trả lời ngày 18 tháng 5 năm 2015 lúc 3:27May 18, 2015 at 3:27

1

--- [ chỉnh sửa ] ---

Câu trả lời ban đầu dưới đây được viết cho PHP 5.*.

Đối với PHP hiện đại (7, 8), xin vui lòng xem toán tử khống không ?? và (trong php8) null-safe?-> toán tử

https://stackoverflow.com/a/63222028/773522

---[ nguyên bản ]---

$itemCode = @$area->pickSpecificItemByType($type)->getItemCode();

Gọi getItemCode () sẽ không thể là không thể, nó sẽ chỉ đưa ra một lỗi.

Nhân vật điều khiển '@' bảo PHP bỏ qua cảnh báo. Nếu bạn đi vào trạng thái cảnh báo này, bạn sẽ nhận được một chuỗi trống (đó là những gì mã ternary của bạn đã sử dụng), vì vậy đó là một sự thay thế khá.

http://php.net/manual/en/language.operators.errorcontrol.php

Đã trả lời ngày 18 tháng 5 năm 2015 lúc 3:24May 18, 2015 at 3:24

fbasfbasfbas

1.6463 huy hiệu vàng16 Huy hiệu bạc26 Huy hiệu đồng3 gold badges16 silver badges26 bronze badges

5

Một cái gì đó sẽ như thế này tốt hơn?

if( empty( $itemCode ) )
{
// $itemCode is empty.
}else{
// Do Something
}

Đã trả lời ngày 18 tháng 5 năm 2015 lúc 3:24May 18, 2015 at 3:24

fbasfbas

$item = pickSpecificItemByType($type);

if( $item == '' )
    {
    // if $itemCode is empty.
    }else{
    // Do the stuff that you wanted to do if $item is not null
     $area->$item->getItemCode();
    }

1.6463 huy hiệu vàng16 Huy hiệu bạc26 Huy hiệu đồng

Một cái gì đó sẽ như thế này tốt hơn?May 18, 2015 at 3:28

Hướng dẫn php call method on null - phương thức gọi php trên null

Dễ dàng tối ưu hóa hiệu suất mã PHP trong sản xuất với Datadog APM. Cho phép các vấn đề về khả năng hiển thị và khắc phục sự cố nhanh hơn. Bắt đầu thử nghiệm miễn phí ngay hôm nay.

Nếu bạn đã sử dụng toán tử Null Coalescing trong quá khứ, có lẽ bạn cũng nhận thấy những thiếu sót của nó: Null Coalescing không hoạt động trên các cuộc gọi phương thức. Thay vào đó, bạn cần kiểm tra trung gian hoặc dựa vào người trợ giúp

$item = $area->pickSpecificItemByType($type);
$itemCode = ($item) ? $item->getItemCode() : '';
1 được cung cấp bởi một số khung:

$startDate = $booking->getStartDate();

$dateAsString = $startDate ? $startDate->asDateTimeString() : null;

Toán tử Nullsafe cung cấp chức năng tương tự như Null Coalescing, nhưng cũng hỗ trợ các cuộc gọi phương thức. Thay vì viết bài này:

$country =  null;
 
if ($session !== null) {
    $user = $session->user;
 
    if ($user !== null) {
        $address = $user->getAddress();
 
        if ($address !== null) {
            $country = $address->country;
        }
    }
}

Php 8 cho phép bạn viết bài này:

$country = $session?->user?->getAddress()?->country;

Chúng ta hãy xem những gì nhà điều hành mới này có thể và không thể làm!

# Nullsafe Toán tử chuyên sâu

Hãy bắt đầu bằng cách giải quyết câu hỏi quan trọng nhất: Chính xác thì sự khác biệt giữa toán tử kết hợp null và toán tử nullsafe là gì?

Hãy xem ví dụ này:

class Order
{
    public ?Invoice $invoice = null;
}

$order = new Order();

Ở đây chúng ta có một đối tượng

$item = $area->pickSpecificItemByType($type);
$itemCode = ($item) ? $item->getItemCode() : '';
2 có mối quan hệ tùy chọn với đối tượng
$item = $area->pickSpecificItemByType($type);
$itemCode = ($item) ? $item->getItemCode() : '';
3. Bây giờ hãy tưởng tượng chúng tôi muốn nhận số hóa đơn (nếu hóa đơn không phải là null). Bạn có thể làm điều này cả với nhà điều hành Null Coalescing và nhà điều hành Nullsafe:

$itemCode = (!is_null($area->pickSpecificItemByType($type))) ?
     $area->pickSpecificItemByType($type)->getItemCode() : '';
0

Vậy sự khác biệt là gì? Mặc dù bạn có thể sử dụng cả hai toán tử để đạt được kết quả tương tự trong ví dụ này, nhưng chúng cũng có các trường hợp cạnh cụ thể chỉ một trong số chúng có thể xử lý. Ví dụ: bạn có thể sử dụng toán tử Null Coalescing kết hợp với các phím mảng, trong khi toán tử Nullsafe không thể xử lý chúng:

$itemCode = (!is_null($area->pickSpecificItemByType($type))) ?
     $area->pickSpecificItemByType($type)->getItemCode() : '';
1
$itemCode = (!is_null($area->pickSpecificItemByType($type))) ?
     $area->pickSpecificItemByType($type)->getItemCode() : '';
2

Mặt khác, nhà điều hành Nullsafe có thể làm việc với các cuộc gọi phương thức, trong khi người vận hành Null kết hợp không thể. Hãy tưởng tượng một đối tượng

$item = $area->pickSpecificItemByType($type);
$itemCode = ($item) ? $item->getItemCode() : '';
3 như vậy:

$itemCode = (!is_null($area->pickSpecificItemByType($type))) ?
     $area->pickSpecificItemByType($type)->getItemCode() : '';
3

Bạn có thể sử dụng toán tử nullsafe để gọi

$item = $area->pickSpecificItemByType($type);
$itemCode = ($item) ? $item->getItemCode() : '';
5 vào ngày của hóa đơn, ngay cả khi đó là
$item = $area->pickSpecificItemByType($type);
$itemCode = ($item) ? $item->getItemCode() : '';
6:

$itemCode = (!is_null($area->pickSpecificItemByType($type))) ?
     $area->pickSpecificItemByType($type)->getItemCode() : '';
4

Trong khi người vận hành Null kết hợp sẽ gặp sự cố:

$itemCode = (!is_null($area->pickSpecificItemByType($type))) ?
     $area->pickSpecificItemByType($type)->getItemCode() : '';
5

# Ngắn mạch

Đôi khi bạn có thể sử dụng toán tử Null Coalescing hoặc Nullsafe và những lần khác bạn cần sử dụng một loại cụ thể. Sự khác biệt là toán tử nullsafe sử dụng một hình thức "ngắn mạch": Viết

$item = $area->pickSpecificItemByType($type);
$itemCode = ($item) ? $item->getItemCode() : '';
7 sẽ khiến PHP nhìn vào phía bên trái của toán tử này, nếu đó là
$item = $area->pickSpecificItemByType($type);
$itemCode = ($item) ? $item->getItemCode() : '';
6 thì phía bên phải sẽ bị loại bỏ. Nhà điều hành Null Coalescing thực sự là một cuộc gọi
$item = $area->pickSpecificItemByType($type);
$itemCode = ($item) ? $item->getItemCode() : '';
9 ngụy trang trên toán hạng tay trái của nó, không hỗ trợ ngắn mạch.

Thoong mạch cũng có nghĩa là khi viết một cái gì đó như thế này:

$itemCode = (!is_null($area->pickSpecificItemByType($type))) ?
     $area->pickSpecificItemByType($type)->getItemCode() : '';
6

$itemCode = @$area->pickSpecificItemByType($type)->getItemCode();
0 sẽ chỉ được thực thi nếu
$itemCode = @$area->pickSpecificItemByType($type)->getItemCode();
1 thực sự không phải là
$item = $area->pickSpecificItemByType($type);
$itemCode = ($item) ? $item->getItemCode() : '';
6.

# Các nhà khai thác nullsafe

Có thể làm tổ một số cuộc gọi của toán tử nullsafe như vậy:

$itemCode = (!is_null($area->pickSpecificItemByType($type))) ?
     $area->pickSpecificItemByType($type)->getItemCode() : '';
7

# Chỉ để đọc dữ liệu

Bạn không thể sử dụng toán tử nullsafe để ghi dữ liệu vào các đối tượng:

$itemCode = (!is_null($area->pickSpecificItemByType($type))) ?
     $area->pickSpecificItemByType($type)->getItemCode() : '';
8

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 những gì đang xảy ra trên blog này, bạn có thể theo dõi tôi trên Twitter hoặc đăng ký nhận bản tin của tôi:

Toán tử nullsafe chắc chắn là một mảnh ghép bị thiếu cuối cùng được thêm vào PHP. Với bản chất năng động của nó, cảm giác tốt khi có một cách đối phó suôn sẻ với

$item = $area->pickSpecificItemByType($type);
$itemCode = ($item) ? $item->getItemCode() : '';
6. Sự khác biệt và chồng chéo giữa toán tử nullsafe và toán tử kết hợp NULL lúc đầu cảm thấy hơi khó hiểu, nhưng tôi chắc chắn chúng ta sẽ quen với nó.

Chú thích

Đối phó với NULL

Nhà điều hành nullsafe rfc

Có gì mới trong Php 8

Php null có an toàn không?

Toán tử Null-Safe là một cú pháp mới trong PHP 8.0, cung cấp tính năng chuỗi tùy chọn cho PHP.Toán tử null-safe cho phép đọc giá trị của chuỗi giá trị trả về thuộc tính và phương thức, trong đó toán tử an toàn null-Safe SHORT-CIRCUTS Truy xuất nếu giá trị null, mà không gây ra lỗi nào.. The null-safe operator allows reading the value of property and method return value chaining, where the null-safe operator short-circuits the retrieval if the value is null , without causing any errors.

Làm thế nào để gọi một phương pháp trong PHP?

Hàm REFFectionMethod :: Gọi () là hàm sẵn có trong PHP được sử dụng để gọi phương thức phản xạ được chỉ định và trả về kết quả của phương thức.Tham số: Hàm này chấp nhận hai tham số được minh họa dưới đây: Đối tượng: Đây là đối tượng lớp khởi tạo.ReflectionMethod::invoke() function is an inbuilt function in PHP which is used to invoke the specified reflected method and returns the result of the method. Parameters: This function accepts two parameters which are illustrated below: object: This is the initialized class object.

Làm thế nào kiểm tra biến là NULL trong PHP?

Hàm is_null () kiểm tra xem một biến có null hay không.Hàm này trả về true (1) nếu biến là null, nếu không nó sẽ trả về sai/không có gì.is_null() function checks whether a variable is NULL or not. This function returns true (1) if the variable is NULL, otherwise it returns false/nothing.