Hướng dẫn what is return $this in php? - return $ this trong php là gì?

Có nhiều kịch bản trong đó người ta có thể muốn trả lại $this từ một hàm, nhưng trường hợp phổ biến nhất là 'Chuỗi phương pháp'.

Ví dụ: trong một lớp trừu tượng SQL, bạn có thể có một đối tượng đại diện cho một truy vấn và sau đó gọi một loạt các phương thức trên đó để mở rộng nó. Xem xét mã sau:

$query = $database->select();
$query->from('users');
$query->whereEquals('username', $username);
$query->orderBy('username');
$query->limit(1);
$user = $query->executeSingleRow();

Nếu mỗi phương thức của ____ 8 trả về đối tượng truy vấn đã được sửa đổi, thay vào đó chúng ta có thể viết điều này như:

$user = $database
            ->select()
            ->from('users')
            ->whereEquals('username', $username)
            ->orderBy('username')
            ->limit(1)
            ->executeSingleRow();

Phiên bản thứ hai gần hơn với cách bạn viết một truy vấn SQL thực tế và nó hoạt động mà không giới thiệu biến EXTA $query.

PHP RFC: $ loại trả về này

  • Ngày: 2021-09-07

  • Tác giả: Nikita Popov

  • Trạng thái: Không hoạt động

  • Phiên bản mục tiêu: Php 8.2

Giới thiệu

Loại trả về tĩnh được giới thiệu trong PHP 8.0 cho phép chỉ định rằng một phương thức phải trả về một thể hiện của phạm vi liên kết tĩnh (LSB) muộn, thường là trường hợp của các hàm tạo được đặt tên, phương pháp Wither và API thông thạo. Tuy nhiên, API Fluent có một hợp đồng cụ thể hơn yêu cầu trả lại $this. RFC này giới thiệu loại trả về $this cho mục đích này.

Loại trả lại $this theo một quy ước được thiết lập từ PHPDOC, trong đó

$user = $database
            ->select()
            ->from('users')
            ->whereEquals('username', $username)
            ->orderBy('username')
            ->limit(1)
            ->executeSingleRow();
3 thường được sử dụng thay cho
$user = $database
            ->select()
            ->from('users')
            ->whereEquals('username', $username)
            ->orderBy('username')
            ->limit(1)
            ->executeSingleRow();
4 khi nói đến các giao diện trôi chảy. Trên một bộ dữ liệu gồm các gói nhà soạn nhạc 2K,
$user = $database
            ->select()
            ->from('users')
            ->whereEquals('username', $username)
            ->orderBy('username')
            ->limit(1)
            ->executeSingleRow();
3 xảy ra 29k lần, trong khi
$user = $database
            ->select()
            ->from('users')
            ->whereEquals('username', $username)
            ->orderBy('username')
            ->limit(1)
            ->executeSingleRow();
4 được sử dụng 38k lần.

Loại trả về $this được cho là không phải là một loại, trong đó không chỉ thực thi loại giá trị trả về (giống như

$user = $database
            ->select()
            ->from('users')
            ->whereEquals('username', $username)
            ->orderBy('username')
            ->limit(1)
            ->executeSingleRow();
8), mà còn là nhận dạng đối tượng của nó (của $this). Nhận dạng đối tượng rất quan trọng đối với việc sử dụng API, bởi vì nó xác định liệu giá trị trả về có thể bị loại bỏ một cách an toàn:

// Definitely valid if methods return $this type (fluent API).
// May not be valid if they only return static (may be wither API).
$obj->method1()
    ->method2()
    ->method3();
 
// Definitely valid if methods return $this or static type (fluent/wither irrelevant).
$obj = $obj->method1()
           ->method2()
           ->method3();

Do đó, ngay cả khi một phương thức sử dụng loại trả về

$user = $database
            ->select()
            ->from('users')
            ->whereEquals('username', $username)
            ->orderBy('username')
            ->limit(1)
            ->executeSingleRow();
8 gốc, hiện tại nó vẫn có thể phải chỉ định
$user = $database
            ->select()
            ->from('users')
            ->whereEquals('username', $username)
            ->orderBy('username')
            ->limit(1)
            ->executeSingleRow();
3 ngoài việc làm rõ hợp đồng API. Điều này đặc biệt phù hợp với các giao diện, trong đó điều này không chỉ xác định việc sử dụng hợp lệ mà còn thực hiện hợp lệ.

Ví dụ: Bộ nhớ cache của Symfony Chỉ định:

interface ItemInterface extends CacheItemInterface {
    // Other APIs omitted.
 
    /**
     * @return $this
     */
    public function tag(string|iterable $tags): static;
}

Theo RFC này, nó sẽ trở thành:

interface ItemInterface extends CacheItemInterface {
    public function tag(string|iterable $tags): $this;
}

Đề nghị

Loại $this mới chỉ có thể được sử dụng dưới dạng loại trả về, không phải là thuộc tính hoặc loại tham số, giống như

$user = $database
            ->select()
            ->from('users')
            ->whereEquals('username', $username)
            ->orderBy('username')
            ->limit(1)
            ->executeSingleRow();
8. Ngoài ra, nó chỉ có thể được áp dụng trong trường hợp phạm vi thể hiện (có khả năng) tồn tại, đó là các phương thức thể hiện và đóng không tĩnh. Nó không thể được áp dụng cho các hàm tự do, phương thức tĩnh và đóng tĩnh, vì chúng không bao giờ có thể có giá trị $this.

Một phương pháp có loại trả về $this là bắt buộc để trả lại $this, mặc dù nó không cần phải làm như vậy theo nghĩa đen. Sau đây là mã hợp pháp:

class Test {
    public function method(): $this {
        $that = $this;
        return $that;
    }
}

Loại $this là một kiểu con của

$user = $database
            ->select()
            ->from('users')
            ->whereEquals('username', $username)
            ->orderBy('username')
            ->limit(1)
            ->executeSingleRow();
8. Như vậy, có thể hạn chế loại
$user = $database
            ->select()
            ->from('users')
            ->whereEquals('username', $username)
            ->orderBy('username')
            ->limit(1)
            ->executeSingleRow();
8 thành $this trong một lớp con (nhưng không phải là cách khác):

class A {
    public function method1(): static {}
    public function method2(): $this {}
}
 
class B extends A {
    // This override is legal.
    public function method1(): $this {}
 
    // This override is illegal.
    public function method2(): static {}
}

Trong phản xạ, loại $this được biểu diễn dưới dạng

interface ItemInterface extends CacheItemInterface {
    // Other APIs omitted.
 
    /**
     * @return $this
     */
    public function tag(string|iterable $tags): static;
}
2 với
interface ItemInterface extends CacheItemInterface {
    // Other APIs omitted.
 
    /**
     * @return $this
     */
    public function tag(string|iterable $tags): static;
}
3 và
interface ItemInterface extends CacheItemInterface {
    // Other APIs omitted.
 
    /**
     * @return $this
     */
    public function tag(string|iterable $tags): static;
}
4.

Thay đổi lạc hậu không tương thích

Không có thay đổi tương thích ngược, vì $this không phải là tên lớp hợp lệ và không thể được sử dụng ở vị trí loại trước đây.

Mã sử ​​dụng

interface ItemInterface extends CacheItemInterface {
    // Other APIs omitted.
 
    /**
     * @return $this
     */
    public function tag(string|iterable $tags): static;
}
6 có thể cần được cập nhật để hỗ trợ loại $this mới.

Bỏ phiếu

Có không.

Có nghĩa là gì khi trả lại trong PHP?

Định nghĩa và sử dụng Từ khóa trả về kết thúc một hàm và, tùy chọn, sử dụng kết quả của một biểu thức làm giá trị trả về của hàm.Nếu trả về được sử dụng bên ngoài hàm, nó sẽ dừng mã PHP trong tệp đang chạy.ends a function and, optionally, uses the result of an expression as the return value of the function. If return is used outside of a function, it stops PHP code in the file from running.

Là gì :: vs

Nói một cách đơn giản, :: là cho các thuộc tính cấp lớp và-> là cho các thuộc tính cấp đối tượng.:: is for class-level properties, and -> is for object-level properties.

Làm thế nào tôi có thể trả về hai biến trong PHP?

PHP không hỗ trợ để trả về nhiều giá trị trong một hàm.Bên trong một hàm khi câu lệnh trả về đầu tiên được thực thi, nó sẽ điều khiển trực tiếp trở lại hàm gọi và câu lệnh trả về thứ hai sẽ không bao giờ được thực thi.. Inside a function when the first return statement is executed, it will direct control back to the calling function and second return statement will never get executed.

Làm thế nào tôi có thể trả lại hai mảng trong PHP?

Tính toán hàm PHP () {$ dt1 = mảng ('1', '2');$ dt2 = mảng ('1', '2');return mảng ($ dt1, $ dt2);} $ data = tính toán ();Đầu ra: print_r ($ data [0]);print_r ($ data [1]);?> Đầu ra Bạn sẽ nhận được dưới dạng hai mảng.