Tôi không nghĩ có bất kỳ lợi thế hợp lý của việc sử dụng một stdClass trên một mảng miễn là mục đích duy nhất của bạn là để trả lại nhiều kiểu dữ liệu tùy ý từ một cuộc gọi chức năng.
Vì bạn không thể trả về nhiều giá trị một cách tự nhiên, bạn phải sử dụng vùng chứa có thể chứa tất cả các kiểu dữ liệu khác có sẵn trong PHP. Đó sẽ là một đối tượng hoặc một mảng.
function fn1() { return array(1,2); }
function fn2() { return array('one' => 1, 'two' => 2); }
function fn3() { return (object) array(1,2); }
function fn4() { return (object) array('one' => 1, 'two' => 2); }
Tất cả những điều trên sẽ hiệu quả. Mảng là một phần nhỏ không đáng kể nhanh hơn và ít hoạt động hơn. Nó cũng có một mục đích xác định rõ ràng trái ngược với stdClass chung (đó là một chút wishywashy, isnt nó). Cả hai chỉ có một giao diện ngầm, vì vậy bạn sẽ phải xem các tài liệu hoặc cơ quan chức năng để biết những gì chúng sẽ chứa. Nếu bạn muốn sử dụng các đối tượng bằng bất kỳ giá nào, bạn có thể sử dụng ArrayObject hoặc SplFixedArray, nhưng nếu bạn xem API của họ, bạn có cần chức năng của họ cho nhiệm vụ trả về nhiều giá trị ngẫu nhiên không? Không. Tôi không nghĩ vậy. Tuy nhiên, đừng hiểu sai về tôi: nếu bạn muốn sử dụng stdClass, hãy sử dụng nó. Nó không giống như nó sẽ phá vỡ bất cứ điều gì. Nhưng bạn cũng sẽ không đạt được gì cả. Để thêm ít nhất một số lợi ích, bạn có thể tạo một lớp riêng biệt có tên là ReturnValues cho việc này.
Có thể là một lớp gắn thẻ đơn giản
class ReturnValues {}
hoặc một cái gì đó thêm chức năng
class ReturnValues implements Countable
{
protected $values;
public function __construct() { $this->values = func_get_args(); }
public function __get($key) return $this->values[$key]; }
public function count() { return count($this->values); }
}
Cấp, nó không làm được gì nhiều và nhận được các giá trị ra khỏi nó vẫn thực hiện thông qua một giao diện implict , nhưng ít nhất lớp học có trách nhiệm được xác định rõ ràng hơn bây giờ. Bạn có thể mở rộng từ lớp này để tạo các đối tượng returnValue cho các hoạt động cụ thể và đưa ra những một giao diện rõ ràng:
class FooReturnValues extends ReturnValues
{
public function getFoo() { return $this->values['foo']; }
public function getBar() { return $this->values['foo']; }
}
Bây giờ các nhà phát triển chỉ có nhìn vào API để biết được nhiều giá trị foo() sẽ trở lại. Tất nhiên, phải viết các lớp ReturnValue cụ thể cho mỗi và mọi hoạt động có thể trả về nhiều giá trị có thể trở nên tẻ nhạt một cách nhanh chóng. Và cá nhân, tôi thấy điều này đã được overengineered cho mục đích ban đầu.
Dù sao, hy vọng có ý nghĩa gì.
xem: http://stackoverflow.com/questions/2056931/value-objects-vs-associative-arrays-in-php Nó không trả lời câu hỏi của tôi. Ông nói rằng một lớp "thực sự" sẽ là cách tiếp cận tốt nhất, mà (tôi nghĩ) tất cả chúng ta đều đồng ý. Tôi vẫn muốn biết "khi nào" việc sử dụng các giá trị trả về stdClass là tốt hơn so với mảng. – JonG
bạn có thể muốn làm rõ khái niệm về các đối tượng giá trị. [Trong DDD một đối tượng giá trị là không thay đổi] (http://domaindrivendesign.org/node/135) và mục đích là khá khác với [VO trong Java.] (Http://java.sun.com/j2ee/patterns/ ValueObject.html) – Gordon
@Gordon Ý tôi là, một hướng dẫn trả về "VO" giống với các chức năng. Có một VO là một đối tượng nhỏ (tốt), chỉ có những thuộc tính của anh ta là quan trọng, không phải là bản sắc của anh ta. Giới thiệu về các liên kết của bạn, bạn có đang cố gắng tìm hiểu xem liệu tôi (câu hỏi của tôi) các cuộc thảo luận về "VO nên không thay đổi Vs VO có thể thay đổi được" là quan trọng? Btw, ngày nay VO là TO (Transfer Objects) cho mặt trời. http://java.sun.com/blueprints/corej2eepatterns/Patterns/TransferObject.html – JonG