Trả lại $ này sau khi quan sát


27

Tôi thấy một số thông tin mâu thuẫn trên internet và trong các mô-đun của bên thứ 3 giống nhau - đó có phải là một yêu cầu hoặc thực tiễn tốt nhất để quay lại $thiskhi kết thúc phương thức quan sát viên?

Ví dụ:

MyCompany_Module_Model_Observer.php

public function salesOrderSaveAfter($observer){
    //do stuff
    return $this;
}

Câu trả lời:


30

Cốt lõi luôn return $this;nằm trong bối cảnh của các phương thức quan sát viên - nhưng thực tế không có lý do nào cho nó.

Truy tìm lại thông qua dispatchEvent()bạn sẽ tìm thấy phương thức chính gọi các phương thức quan sát viên (trong ./app/Core/Model/App.php)

protected function _callObserverMethod($object, $method, $observer)
{
    if (method_exists($object, $method)) {
        $object->$method($observer);
    } elseif (Mage::getIsDeveloperMode()) {
        Mage::throwException('Method "'.$method.'" is not defined in "'.get_class($object).'"');
    }
    return $this;
}

Nhưng không có giá trị trả về nào thực sự được sử dụng hoặc được tham chiếu để chuyển vào một người quan sát khác trong chuỗi.

Có lẽ Magento đã suy nghĩ lâu dài hơn để sử dụng nó như một số phương tiện để giữ lại / truyền dữ liệu trong thể hiện của $thislớp bên ngoài việc sử dụng các phiên / sổ đăng ký; hoặc nó có thể là mã di sản vừa bị mắc kẹt .

Tôi không thể thấy một lý do thuyết phục nào return $this- nhưng điều đó được nói, nếu họ làm điều đó trong cốt lõi, đó là những gì chúng ta làm.

Theo nguyên tắc chung, bất cứ điều gì cốt lõi làm - chúng tôi coi thực tiễn tốt nhất. Ngoại trừ những lỗi chính tả gây sốc :)


6
"Ukringlish" :-)
đánh dấu

Tôi xấu hổ khi thừa nhận rằng đôi khi tôi trả lại $ observer để thoát khỏi cảnh báo IDE về tham số không sử dụng ...
Daniel Sloof

@Daniel - chỉ không thêm param trong chữ ký người quan sát. PHP không bận tâm. Nhưng sau đó, một lần nữa, thông số thông qua có thể cần thiết trong tương lai.
nevvermind

7

$ this (ý định chơi chữ) được gọi là giao diện lưu loát. Nó cho phép bạn gọi nhiều phương thức trong một đối tượng mà không cần phải quay lại một biến đã xác định.


1
Cảm ơn bạn - Tôi hiểu giao diện trôi chảy. Tôi đang tìm kiếm một lý do thuyết phục để trở lại $thiskhi thực sự không sử dụng giao diện trôi chảy trên các quan sát viên.
philwinkle

1
@Kevin - Bạn không cần một giao diện lưu loát trong các quan sát viên của Mage. Không phải là tôi biết.
nevvermind

5

Đó chỉ là một quy ước Magento để luôn luôn trả về $thisthay vì void(không có gì) nếu một phương thức không có giá trị trả về nào khác, bất kể nó có thực sự được sử dụng cho giao diện trôi chảy ở bất cứ đâu hay không.

Ưu điểm là, bạn không cần phải suy nghĩ về việc nó có hữu ích hay không, và một giao diện lưu loát thừa sẽ tốt hơn so với giao diện còn thiếu. Ngoài ra, Magento có thể bắt đầu sử dụng chúng cho các nhà quan sát, mặc dù điều này rất khó xảy ra.


0

Một vài năm sau ... :)

Cốt lõi luôn trả về $ này; trong bối cảnh các phương thức quan sát - [...]

hoặc là

Đây chỉ là một quy ước Magento để luôn trả về $ this thay vì void (không có gì) nếu một phương thức không có giá trị trả về khác [...]

Không thực sự. Chỉ cần kiểm tra một số quan sát viên trong 1.9.3.x và nhiều người không trả về gì ( void). Vì vậy, nó không thực sự rõ ràng "mã lõi làm gì";)

Tôi cũng đã sử dụng $return $this;mã của mình, nhưng hôm nay - sẽ không có thay đổi nào trong mã M1 - tôi sẽ bỏ nó. Tôi nghĩ rằng - nếu tôi đọc mã của người khác - một voidphương thức rõ ràng hơn thì một phương pháp được thêm vào một cách mù quáng return $this, điều đó không bao giờ được sử dụng.


Chỉnh sửa:

Nếu sử dụng Aoe_Scheduler, bạn cũng có thể trả về một stringhoặc arrayđể hiển thị nó trong lịch sử cron.

nhập mô tả hình ảnh ở đây

Không thể tìm thấy bất kỳ tài liệu nào cho các tính năng này ... mã liên quan tại đây: https://github.com/AOEpeople/Aoe_Scheduler/blob/master/app/code/community/Aoe/Scheduler/Model/Schedule.php#L229- L259

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.